Exemple #1
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);
                }
            }
        }
Exemple #2
0
        public async Task StressTestForSerializationAsync()
        {
            var startLocations    = Enumerable.Range(1, 10).Select(i => new MachineId(i)).ToArray();
            var locationsToRemove = Enumerable.Range(1, 5).Select(i => new MachineId(i)).ToArray();

            for (var repetition = 0; repetition < 10; repetition++)
            {
                var manager = new BinManager(locationsPerBin: 3, startLocations, _clock, expiryTime: TimeSpan.FromSeconds(1));

                var tasks      = locationsToRemove.Select(i => Task.Run(() => manager.RemoveLocation(i))).ToArray();
                var serialized = manager.Serialize();
                BinManager.CreateFromSerialized(serialized, locationsPerBin: 3, _clock, TimeSpan.FromSeconds(1)); // We want to make sure that deserialization does not fail.
                await Task.WhenAll(tasks);
            }
        }