コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
        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);