public void PrioritizeDesignatedLocations() { var amountMachines = 10; var designatedLocations = 3; var settings = new MachineList.Settings() { DeprioritizeMaster = false, PrioritizeDesignatedLocations = true, Randomize = false }; var(machineList, clusterState, tracker, machines) = Setup(settings, amountMachines, designatedLocations); for (var i = 0; i < designatedLocations; i++) { clusterState.TryResolveMachineId(machineList[i], out var id).Should().BeTrue(); clusterState.IsDesignatedLocation(id, TestHash, includeExpired: false).Should().BeTrue(); } for (var i = designatedLocations; i < amountMachines; i++) { clusterState.TryResolveMachineId(machineList[i], out var id).Should().BeTrue(); clusterState.IsDesignatedLocation(id, TestHash, includeExpired: false).Should().BeFalse(); } }
public void SortsUsingReputation() { var amountMachines = 10; var settings = new MachineList.Settings() { DeprioritizeMaster = false, PrioritizeDesignatedLocations = false, Randomize = false }; var(machineList, clusterState, tracker, machines) = Setup(settings, amountMachines, designatedLocations: 3); foreach (var machine in machines) { tracker.ReportReputation(machine.Location, MachineReputation.Missing); } tracker.ReportReputation(machines[0].Location, MachineReputation.Bad); tracker.ReportReputation(machines[amountMachines - 1].Location, MachineReputation.Good); machineList[0].Should().Be(machines[amountMachines - 1].Location); machineList[amountMachines - 1].Should().Be(machines[0].Location); for (var i = 1; i < amountMachines - 1; i++) { machineList[i].Should().Be(machines[i].Location); } }
public void CombineRulesWithRandomization() { var amountMachines = 10; var designatedLocations = 3; var settings = new MachineList.Settings() { DeprioritizeMaster = true, PrioritizeDesignatedLocations = true, Randomize = true }; var(machineList, clusterState, tracker, machines) = Setup(settings, amountMachines, designatedLocations); // Bad reputation for half of the machines. for (var i = 1; i < amountMachines / 2; i++) { tracker.ReportReputation(machines[i].Location, MachineReputation.Bad); } // Master should be moved to the back. machineList[amountMachines - 1].Should().Be(machines[0].Location); // Designated locations should be pulled to the front. for (var i = 0; i < designatedLocations; i++) { clusterState.TryResolveMachineId(machineList[i], out var id).Should().BeTrue(); clusterState.IsDesignatedLocation(id, TestHash, includeExpired: false).Should().BeTrue(); } for (var i = designatedLocations; i < amountMachines; i++) { clusterState.TryResolveMachineId(machineList[i], out var id).Should().BeTrue(); clusterState.IsDesignatedLocation(id, TestHash, includeExpired: false).Should().BeFalse(); } // Others should be ordered by reputation var lastReputation = -1; for (var i = designatedLocations; i < amountMachines - 1; i++) { var reputation = (int)tracker.GetReputation(machineList[i]); reputation.Should().BeGreaterOrEqualTo(lastReputation); lastReputation = reputation; } }
public void DeprioritizeMaster() { var amountMachines = 10; var designatedLocations = 3; var settings = new MachineList.Settings() { DeprioritizeMaster = true, PrioritizeDesignatedLocations = false, Randomize = false }; var(machineList, clusterState, tracker, machines) = Setup(settings, amountMachines, designatedLocations); // Master should be moved to the back. machineList[amountMachines - 1].Should().Be(machines[0].Location); for (var i = 0; i < amountMachines - 1; i++) { machineList[i].Should().Be(machines[i + 1].Location); } }
private (MachineList, ClusterState, MachineReputationTracker, MachineMapping[]) Setup(MachineList.Settings settings, int amountMachines, int designatedLocations) { var context = new Context(Logger); var machines = Enumerable.Range(1, amountMachines).Select(n => (ushort)n).ToArray(); var machineIdSet = new ArrayMachineIdSet(machines); var machineMappings = machines.Select(m => new MachineMapping(new MachineLocation(m.ToString()), new MachineId(m))).ToArray(); var clusterState = new ClusterState(primaryMachineId: default, machineMappings);