Exemplo n.º 1
0
        private void ValidateBalanced(BinManager manager, List <MachineId> locations)
        {
            var expectedLocationsPerBin = locations.Count > manager.LocationsPerBin
                ? manager.LocationsPerBin
                : locations.Count;

            var expectedBinsPerLocation = locations.Count >= manager.LocationsPerBin
                ? BinManager.NumberOfBins / locations.Count * manager.LocationsPerBin
                : BinManager.NumberOfBins;

            var binMappings = manager.GetBins();
            var counts      = new Dictionary <int, int>();

            foreach (var location in locations)
            {
                counts[location.Index] = 0;
            }

            foreach (var bin in binMappings)
            {
                bin.Length.Should().Be(expectedLocationsPerBin);

                foreach (var mapping in bin)
                {
                    counts[mapping.Index]++;
                }
            }

            foreach (var count in counts.Values)
            {
                count.Should().BeInRange((int)(expectedBinsPerLocation * .9), (int)(expectedBinsPerLocation * 1.1));
            }
        }
Exemplo n.º 2
0
        private void VerifyMappingsAreEqual(BinManager x, BinManager y)
        {
            var xBins = x.GetBins();
            var yBins = y.GetBins();

            var xExpired = x.GetExpiredAssignments();
            var yExpired = y.GetExpiredAssignments();

            xBins.Length.Should().Be(yBins.Length);
            for (var bin = 0; bin < xBins.Length; bin++)
            {
                xBins[bin].Length.Should().Be(yBins[bin].Length);
                for (var mapping = 0; mapping < xBins[bin].Length; mapping++)
                {
                    xBins[bin][mapping].Index.Should().Be(yBins[bin][mapping].Index);
                }
            }

            xExpired.Count.Should().Be(yExpired.Count);
            foreach (var bin in xExpired.Keys)
            {
                var xBinExpired = xExpired[bin];
                var yBinExpired = yExpired[bin];
                xBinExpired.Count.Should().Be(yBinExpired.Count);

                foreach (var machine in xBinExpired.Keys)
                {
                    xBinExpired[machine].Should().Be(yBinExpired[machine]);
                }
            }
        }
Exemplo n.º 3
0
        private void RemoveLocationsAndValidate(BinManager manager, List <MachineId> locations, int locationsToRemove)
        {
            for (var i = 0; i < locationsToRemove; i++)
            {
                var locationToRemove = locations[0];

                var binsWithMachineAssigned = manager.GetBins(force: true)
                                              .Select((machines, bin) => (machines, bin))
                                              .Where(t => t.machines.Contains(locationToRemove))
                                              .Select(t => (uint)t.bin)
                                              .ToHashSet();

                var chain = manager.EnumeratePreviousBins(0).Take(30).Select(b => (b, binsWithMachineAssigned.Contains(b))).ToList();

                locations.Remove(locationToRemove);
                manager.RemoveLocation(locationToRemove);

                ValidateBalanced(manager, locations);

                foreach (var binWithMachineAssigned in binsWithMachineAssigned)
                {
                    var assignedMachines            = manager.GetDesignatedLocations(binWithMachineAssigned, includeExpired: false);
                    var assignedMachinesWithExpired = manager.GetDesignatedLocations(binWithMachineAssigned, includeExpired: true);

                    assignedMachines.Should().NotContain(locationToRemove);
                    assignedMachinesWithExpired.Should().Contain(locationToRemove);
                }
            }
        }