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); } } }
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); } }