From: Tom Pantelis Date: Tue, 26 Jan 2016 15:18:31 +0000 (-0500) Subject: Add raftVersion field to AppendEntriesReply X-Git-Tag: release/boron~386 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=224aa4f574c63576961dc9dc37e075e2e5096a5a Add raftVersion field to AppendEntriesReply Added a raftVersion field to AppendEntriesReply and modified AbstractLeader to store the raftVersion in the FollowerLogInformation. This will enable sending the appropriate serialized version for subsequent messages sent to the follower. The raftVersion in the FollowerLogInformation is initialized to 0 (HELIUM_VERSION) so we assume the oldest version for backwards compatibility until we get the first AppendEntriesReply with the follower's actual version. Since we're adding a new field to AppendEntriesReply this won't break backwards compatibility as Java serialization handles that. The raftVersion will be set to 0 if sent from a pre-boron version. Change-Id: I4519c4f314674840f2578848b2888c3e8467dd21 Signed-off-by: Tom Pantelis --- diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformation.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformation.java index 6618a97f21..4367a7a151 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformation.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformation.java @@ -108,4 +108,14 @@ public interface FollowerLogInformation { * Sets the payload data version of the follower. */ void setPayloadVersion(short payloadVersion); + + /** + * @return the raft version of the follower. + */ + short getRaftVersion(); + + /** + * Sets the raft version of the follower. + */ + void setRaftVersion(short payloadVersion); } diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java index 1c8d5e6e10..8988446212 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/FollowerLogInformationImpl.java @@ -27,6 +27,12 @@ public class FollowerLogInformationImpl implements FollowerLogInformation { private short payloadVersion = -1; + // Assume the HELIUM_VERSION version initially for backwards compatibility until we obtain the follower's + // actual version via AppendEntriesReply. Although we no longer support the Helium version, a pre-Boron + // follower will not have the version field in AppendEntriesReply so it will be set to 0 which is + // HELIUM_VERSION. + private short raftVersion = RaftVersions.HELIUM_VERSION; + private final PeerInfo peerInfo; public FollowerLogInformationImpl(PeerInfo peerInfo, long matchIndex, RaftActorContext context) { @@ -153,6 +159,16 @@ public class FollowerLogInformationImpl implements FollowerLogInformation { this.payloadVersion = payloadVersion; } + @Override + public short getRaftVersion() { + return raftVersion; + } + + @Override + public void setRaftVersion(short raftVersion) { + this.raftVersion = raftVersion; + } + @Override public String toString() { return "FollowerLogInformationImpl [id=" + getId() + ", nextIndex=" + nextIndex + ", matchIndex=" + matchIndex diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftVersions.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftVersions.java index 4330a4caa0..9c70cf9c45 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftVersions.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/RaftVersions.java @@ -13,5 +13,6 @@ package org.opendaylight.controller.cluster.raft; public interface RaftVersions { short HELIUM_VERSION = 0; short LITHIUM_VERSION = 1; - short CURRENT_VERSION = LITHIUM_VERSION; + short BORON_VERSION = 3; + short CURRENT_VERSION = BORON_VERSION; } 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 2b94eb312b..7f3589c82f 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 @@ -211,6 +211,7 @@ public abstract class AbstractLeader extends AbstractRaftActorBehavior { followerLogInformation.markFollowerActive(); followerLogInformation.setPayloadVersion(appendEntriesReply.getPayloadVersion()); + followerLogInformation.setRaftVersion(appendEntriesReply.getRaftVersion()); boolean updated = false; if (appendEntriesReply.isSuccess()) { diff --git a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntriesReply.java b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntriesReply.java index 00a9e6fd7b..ffdfaa6a0e 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntriesReply.java +++ b/opendaylight/md-sal/sal-akka-raft/src/main/java/org/opendaylight/controller/cluster/raft/messages/AppendEntriesReply.java @@ -8,6 +8,8 @@ package org.opendaylight.controller.cluster.raft.messages; +import org.opendaylight.controller.cluster.raft.RaftVersions; + /** * Reply for the AppendEntriesRpc message */ @@ -31,6 +33,8 @@ public class AppendEntriesReply extends AbstractRaftRPC { private final short payloadVersion; + private final short raftVersion = RaftVersions.CURRENT_VERSION; + private final boolean forceInstallSnapshot; public AppendEntriesReply(String followerId, long term, boolean success, long logLastIndex, long logLastTerm, @@ -70,6 +74,10 @@ public class AppendEntriesReply extends AbstractRaftRPC { return payloadVersion; } + public short getRaftVersion() { + return raftVersion; + } + public boolean isForceInstallSnapshot() { return forceInstallSnapshot; } @@ -78,6 +86,6 @@ public class AppendEntriesReply extends AbstractRaftRPC { public String toString() { return "AppendEntriesReply [term=" + getTerm() + ", success=" + success + ", followerId=" + followerId + ", logLastIndex=" + logLastIndex + ", logLastTerm=" + logLastTerm + ", forceInstallSnapshot=" - + forceInstallSnapshot + ", payloadVersion=" + payloadVersion + "]"; + + forceInstallSnapshot + ", payloadVersion=" + payloadVersion + ", raftVersion=" + raftVersion + "]"; } } 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 26e5b7bffa..8529e1926b 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 @@ -37,6 +37,7 @@ import org.opendaylight.controller.cluster.raft.MockRaftActorContext; import org.opendaylight.controller.cluster.raft.RaftActorContext; import org.opendaylight.controller.cluster.raft.RaftActorLeadershipTransferCohort; import org.opendaylight.controller.cluster.raft.RaftState; +import org.opendaylight.controller.cluster.raft.RaftVersions; import org.opendaylight.controller.cluster.raft.ReplicatedLogEntry; import org.opendaylight.controller.cluster.raft.ReplicatedLogImplEntry; import org.opendaylight.controller.cluster.raft.SerializationUtils; @@ -1658,7 +1659,10 @@ public class LeaderTest extends AbstractLeaderTest { leader = new Leader(leaderActorContext); + FollowerLogInformation followerInfo = leader.getFollower(FOLLOWER_ID); + assertEquals(payloadVersion, leader.getLeaderPayloadVersion()); + assertEquals(RaftVersions.HELIUM_VERSION, followerInfo.getRaftVersion()); short payloadVersion = 5; AppendEntriesReply reply = new AppendEntriesReply(FOLLOWER_ID, 1, true, 2, 1, payloadVersion); @@ -1685,8 +1689,10 @@ public class LeaderTest extends AbstractLeaderTest { assertEquals(2, applyState.getReplicatedLogEntry().getIndex()); - FollowerLogInformation followerInfo = leader.getFollower(FOLLOWER_ID); + assertEquals(2, followerInfo.getMatchIndex()); + assertEquals(3, followerInfo.getNextIndex()); assertEquals(payloadVersion, followerInfo.getPayloadVersion()); + assertEquals(RaftVersions.CURRENT_VERSION, followerInfo.getRaftVersion()); } @Test