You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ratis.apache.org by "Lokesh Jain (Jira)" <ji...@apache.org> on 2019/11/08 08:30:00 UTC

[jira] [Created] (RATIS-748) Follower might not update its commit index

Lokesh Jain created RATIS-748:
---------------------------------

             Summary: Follower might not update its commit index
                 Key: RATIS-748
                 URL: https://issues.apache.org/jira/browse/RATIS-748
             Project: Ratis
          Issue Type: Bug
            Reporter: Lokesh Jain


While updating the commit index, the follower checks whether majority index is present in the raft log. There can be cases where leader is ahead of the follower and follower does not have the entry corresponding to the majorityIndex. In such cases the follower commit index is not updated. Below is the corresponding code snippet.
{code:java}
public boolean updateLastCommitted(long majorityIndex, long currentTerm) {
  try(AutoCloseableLock writeLock = writeLock()) {
    final long oldCommittedIndex = getLastCommittedIndex();
    if (oldCommittedIndex < majorityIndex) {
      // Only update last committed index for current term. See §5.4.2 in
      // paper for details.
      final TermIndex entry = getTermIndex(majorityIndex);
      if (entry != null && entry.getTerm() == currentTerm) {
        final long newCommitIndex = Math.min(majorityIndex, getFlushIndex());
        if (newCommitIndex > oldCommittedIndex) {
          commitIndex.updateIncreasingly(newCommitIndex, traceIndexChange);
        }
        return true;
      }
    }
  }
  return false;
}{code}
This function RaftLog#updateLastCommitted is also used by follower to update its commit index. The follower does not require the check of entry.getTerm() == currentTerm. It has already verified the entries in the appendEntriesAsync call.

This can lead to the follower commit being updated in bursts and can lead to failure of watch requests.

cc [~shashikant] [~szetszwo]



--
This message was sent by Atlassian Jira
(v8.3.4#803005)