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