RATIS-1574. Add follower information to LeaderEventApi.notifyFollowerSlowness(..) (#638)
diff --git a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
index 0fba2e6..3a0ca40 100644
--- a/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
+++ b/ratis-server-api/src/main/java/org/apache/ratis/statemachine/StateMachine.java
@@ -27,6 +27,7 @@
import org.apache.ratis.protocol.RaftClientRequest;
import org.apache.ratis.protocol.RaftGroupId;
import org.apache.ratis.protocol.RaftGroupMemberId;
+import org.apache.ratis.protocol.RaftPeer;
import org.apache.ratis.protocol.RaftPeerId;
import org.apache.ratis.server.RaftServer;
import org.apache.ratis.server.protocol.TermIndex;
@@ -202,11 +203,16 @@
* Notify the {@link StateMachine} that the given follower is slow.
* This notification is based on "raft.server.rpc.slowness.timeout".
*
- * @param roleInfoProto information about the current node role and rpc delay information
+ * @param leaderInfo information about the current node role and rpc delay information
+ * @param slowFollower The follower being slow.
*
* @see org.apache.ratis.server.RaftServerConfigKeys.Rpc#SLOWNESS_TIMEOUT_KEY
*/
- default void notifyFollowerSlowness(RoleInfoProto roleInfoProto) {}
+ default void notifyFollowerSlowness(RoleInfoProto leaderInfo, RaftPeer slowFollower) {}
+
+ /** @deprecated Use {@link #notifyFollowerSlowness(RoleInfoProto, RaftPeer)}. */
+ @Deprecated
+ default void notifyFollowerSlowness(RoleInfoProto leaderInfo) {}
/**
* Notify {@link StateMachine} that this server is no longer the leader.
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
index 49ad684..068c7e5 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
@@ -24,6 +24,7 @@
import org.apache.ratis.proto.RaftProtos.LogEntryProto.LogEntryBodyCase;
import org.apache.ratis.proto.RaftProtos.RaftPeerRole;
import org.apache.ratis.proto.RaftProtos.ReplicationLevel;
+import org.apache.ratis.proto.RaftProtos.RoleInfoProto;
import org.apache.ratis.proto.RaftProtos.StartLeaderElectionReplyProto;
import org.apache.ratis.proto.RaftProtos.StartLeaderElectionRequestProto;
import org.apache.ratis.protocol.Message;
@@ -1117,7 +1118,9 @@
public void checkHealth(FollowerInfo follower) {
final TimeDuration elapsedTime = follower.getLastRpcResponseTime().elapsedTime();
if (elapsedTime.compareTo(server.properties().rpcSlownessTimeout()) > 0) {
- server.getStateMachine().leaderEvent().notifyFollowerSlowness(server.getInfo().getRoleInfoProto());
+ final RoleInfoProto leaderInfo = server.getInfo().getRoleInfoProto();
+ server.getStateMachine().leaderEvent().notifyFollowerSlowness(leaderInfo);
+ server.getStateMachine().leaderEvent().notifyFollowerSlowness(leaderInfo, follower.getPeer());
}
final RaftPeerId followerId = follower.getPeer().getId();
raftServerMetrics.recordFollowerHeartbeatElapsedTime(followerId, elapsedTime.toLong(TimeUnit.NANOSECONDS));
diff --git a/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java b/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
index b8882d5..2b4d2b8 100644
--- a/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
+++ b/ratis-server/src/test/java/org/apache/ratis/statemachine/SimpleStateMachine4Testing.java
@@ -26,6 +26,7 @@
import org.apache.ratis.protocol.RaftClientRequest;
import org.apache.ratis.protocol.RaftGroupId;
import org.apache.ratis.protocol.RaftGroupMemberId;
+import org.apache.ratis.protocol.RaftPeer;
import org.apache.ratis.protocol.RaftPeerId;
import org.apache.ratis.protocol.exceptions.StateMachineException;
import org.apache.ratis.server.RaftServer;
@@ -416,9 +417,9 @@
}
@Override
- public void notifyFollowerSlowness(RoleInfoProto roleInfoProto) {
- LOG.info("{}: notifySlowness {}, {}", this, groupId, roleInfoProto);
- slownessInfo = roleInfoProto;
+ public void notifyFollowerSlowness(RoleInfoProto leaderInfo, RaftPeer slowFollower) {
+ LOG.info("{}: notifySlowness {}, {}, {}", this, groupId, leaderInfo, slowFollower);
+ slownessInfo = leaderInfo;
}
@Override