Esempio n. 1
0
        public void RegisterMachineEmitsIdsInSequence()
        {
            var       clusterState = new ClusterStateMachine();
            var       nowUtc       = _clock.UtcNow;
            MachineId machineId;

            (clusterState, machineId) = clusterState.RegisterMachine(new MachineLocation("node1"), nowUtc);
            machineId.Index.Should().Be(1);

            (_, machineId) = clusterState.RegisterMachine(new MachineLocation("node2"), nowUtc);
            machineId.Index.Should().Be(2);
        }
Esempio n. 2
0
        public void RegisterMachineTransitionTests()
        {
            var clusterState = new ClusterStateMachine();
            var nowUtc       = _clock.UtcNow;

            // During transition, all machines will be added forcefully without regard for the consistency of the data
            // structure
            clusterState = clusterState.ForceRegisterMachine(new MachineId(3), MachineLocation.Create("A", 0), nowUtc);
            clusterState.NextMachineId.Should().Be(4);

            clusterState = clusterState.ForceRegisterMachine(new MachineId(8), MachineLocation.Create("B", 0), nowUtc);
            clusterState.NextMachineId.Should().Be(9);

            clusterState = clusterState.ForceRegisterMachine(new MachineId(16), MachineLocation.Create("C", 0), nowUtc);
            clusterState.NextMachineId.Should().Be(17);

            clusterState = clusterState.ForceRegisterMachine(new MachineId(20), MachineLocation.Create("D", 0), nowUtc);
            clusterState.NextMachineId.Should().Be(21);

            clusterState = clusterState.ForceRegisterMachine(new MachineId(23), MachineLocation.Create("D", 0), nowUtc);
            clusterState.NextMachineId.Should().Be(24);

            // After transition, adding proceeds as usual, by appending to the end basically
            MachineId n1Id;

            (clusterState, n1Id) = clusterState.RegisterMachine(MachineLocation.Create("Machine Gets Added After Transition", 0), nowUtc);
            n1Id.Index.Should().Be(24);
            clusterState.NextMachineId.Should().Be(25);
        }
Esempio n. 3
0
        public void HeartbeatDoesntChangeRecomputeTime()
        {
            var       clusterState = new ClusterStateMachine();
            MachineId n1Id;

            (clusterState, n1Id) = clusterState.RegisterMachine(new MachineLocation("node1"), _clock.UtcNow);

            _clock.Increment(TimeSpan.FromMinutes(1));
            clusterState = clusterState.Heartbeat(n1Id, _clock.UtcNow, MachineState.Open).ThrowIfFailure().Next;

            clusterState.LastStateMachineRecomputeTimeUtc.Should().Be(DateTime.MinValue);
        }
Esempio n. 4
0
        public void HeartbeatKeepsOtherRecordsAsIs()
        {
            var clusterState = new ClusterStateMachine();
            var nowUtc       = _clock.UtcNow;

            MachineId n1Id;

            (clusterState, n1Id) = clusterState.RegisterMachine(new MachineLocation("node1"), nowUtc);

            MachineId n2Id;

            (clusterState, n2Id) = clusterState.RegisterMachine(new MachineLocation("node2"), nowUtc);

            _clock.Increment(TimeSpan.FromMinutes(1));
            clusterState = clusterState.Heartbeat(n1Id, _clock.UtcNow, MachineState.Closed).ThrowIfFailure().Next;

            var r = clusterState.GetStatus(n2Id).ShouldBeSuccess().Value;

            r.LastHeartbeatTimeUtc.Should().Be(nowUtc);
            r.State.Should().Be(MachineState.Open);
        }
Esempio n. 5
0
        public void HeartbeatUpdatesLastHeartbeatTimeAndState()
        {
            var       clusterState = new ClusterStateMachine();
            MachineId machineId;

            (clusterState, machineId) = clusterState.RegisterMachine(new MachineLocation("node1"), _clock.UtcNow);

            _clock.Increment(TimeSpan.FromMinutes(1));
            clusterState = clusterState.Heartbeat(machineId, _clock.UtcNow, MachineState.Open).ThrowIfFailure().Next;

            var r = clusterState.GetStatus(machineId).ShouldBeSuccess().Value;

            r.LastHeartbeatTimeUtc.Should().Be(_clock.UtcNow);
            r.State.Should().Be(MachineState.Open);
        }
Esempio n. 6
0
        public void RegisterNewMachineUsesCorrectDefaults()
        {
            var       clusterState = new ClusterStateMachine();
            var       nowUtc       = _clock.UtcNow;
            MachineId machineId;

            var machineLocation = new MachineLocation("node1");

            (clusterState, machineId) = clusterState.RegisterMachine(machineLocation, nowUtc);
            machineId.Index.Should().Be(MachineId.MinValue);

            var record = clusterState.GetStatus(machineId).ThrowIfFailure();

            record.Should().BeEquivalentTo(new MachineRecord()
            {
                Id                   = new MachineId(MachineId.MinValue),
                Location             = machineLocation,
                State                = ClusterStateMachine.InitialState,
                LastHeartbeatTimeUtc = nowUtc,
            });
        }