From 1e8c4ac81392d39b2a9b37dcbedffc6bc6446446 Mon Sep 17 00:00:00 2001 From: Gary Wu Date: Fri, 15 Jan 2016 11:31:48 -0800 Subject: [PATCH] Bug in AbstractLeader replication consensus In determining whether to advance the commit index, only the voting members should be counted in the replicatedCount. There was a logic error that instead caused it to be incorrectly based on whether the AppendEntriesReply message as sent by a voting member. This patch fixes the issue. Change-Id: I6efb9574c39db608351297fc2552689d1ff77979 Signed-off-by: Gary Wu --- .../controller/cluster/raft/behaviors/AbstractLeader.java | 3 ++- .../controller/cluster/raft/behaviors/LeaderTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java index 31ee9d2a7a..3c2dc66ee8 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/behaviors/AbstractLeader.java @@ -254,7 +254,8 @@ public abstract class AbstractLeader extends AbstractRaftActorBehavior { int replicatedCount = 1; for (FollowerLogInformation info : followerToLog.values()) { - if ((info.getMatchIndex() >= N) && (context.getPeerInfo(followerId).isVoting())) { + final PeerInfo peerInfo = context.getPeerInfo(info.getId()); + if(info.getMatchIndex() >= N && (peerInfo != null && peerInfo.isVoting())) { replicatedCount++; } } diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/LeaderTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/LeaderTest.java index 0733ad5479..26e5b7bffa 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/LeaderTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/behaviors/LeaderTest.java @@ -1999,7 +1999,7 @@ public class LeaderTest extends AbstractLeaderTest { MessageCollectorActor.assertNoneMatching(leaderActor, ApplyState.class, 500); // Send reply from the voting follower and verify consensus. - leader.handleMessage(leaderActor, new AppendEntriesReply(FOLLOWER_ID, 1, true, 0, 1, (short)0)); + leader.handleMessage(leaderActor, new AppendEntriesReply(FOLLOWER_ID, 1, true, 1, 1, (short)0)); MessageCollectorActor.expectFirstMatching(leaderActor, ApplyState.class); } -- 2.36.6