use of org.apache.ratis.server.impl.RetryCache in project incubator-ratis by apache.
the class TestSegmentedRaftLog method testAppendEntriesWithInconsistency.
/**
* Test append with inconsistent entries
*/
@Test
public void testAppendEntriesWithInconsistency() throws Exception {
// prepare the log for truncation
List<SegmentRange> ranges = prepareRanges(5, 200, 0);
List<LogEntryProto> entries = prepareLogEntries(ranges, null);
RaftServerImpl server = mock(RaftServerImpl.class);
RetryCache retryCache = RetryCacheTestUtil.createRetryCache();
when(server.getRetryCache()).thenReturn(retryCache);
doCallRealMethod().when(server).failClientRequest(any(LogEntryProto.class));
try (SegmentedRaftLog raftLog = new SegmentedRaftLog(peerId, server, storage, -1, properties)) {
raftLog.open(RaftServerConstants.INVALID_LOG_INDEX, null);
entries.stream().forEach(entry -> RetryCacheTestUtil.createEntry(retryCache, entry));
// append entries to the raftlog
entries.stream().map(raftLog::appendEntry).forEach(CompletableFuture::join);
}
// append entries whose first 100 entries are the same with existing log,
// and the next 100 are with different term
SegmentRange r1 = new SegmentRange(550, 599, 2, false);
SegmentRange r2 = new SegmentRange(600, 649, 3, false);
SegmentRange r3 = new SegmentRange(650, 749, 10, false);
List<LogEntryProto> newEntries = prepareLogEntries(Arrays.asList(r1, r2, r3), null);
try (SegmentedRaftLog raftLog = new SegmentedRaftLog(peerId, server, storage, -1, properties)) {
raftLog.open(RaftServerConstants.INVALID_LOG_INDEX, null);
raftLog.append(newEntries.toArray(new LogEntryProto[newEntries.size()])).forEach(CompletableFuture::join);
checkFailedEntries(entries, 650, retryCache);
checkEntries(raftLog, entries, 0, 650);
checkEntries(raftLog, newEntries, 100, 100);
Assert.assertEquals(newEntries.get(newEntries.size() - 1), getLastEntry(raftLog));
Assert.assertEquals(newEntries.get(newEntries.size() - 1).getIndex(), raftLog.getLatestFlushedIndex());
}
// load the raftlog again and check
try (SegmentedRaftLog raftLog = new SegmentedRaftLog(peerId, server, storage, -1, properties)) {
raftLog.open(RaftServerConstants.INVALID_LOG_INDEX, null);
checkEntries(raftLog, entries, 0, 650);
checkEntries(raftLog, newEntries, 100, 100);
Assert.assertEquals(newEntries.get(newEntries.size() - 1), getLastEntry(raftLog));
Assert.assertEquals(newEntries.get(newEntries.size() - 1).getIndex(), raftLog.getLatestFlushedIndex());
RaftLogCache cache = raftLog.getRaftLogCache();
Assert.assertEquals(5, cache.getNumOfSegments());
}
}
Aggregations