Exemplo n.º 1
0
        public async Task RunsErrandsForLogs()
        {
            var leaderId = Guid.NewGuid();

            _server = new DefaultRaftServer(_sister, _sister, _sister, _maqina.Object, _manijer.Object, _settings);
            _server.Start();

            // has to be done - otherwise it becomes a candidate
            _server.LastHeartBeat     = new AlwaysRecentTimestamp();
            _server.LastHeartBeatSent = new AlwaysRecentTimestamp();

            var currentPosition = 0;
            var term            = 2;

            for (int i = 0; i < 10; i++)
            {
                var entries = GetSomeRandomEntries();
                await _server.AppendEntriesAsync(new AppendEntriesRequest()
                {
                    CurrentTerm       = term,
                    Entries           = entries,
                    LeaderCommitIndex = currentPosition + entries.Length,
                    LeaderId          = leaderId,
                    PreviousLogIndex  = currentPosition - 1,
                    PreviousLogTerm   = term
                });

                currentPosition += entries.Length;
            }

            Assert.Equal(currentPosition - 1, _sister.LastIndex);
            Assert.Equal(Role.Follower, _server.Role);
        }
Exemplo n.º 2
0
        public async Task KeepFeedingAFollowerAndNeverDreamsOfPower()
        {
            var t        = new CancellationTokenSource();
            var leaderId = Guid.NewGuid();

            _server = new DefaultRaftServer(_sister, _sister, _sister, _maqina.Object, _manijer.Object, _settings);
            _server.Start();

            // to set the term to 1
            await _server.AppendEntriesAsync(new AppendEntriesRequest()
            {
                CurrentTerm       = 1,
                Entries           = new byte[0][],
                LeaderCommitIndex = 20,
                LeaderId          = leaderId,
                PreviousLogIndex  = -1,
                PreviousLogTerm   = 0
            });

            _server.LastHeartBeat     = new AlwaysRecentTimestamp();
            _server.LastHeartBeatSent = new AlwaysRecentTimestamp();

            TheTrace.TraceInformation("OK, now this is before wait...");
            Thread.Sleep(1000);
            TheTrace.TraceInformation("Wait finished.");
            Assert.Equal(1, _server.State.CurrentTerm);
            TheTrace.TraceInformation("Checked Term.");
            Assert.Equal(Role.Follower, _server.Role);
            TheTrace.TraceInformation("Checked Role.");
            t.Cancel();
        }
Exemplo n.º 3
0
        public async Task CreatesSnapshotAsAFollower()
        {
            var leaderId = Guid.NewGuid();

            _settings.MinSnapshottingIndexInterval = 10L;
            _server = new DefaultRaftServer(_sister, _sister, _sister, _maqina.Object, _manijer.Object, _settings);
            _server.LastHeartBeat     = new AlwaysRecentTimestamp();
            _server.LastHeartBeatSent = new AlwaysRecentTimestamp();
            _server.Start();

            var term    = 1;
            var count   = 15L;
            var entry   = new byte[122];
            var entries = new [] { entry };

            for (int i = 0; i < count; i++)
            {
                await _server.AppendEntriesAsync(new AppendEntriesRequest()
                {
                    CurrentTerm       = term,
                    Entries           = entries,
                    LeaderCommitIndex = i - 1,
                    LeaderId          = leaderId,
                    PreviousLogIndex  = i - 1,
                    PreviousLogTerm   = term
                });
            }

            Thread.Sleep(1000); // must be a leader by now
            Assert.Equal(Role.Follower, _server.Role);
            Snapshot ss;

            Assert.True(_server.SnapshotOperator.TryGetLastSnapshot(out ss));
            Assert.Equal(count - 2, ss.LastIncludedIndex); // last index is 14 and PreviousLogIndex is set to i-1 => 13
            Assert.Equal(term, ss.LastIncludedTerm);
            Assert.Equal(count - 1, _server.LogPersister.LogOffset);
        }