You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by sz...@apache.org on 2022/12/07 09:28:45 UTC
[ratis] branch master updated: RATIS-1754. Set leader to null when stepping down (#792)
This is an automated email from the ASF dual-hosted git repository.
szetszwo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/master by this push:
new fda585051 RATIS-1754. Set leader to null when stepping down (#792)
fda585051 is described below
commit fda585051c2036acb91bd33c05d1fd28114ebf81
Author: William Song <48...@users.noreply.github.com>
AuthorDate: Wed Dec 7 17:28:39 2022 +0800
RATIS-1754. Set leader to null when stepping down (#792)
---
.../apache/ratis/server/impl/RaftServerImpl.java | 1 +
.../org/apache/ratis/server/impl/ServerState.java | 21 +++++++++++----------
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
index d7a577feb..d6224bf44 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
@@ -534,6 +534,7 @@ class RaftServerImpl implements RaftServer.Division,
setRole(RaftPeerRole.FOLLOWER, reason);
if (old == RaftPeerRole.LEADER) {
role.shutdownLeaderState(false);
+ state.setLeader(null, reason);
} else if (old == RaftPeerRole.CANDIDATE) {
role.shutdownLeaderElection();
} else if (old == RaftPeerRole.FOLLOWER) {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
index d2d5623c8..826c4cff8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java
@@ -83,7 +83,7 @@ class ServerState {
* The server ID of the leader for this term. Null means either there is
* no leader for this term yet or this server does not know who it is yet.
*/
- private volatile RaftPeerId leaderId;
+ private final AtomicReference<RaftPeerId> leaderId = new AtomicReference<>();
/**
* Candidate that this peer granted vote for in current term (or null if none)
*/
@@ -120,7 +120,6 @@ class ServerState {
stateMachine.getStateMachineStorage());
// On start the leader is null, start the clock now
- this.leaderId = null;
this.lastNoLeaderTime = Timestamp.currentTime();
this.noLeaderTimeout = RaftServerConfigKeys.Notification.noLeaderTimeout(prop);
@@ -207,7 +206,7 @@ class ServerState {
}
RaftPeerId getLeaderId() {
- return leaderId;
+ return leaderId.get();
}
/**
@@ -245,7 +244,8 @@ class ServerState {
}
void setLeader(RaftPeerId newLeaderId, Object op) {
- if (!Objects.equals(leaderId, newLeaderId)) {
+ final RaftPeerId oldLeaderId = leaderId.getAndSet(newLeaderId);
+ if (!Objects.equals(oldLeaderId, newLeaderId)) {
String suffix;
if (newLeaderId == null) {
// reset the time stamp when a null leader is assigned
@@ -258,9 +258,8 @@ class ServerState {
server.getStateMachine().event().notifyLeaderChanged(getMemberId(), newLeaderId);
}
LOG.info("{}: change Leader from {} to {} at term {} for {}{}",
- getMemberId(), leaderId, newLeaderId, getCurrentTerm(), op, suffix);
- leaderId = newLeaderId;
- if (leaderId != null) {
+ getMemberId(), oldLeaderId, newLeaderId, getCurrentTerm(), op, suffix);
+ if (newLeaderId != null) {
server.finishTransferLeadership();
server.onGroupLeaderElected();
}
@@ -323,13 +322,15 @@ class ServerState {
final long current = currentTerm.get();
if (leaderTerm < current) {
return false;
- } else if (leaderTerm > current || this.leaderId == null) {
+ }
+ final RaftPeerId curLeaderId = getLeaderId();
+ if (leaderTerm > current || curLeaderId == null) {
// If the request indicates a term that is greater than the current term
// or no leader has been set for the current term, make sure to update
// leader and term later
return true;
}
- return this.leaderId.equals(peerLeaderId);
+ return curLeaderId.equals(peerLeaderId);
}
static int compareLog(TermIndex lastEntry, TermIndex candidateLastEntry) {
@@ -353,7 +354,7 @@ class ServerState {
@Override
public String toString() {
- return getMemberId() + ":t" + currentTerm + ", leader=" + leaderId
+ return getMemberId() + ":t" + currentTerm + ", leader=" + getLeaderId()
+ ", voted=" + votedFor + ", raftlog=" + log + ", conf=" + getRaftConf();
}