public static async Task Appending() { IPersistentState auditTrail = new InMemoryAuditTrail(); Equal(0, auditTrail.GetLastIndex(false)); Equal(0, auditTrail.GetLastIndex(true)); var entry1 = new LogEntry("SET X=0") { Term = 1 }; var entry2 = new LogEntry("SET Y=0") { Term = 2 }; Equal(1, await auditTrail.AppendAsync(new[] { entry1, entry2 })); Equal(0, auditTrail.GetLastIndex(true)); Equal(2, auditTrail.GetLastIndex(false)); var entries = await auditTrail.GetEntriesAsync(1, 2); Equal(2, entries.Count); entry1 = (LogEntry)entries[0]; entry2 = (LogEntry)entries[1]; Equal("SET X=0", entry1.Content); Equal("SET Y=0", entry2.Content); //now replace entry at index 2 with new entry entry2 = new LogEntry("ADD") { Term = 3 }; Equal(2, await auditTrail.AppendAsync(new[] { entry2 }, 2)); entries = await auditTrail.GetEntriesAsync(1, 2); Equal(2, entries.Count); entry1 = (LogEntry)entries[0]; entry2 = (LogEntry)entries[1]; Equal("SET X=0", entry1.Content); Equal("ADD", entry2.Content); Equal(2, auditTrail.GetLastIndex(false)); Equal(0, auditTrail.GetLastIndex(true)); //commit all entries using (var detector = new CommitDetector()) { auditTrail.Committed += detector.OnCommitted; Equal(2, await auditTrail.CommitAsync(1)); await detector.Wait(); Equal(2, auditTrail.GetLastIndex(true)); Equal(2, detector.Count); } }
public static async Task Appending() { IPersistentState auditTrail = new InMemoryAuditTrail(); Equal(0, auditTrail.GetLastIndex(false)); Equal(0, auditTrail.GetLastIndex(true)); var entry1 = new TestLogEntry("SET X=0") { Term = 1 }; var entry2 = new TestLogEntry("SET Y=0") { Term = 2 }; Equal(1, await auditTrail.AppendAsync(new LogEntryList(entry1, entry2))); Equal(0, auditTrail.GetLastIndex(true)); Equal(2, auditTrail.GetLastIndex(false)); Func <IReadOnlyList <IRaftLogEntry>, long?, ValueTask> checker = (entries, snapshotIndex) => { Equal(2, entries.Count); var e1 = (TestLogEntry)entries[0]; var e2 = (TestLogEntry)entries[1]; Equal("SET X=0", e1.Content); Equal("SET Y=0", e2.Content); return(default);