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:32:03 UTC
[ratis] branch branch-2 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 branch-2
in repository https://gitbox.apache.org/repos/asf/ratis.git
The following commit(s) were added to refs/heads/branch-2 by this push:
new 21a90b314 RATIS-1754. Set leader to null when stepping down (#792)
21a90b314 is described below
commit 21a90b314b66a628768fdd9109c21efcc6fac9ba
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)
(cherry picked from commit fda585051c2036acb91bd33c05d1fd28114ebf81)
---
.../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 3d6fb517b..8e56ec935 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
@@ -530,6 +530,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 4dba31756..b1422db4f 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
@@ -87,7 +87,7 @@ class ServerState implements Closeable {
* 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)
*/
@@ -149,7 +149,6 @@ class ServerState implements Closeable {
snapshotManager = new SnapshotManager(id, storage.getStorageDir(), 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);
@@ -256,7 +255,7 @@ class ServerState implements Closeable {
}
RaftPeerId getLeaderId() {
- return leaderId;
+ return leaderId.get();
}
boolean hasLeader() {
@@ -298,7 +297,8 @@ class ServerState implements Closeable {
}
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
@@ -311,9 +311,8 @@ class ServerState implements Closeable {
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();
}
@@ -376,13 +375,15 @@ class ServerState implements Closeable {
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) {
@@ -406,7 +407,7 @@ class ServerState implements Closeable {
@Override
public String toString() {
- return getMemberId() + ":t" + currentTerm + ", leader=" + leaderId
+ return getMemberId() + ":t" + currentTerm + ", leader=" + getLeaderId()
+ ", voted=" + votedFor + ", raftlog=" + log + ", conf=" + getRaftConf();
}