You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ms...@apache.org on 2018/08/01 02:08:19 UTC
incubator-ratis git commit: RATIS-286. Add information about raft
peers and rpc delay in ServerInformationReply. Contributed by Mukul Kumar
Singh.
Repository: incubator-ratis
Updated Branches:
refs/heads/master a4fd89473 -> c2423179b
RATIS-286. Add information about raft peers and rpc delay in ServerInformationReply. Contributed by Mukul Kumar Singh.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ratis/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ratis/commit/c2423179
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ratis/tree/c2423179
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ratis/diff/c2423179
Branch: refs/heads/master
Commit: c2423179b8390a7ece679465e50b9abd47b4686d
Parents: a4fd894
Author: Mukul Kumar Singh <ms...@apache.org>
Authored: Wed Aug 1 07:37:54 2018 +0530
Committer: Mukul Kumar Singh <ms...@apache.org>
Committed: Wed Aug 1 07:37:54 2018 +0530
----------------------------------------------------------------------
.../ratis/client/impl/ClientProtoUtils.java | 7 +--
.../ratis/protocol/ServerInformationReply.java | 24 +++------
ratis-proto-shaded/src/main/proto/Raft.proto | 37 ++++++++++++--
.../apache/ratis/server/impl/FollowerState.java | 4 ++
.../ratis/server/impl/RaftServerImpl.java | 53 ++++++++++++++++++--
5 files changed, 99 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/c2423179/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
----------------------------------------------------------------------
diff --git a/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java b/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
index 33351c6..1c41a3b 100644
--- a/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
+++ b/ratis-client/src/main/java/org/apache/ratis/client/impl/ClientProtoUtils.java
@@ -188,6 +188,8 @@ public interface ClientProtoUtils {
if (reply.getRaftGroupId() != null) {
b.setGroup(ProtoUtils.toRaftGroupProtoBuilder(reply.getGroup()));
}
+ b.setIsRaftStorageHealthy(reply.isRaftStorageHealthy());
+ b.setRole(reply.getRoleInfoProto());
ProtoUtils.addCommitInfos(reply.getCommitInfos(), i -> b.addCommitInfos(i));
}
return b.build();
@@ -230,11 +232,10 @@ public interface ClientProtoUtils {
ClientId clientId = ClientId.valueOf(rp.getRequestorId());
final RaftGroupId groupId = ProtoUtils.toRaftGroupId(rp.getRaftGroupId());
final RaftGroup raftGroup = ProtoUtils.toRaftGroup(replyProto.getGroup());
- RaftPeerRole role = replyProto.getRole();
+ RoleInfoProto role = replyProto.getRole();
boolean isRaftStorageHealthy = replyProto.getIsRaftStorageHealthy();
- long roleElapsedTime = replyProto.getRoleElapsedTimeMs();
return new ServerInformationReply(clientId, RaftPeerId.valueOf(rp.getReplyId()),
- groupId, rp.getCallId(), rp.getSuccess(), role, roleElapsedTime, isRaftStorageHealthy,
+ groupId, rp.getCallId(), rp.getSuccess(), role, isRaftStorageHealthy,
replyProto.getCommitInfosList(), raftGroup);
}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/c2423179/ratis-common/src/main/java/org/apache/ratis/protocol/ServerInformationReply.java
----------------------------------------------------------------------
diff --git a/ratis-common/src/main/java/org/apache/ratis/protocol/ServerInformationReply.java b/ratis-common/src/main/java/org/apache/ratis/protocol/ServerInformationReply.java
index 9c4eaa8..feb326e 100644
--- a/ratis-common/src/main/java/org/apache/ratis/protocol/ServerInformationReply.java
+++ b/ratis-common/src/main/java/org/apache/ratis/protocol/ServerInformationReply.java
@@ -17,7 +17,7 @@
*/
package org.apache.ratis.protocol;
-import org.apache.ratis.shaded.proto.RaftProtos;
+import org.apache.ratis.shaded.proto.RaftProtos.RoleInfoProto;
import org.apache.ratis.shaded.proto.RaftProtos.CommitInfoProto;
import java.util.Collection;
@@ -27,27 +27,24 @@ import java.util.Collection;
*/
public class ServerInformationReply extends RaftClientReply {
private final RaftGroup group;
- private final RaftProtos.RaftPeerRole role;
- private final long roleElapsedTime;
+ private final RoleInfoProto roleInfoProto;
private final boolean isRaftStorageHealthy;
public ServerInformationReply(
- RaftClientRequest request, RaftProtos.RaftPeerRole role, long roleElapsedTime,
+ RaftClientRequest request, RoleInfoProto roleInfoProto,
boolean isRaftStorageHealthy, Collection<CommitInfoProto> commitInfos, RaftGroup group) {
super(request, commitInfos);
- this.role = role;
- this.roleElapsedTime = roleElapsedTime;
+ this.roleInfoProto = roleInfoProto;
this.isRaftStorageHealthy = isRaftStorageHealthy;
this.group = group;
}
public ServerInformationReply(
ClientId clientId, RaftPeerId serverId, RaftGroupId groupId,
- long callId, boolean success, RaftProtos.RaftPeerRole role, long roleElapsedTime,
+ long callId, boolean success, RoleInfoProto roleInfoProto,
boolean isRaftStorageHealthy, Collection<CommitInfoProto> commitInfos, RaftGroup group) {
super(clientId, serverId, groupId, callId, success, null, null, commitInfos);
- this.role = role;
- this.roleElapsedTime = roleElapsedTime;
+ this.roleInfoProto = roleInfoProto;
this.isRaftStorageHealthy = isRaftStorageHealthy;
this.group = group;
}
@@ -56,13 +53,8 @@ public class ServerInformationReply extends RaftClientReply {
return group;
}
-
- public RaftProtos.RaftPeerRole getRole() {
- return role;
- }
-
- public long getRoleElapsedTime() {
- return roleElapsedTime;
+ public RoleInfoProto getRoleInfoProto() {
+ return roleInfoProto;
}
public boolean isRaftStorageHealthy() {
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/c2423179/ratis-proto-shaded/src/main/proto/Raft.proto
----------------------------------------------------------------------
diff --git a/ratis-proto-shaded/src/main/proto/Raft.proto b/ratis-proto-shaded/src/main/proto/Raft.proto
index c34e5c4..2965f97 100644
--- a/ratis-proto-shaded/src/main/proto/Raft.proto
+++ b/ratis-proto-shaded/src/main/proto/Raft.proto
@@ -254,11 +254,40 @@ message ServerInformationRequestProto {
RaftRpcRequestProto rpcRequest = 1;
}
+message ServerRpcDelayProto {
+ RaftPeerProto id = 1;
+ uint64 lastRpcElapsedTimeMs = 2;
+}
+
+message LeaderInfoProto {
+ repeated ServerRpcDelayProto followerInfo = 1;
+}
+
+message FollowerInfoProto {
+ ServerRpcDelayProto leaderInfo = 1;
+ bool inLogSync = 2;
+}
+
+message CandidateInfoProto {
+ // nothing to add for candidate
+}
+
+message RoleInfoProto {
+ RaftPeerProto self = 1;
+ RaftPeerRole role = 2;
+ uint64 roleElapsedTimeMs = 3;
+
+ oneof PeerInfo {
+ LeaderInfoProto leaderInfo = 4;
+ FollowerInfoProto followerInfo = 5;
+ CandidateInfoProto candidateInfo = 6;
+ }
+}
+
message ServerInformationReplyProto {
RaftRpcReplyProto rpcReply = 1;
RaftGroupProto group = 2;
- RaftPeerRole role = 3;
- uint64 roleElapsedTimeMs = 4;
- bool isRaftStorageHealthy = 5;
- repeated CommitInfoProto commitInfos = 6;
+ RoleInfoProto role = 3;
+ bool isRaftStorageHealthy = 4;
+ repeated CommitInfoProto commitInfos = 5;
}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/c2423179/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
----------------------------------------------------------------------
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
index 3fb5ecb..f526091 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
@@ -49,6 +49,10 @@ class FollowerState extends Daemon {
return lastRpcTime;
}
+ public boolean isInLogSync() {
+ return inLogSync;
+ }
+
boolean shouldWithholdVotes() {
return lastRpcTime.elapsedTimeMs() < server.getMinTimeoutMs();
}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/c2423179/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
----------------------------------------------------------------------
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 8d82f3a..2ef8125 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
@@ -44,6 +44,7 @@ import java.util.concurrent.*;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import static org.apache.ratis.server.impl.ServerProtoUtils.toRaftConfiguration;
import static org.apache.ratis.shaded.proto.RaftProtos.AppendEntriesReplyProto.AppendResult.*;
@@ -371,9 +372,55 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
ServerInformationReply getServerInformation(ServerInformationRequest request) {
final RaftGroup group = new RaftGroup(groupId, getRaftConf().getPeers());
- return new ServerInformationReply(request, role.getCurrentRole(),
- role.getRoleElapsedTimeMs(), state.getStorage().getStorageDir().hasMetaFile(),
- getCommitInfos(), group);
+ return new ServerInformationReply(request, getRoleInfoProto(),
+ state.getStorage().getStorageDir().hasMetaFile(), getCommitInfos(), group);
+ }
+
+ private RoleInfoProto getRoleInfoProto() {
+ RaftPeerRole currentRole = role.getCurrentRole();
+ RoleInfoProto.Builder roleInfo = RoleInfoProto.newBuilder()
+ .setSelf(ProtoUtils.toRaftPeerProto(getPeer()))
+ .setRole(currentRole)
+ .setRoleElapsedTimeMs(role.getRoleElapsedTimeMs());
+ switch (currentRole) {
+ case CANDIDATE:
+ roleInfo.setCandidateInfo(CandidateInfoProto.getDefaultInstance());
+ break;
+
+ case FOLLOWER:
+ FollowerInfoProto.Builder follower = FollowerInfoProto.newBuilder()
+ .setLeaderInfo(getServerRpcDelayProto(
+ getRaftConf().getPeer(state.getLeaderId()),
+ heartbeatMonitor.getLastRpcTime().elapsedTimeMs()))
+ .setInLogSync(heartbeatMonitor.isInLogSync());
+ roleInfo.setFollowerInfo(follower);
+ break;
+
+ case LEADER:
+ LeaderInfoProto.Builder leader = LeaderInfoProto.newBuilder();
+ Stream<LogAppender> stream = getLeaderState().getLogAppenders();
+ stream.forEach(appender ->
+ leader.addFollowerInfo(getServerRpcDelayProto(
+ appender.getFollower().getPeer(),
+ appender.getFollower().getLastRpcResponseTime().elapsedTimeMs())));
+ roleInfo.setLeaderInfo(leader);
+ break;
+
+ default:
+ throw new IllegalStateException("incorrect role of server " + currentRole);
+ }
+ return roleInfo.build();
+ }
+
+ private ServerRpcDelayProto getServerRpcDelayProto (RaftPeer peer, long delay) {
+ if (peer == null) {
+ // if no peer information return empty
+ return ServerRpcDelayProto.getDefaultInstance();
+ }
+ return ServerRpcDelayProto.newBuilder()
+ .setId(ProtoUtils.toRaftPeerProto(peer))
+ .setLastRpcElapsedTimeMs(delay)
+ .build();
}
synchronized void changeToCandidate() {