From 45772bb7ec79bced76e546375c3acecce0ca4563 Mon Sep 17 00:00:00 2001 From: Xiangpeng Hu <65238551+BUAAserein@users.noreply.github.com> Date: Fri, 28 Jul 2023 22:42:10 +0800 Subject: [PATCH] RATIS-1861. NullPointerException in readAsync when Ratis leader is changing (#895) --- .../java/org/apache/ratis/server/impl/RaftServerImpl.java | 3 ++- .../src/main/java/org/apache/ratis/server/impl/RoleInfo.java | 5 ++--- 2 files changed, 4 insertions(+), 4 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 a857faa870..add6b041da 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 @@ -603,10 +603,11 @@ synchronized void changeToLeader() { Preconditions.assertTrue(getInfo().isCandidate()); role.shutdownLeaderElection(); setRole(RaftPeerRole.LEADER, "changeToLeader"); + final LeaderStateImpl leader = role.updateLeaderState(this); state.becomeLeader(); // start sending AppendEntries RPC to followers - final LogEntryProto e = role.startLeaderState(this); + final LogEntryProto e = leader.start(); getState().setRaftConf(e); } diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RoleInfo.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RoleInfo.java index d09c8017bc..603ba13260 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RoleInfo.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RoleInfo.java @@ -18,7 +18,6 @@ package org.apache.ratis.server.impl; -import org.apache.ratis.proto.RaftProtos.LogEntryProto; import org.apache.ratis.proto.RaftProtos.RaftPeerRole; import org.apache.ratis.protocol.RaftPeerId; import org.apache.ratis.util.Preconditions; @@ -79,8 +78,8 @@ LeaderStateImpl getLeaderStateNonNull() { return Objects.requireNonNull(leaderState.get(), "leaderState is null"); } - LogEntryProto startLeaderState(RaftServerImpl server) { - return updateAndGet(leaderState, new LeaderStateImpl(server)).start(); + LeaderStateImpl updateLeaderState(RaftServerImpl server) { + return updateAndGet(leaderState, new LeaderStateImpl(server)); } void shutdownLeaderState(boolean allowNull) {