in ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java [1712:1743]
private long checkInconsistentAppendEntries(TermIndex previous, List<LogEntryProto> entries) {
// Check if a snapshot installation through state machine is in progress.
final long installSnapshot = snapshotInstallationHandler.getInProgressInstallSnapshotIndex();
if (installSnapshot != RaftLog.INVALID_LOG_INDEX) {
LOG.info("{}: Failed appendEntries as snapshot ({}) installation is in progress", getMemberId(), installSnapshot);
return state.getNextIndex();
}
// Check that the first log entry is greater than the snapshot index in the latest snapshot and follower's last
// committed index. If not, reply to the leader the new next index.
if (entries != null && !entries.isEmpty()) {
final long firstEntryIndex = entries.get(0).getIndex();
final long snapshotIndex = state.getSnapshotIndex();
final long commitIndex = state.getLog().getLastCommittedIndex();
final long nextIndex = Math.max(snapshotIndex, commitIndex);
if (nextIndex > RaftLog.INVALID_LOG_INDEX && nextIndex >= firstEntryIndex) {
LOG.info("{}: Failed appendEntries as the first entry (index {})" +
" already exists (snapshotIndex: {}, commitIndex: {})",
getMemberId(), firstEntryIndex, snapshotIndex, commitIndex);
return nextIndex + 1;
}
}
// Check if "previous" is contained in current state.
if (previous != null && !(appendLogTermIndices.contains(previous) || state.containsTermIndex(previous))) {
final long replyNextIndex = Math.min(state.getNextIndex(), previous.getIndex());
LOG.info("{}: Failed appendEntries as previous log entry ({}) is not found", getMemberId(), previous);
return replyNextIndex;
}
return RaftLog.INVALID_LOG_INDEX;
}