- // 2. Reply false if log doesn’t contain an entry at prevLogIndex
- // whose term matches prevLogTerm (§5.3)
- ReplicatedLogEntry previousEntry = context.getReplicatedLog()
- .get(appendEntries.getPrevLogIndex());
-
- if(previousEntry == null || previousEntry.getTerm() != appendEntries.getPrevLogTerm()){
- sender.tell(new AppendEntriesReply(currentTerm(), false), actor());
- return state();
- }
-
- if(appendEntries.getEntries() != null) {
- // 3. If an existing entry conflicts with a new one (same index
- // but different terms), delete the existing entry and all that
- // follow it (§5.3)
- int addEntriesFrom = 0;
- for (int i = 0;
- i < appendEntries.getEntries().size(); i++, addEntriesFrom++) {
- ReplicatedLogEntry newEntry = context.getReplicatedLog()
- .get(i + 1);
-
- if (newEntry != null && newEntry.getTerm() == appendEntries.getEntries().get(i).getTerm()){
- break;
- }
- if (newEntry != null && newEntry.getTerm() != appendEntries
- .getEntries().get(i).getTerm()) {
- context.getReplicatedLog().removeFrom(i + 1);
- break;
- }
- }
-
- // 4. Append any new entries not already in the log
- for (int i = addEntriesFrom;
- i < appendEntries.getEntries().size(); i++) {
- context.getReplicatedLog()
- .append(appendEntries.getEntries().get(i));
- }
- }
-
-
- // 5. If leaderCommit > commitIndex, set commitIndex =
- // min(leaderCommit, index of last new entry)
- context.setCommitIndex(Math.min(appendEntries.getLeaderCommit(),
- context.getReplicatedLog().last().getIndex()));
-
- // If commitIndex > lastApplied: increment lastApplied, apply
- // log[lastApplied] to state machine (§5.3)
- if (appendEntries.getLeaderCommit() > context.getLastApplied()) {
- applyLogToStateMachine(appendEntries.getLeaderCommit());
- }
-
- sender.tell(new AppendEntriesReply(currentTerm(), true), actor());