Handling of getLeaderId() depends on behavior:
- for (Isolated)Leader, it is always its local ID
- for Candidate it is always null
- for Follower it can vary
The same is true of leader payload version.
This patch moves these two fields to Follower, makes Candidate return constants and
makes Leader return the values stored in the local context.
Change-Id: I0fca58ab985f14460eef9647a89ede02242e6e7c
Signed-off-by: Robert Varga <rovarga@cisco.com>
public void setPayloadVersion(short payloadVersion) {
this.payloadVersion = payloadVersion;
}
public void setPayloadVersion(short payloadVersion) {
this.payloadVersion = payloadVersion;
}
protected AbstractLeader(RaftActorContext context, RaftState state) {
super(context, state);
protected AbstractLeader(RaftActorContext context, RaftState state) {
super(context, state);
- setLeaderPayloadVersion(context.getPayloadVersion());
-
for(PeerInfo peerInfo: context.getPeers()) {
FollowerLogInformation followerLogInformation = new FollowerLogInformationImpl(peerInfo, -1, context);
followerToLog.put(peerInfo.getId(), followerLogInformation);
}
for(PeerInfo peerInfo: context.getPeers()) {
FollowerLogInformation followerLogInformation = new FollowerLogInformationImpl(peerInfo, -1, context);
followerToLog.put(peerInfo.getId(), followerLogInformation);
}
- leaderId = context.getId();
-
LOG.debug("{}: Election: Leader has following peers: {}", logName(), getFollowerIds());
updateMinReplicaCount();
LOG.debug("{}: Election: Leader has following peers: {}", logName(), getFollowerIds());
updateMinReplicaCount();
- public String getLeaderId() {
+ public final String getLeaderId() {
return context.getId();
}
return context.getId();
}
+ @Override
+ public final short getLeaderPayloadVersion() {
+ return context.getPayloadVersion();
+ }
+
protected boolean isLeaderIsolated() {
int minPresent = getMinIsolatedLeaderPeerCount();
for (FollowerLogInformation followerLogInformation : followerToLog.values()) {
protected boolean isLeaderIsolated() {
int minPresent = getMinIsolatedLeaderPeerCount();
for (FollowerLogInformation followerLogInformation : followerToLog.values()) {
*/
private Cancellable electionCancel = null;
*/
private Cancellable electionCancel = null;
- /**
- *
- */
- protected String leaderId = null;
-
- private short leaderPayloadVersion = -1;
-
private long replicatedToAllIndex = -1;
private final String logName;
private long replicatedToAllIndex = -1;
private final String logName;
- public String logName() {
+ protected final String logName() {
- @Override
- public String getLeaderId() {
- return leaderId;
- }
-
- @Override
- public short getLeaderPayloadVersion() {
- return leaderPayloadVersion;
- }
-
- public void setLeaderPayloadVersion(short leaderPayloadVersion) {
- this.leaderPayloadVersion = leaderPayloadVersion;
- }
-
@Override
public RaftActorBehavior switchBehavior(RaftActorBehavior behavior) {
return internalSwitchBehavior(behavior);
@Override
public RaftActorBehavior switchBehavior(RaftActorBehavior behavior) {
return internalSwitchBehavior(behavior);
} else {
scheduleElection(electionDuration());
}
} else {
scheduleElection(electionDuration());
}
+ @Override
+ public final String getLeaderId() {
+ return null;
+ }
+ @Override
+ public final short getLeaderPayloadVersion() {
+ return -1;
- @Override protected RaftActorBehavior handleAppendEntries(ActorRef sender,
+ @Override
+ protected RaftActorBehavior handleAppendEntries(ActorRef sender,
AppendEntries appendEntries) {
if(LOG.isDebugEnabled()) {
AppendEntries appendEntries) {
if(LOG.isDebugEnabled()) {
- @Override protected RaftActorBehavior handleAppendEntriesReply(ActorRef sender,
- AppendEntriesReply appendEntriesReply) {
-
+ @Override
+ protected RaftActorBehavior handleAppendEntriesReply(ActorRef sender, AppendEntriesReply appendEntriesReply) {
- @Override protected RaftActorBehavior handleRequestVoteReply(ActorRef sender,
- RequestVoteReply requestVoteReply) {
-
- LOG.debug("{}: handleRequestVoteReply: {}, current voteCount: {}", logName(), requestVoteReply,
- voteCount);
+ @Override
+ protected RaftActorBehavior handleRequestVoteReply(ActorRef sender, RequestVoteReply requestVoteReply) {
+ LOG.debug("{}: handleRequestVoteReply: {}, current voteCount: {}", logName(), requestVoteReply, voteCount);
if (requestVoteReply.isVoteGranted()) {
voteCount++;
if (requestVoteReply.isVoteGranted()) {
voteCount++;
import akka.actor.ActorRef;
import akka.japi.Procedure;
import com.google.common.annotations.VisibleForTesting;
import akka.actor.ActorRef;
import akka.japi.Procedure;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import java.util.ArrayList;
import org.opendaylight.controller.cluster.raft.RaftActorContext;
import org.opendaylight.controller.cluster.raft.RaftState;
import java.util.ArrayList;
import org.opendaylight.controller.cluster.raft.RaftActorContext;
import org.opendaylight.controller.cluster.raft.RaftState;
};
private SnapshotTracker snapshotTracker = null;
};
private SnapshotTracker snapshotTracker = null;
+ private String leaderId;
+ private short leaderPayloadVersion;
public Follower(RaftActorContext context) {
this(context, null, (short)-1);
public Follower(RaftActorContext context) {
this(context, null, (short)-1);
public Follower(RaftActorContext context, String initialLeaderId, short initialLeaderPayloadVersion) {
super(context, RaftState.Follower);
public Follower(RaftActorContext context, String initialLeaderId, short initialLeaderPayloadVersion) {
super(context, RaftState.Follower);
- leaderId = initialLeaderId;
- setLeaderPayloadVersion(initialLeaderPayloadVersion);
+ this.leaderId = initialLeaderId;
+ this.leaderPayloadVersion = initialLeaderPayloadVersion;
initialSyncStatusTracker = new SyncStatusTracker(context.getActor(), getId(), SYNC_THRESHOLD);
initialSyncStatusTracker = new SyncStatusTracker(context.getActor(), getId(), SYNC_THRESHOLD);
scheduleElection(electionDuration());
}
}
scheduleElection(electionDuration());
}
}
+ }
+
+ @Override
+ public final String getLeaderId() {
+ return leaderId;
+ }
+
+ @VisibleForTesting
+ protected final void setLeaderId(final String leaderId) {
+ this.leaderId = Preconditions.checkNotNull(leaderId);
+ }
+
+ @Override
+ public short getLeaderPayloadVersion() {
+ return leaderPayloadVersion;
+ }
+ @VisibleForTesting
+ protected final void setLeaderPayloadVersion(short leaderPayloadVersion) {
+ this.leaderPayloadVersion = leaderPayloadVersion;
}
private boolean isLogEntryPresent(long index){
}
private boolean isLogEntryPresent(long index){
initialSyncStatusTracker.update(leaderId, currentLeaderCommit, context.getCommitIndex());
}
initialSyncStatusTracker.update(leaderId, currentLeaderCommit, context.getCommitIndex());
}
- @Override protected RaftActorBehavior handleAppendEntries(ActorRef sender,
- AppendEntries appendEntries) {
+ @Override
+ protected RaftActorBehavior handleAppendEntries(ActorRef sender, AppendEntries appendEntries) {
int numLogEntries = appendEntries.getEntries() != null ? appendEntries.getEntries().size() : 0;
if(LOG.isTraceEnabled()) {
int numLogEntries = appendEntries.getEntries() != null ? appendEntries.getEntries().size() : 0;
if(LOG.isTraceEnabled()) {
// If we got here then we do appear to be talking to the leader
leaderId = appendEntries.getLeaderId();
// If we got here then we do appear to be talking to the leader
leaderId = appendEntries.getLeaderId();
-
- setLeaderPayloadVersion(appendEntries.getPayloadVersion());
+ leaderPayloadVersion = appendEntries.getPayloadVersion();
updateInitialSyncStatus(appendEntries.getLeaderCommit(), appendEntries.getLeaderId());
// First check if the logs are in sync or not
updateInitialSyncStatus(appendEntries.getLeaderCommit(), appendEntries.getLeaderId());
// First check if the logs are in sync or not
- @Override protected RaftActorBehavior handleAppendEntriesReply(ActorRef sender,
+ @Override
+ protected RaftActorBehavior handleAppendEntriesReply(ActorRef sender,
AppendEntriesReply appendEntriesReply) {
return this;
}
AppendEntriesReply appendEntriesReply) {
return this;
}
- @Override protected RaftActorBehavior handleRequestVoteReply(ActorRef sender,
+ @Override
+ protected RaftActorBehavior handleRequestVoteReply(ActorRef sender,
RequestVoteReply requestVoteReply) {
return this;
}
RequestVoteReply requestVoteReply) {
return this;
}
- @Override public RaftActorBehavior handleMessage(ActorRef sender, Object originalMessage) {
+ @Override
+ public RaftActorBehavior handleMessage(ActorRef sender, Object originalMessage) {
Object message = fromSerializableMessage(originalMessage);
Object message = fromSerializableMessage(originalMessage);
// it can happen that this isolated leader interacts with a new leader in the cluster and
// changes its state to Follower, hence we only need to switch to Leader if the state is still Isolated
if (ret.state() == RaftState.IsolatedLeader && !isLeaderIsolated()) {
// it can happen that this isolated leader interacts with a new leader in the cluster and
// changes its state to Follower, hence we only need to switch to Leader if the state is still Isolated
if (ret.state() == RaftState.IsolatedLeader && !isLeaderIsolated()) {
- LOG.info("IsolatedLeader {} switching from IsolatedLeader to Leader", leaderId);
+ LOG.info("IsolatedLeader {} switching from IsolatedLeader to Leader", getLeaderId());
return internalSwitchBehavior(RaftState.Leader);
}
return ret;
return internalSwitchBehavior(RaftState.Leader);
}
return ret;
if (ISOLATED_LEADER_CHECK.equals(originalMessage) && isLeaderIsolated()) {
LOG.warn("{}: At least {} followers need to be active, Switching {} from Leader to IsolatedLeader",
if (ISOLATED_LEADER_CHECK.equals(originalMessage) && isLeaderIsolated()) {
LOG.warn("{}: At least {} followers need to be active, Switching {} from Leader to IsolatedLeader",
- context.getId(), getMinIsolatedLeaderPeerCount(), leaderId);
+ context.getId(), getMinIsolatedLeaderPeerCount(), getLeaderId());
return internalSwitchBehavior(RaftState.IsolatedLeader);
}
return internalSwitchBehavior(RaftState.IsolatedLeader);
}
Follower follower = new Follower(raftActor.getRaftActorContext()) {
@Override
public RaftActorBehavior handleMessage(ActorRef sender, Object message) {
Follower follower = new Follower(raftActor.getRaftActorContext()) {
@Override
public RaftActorBehavior handleMessage(ActorRef sender, Object message) {
- leaderId = newLeaderId;
+ setLeaderId(newLeaderId);
setLeaderPayloadVersion(newLeaderVersion);
return this;
}
setLeaderPayloadVersion(newLeaderVersion);
return this;
}