From 6092dc0fc1e827109190909b7fdffaab77694d59 Mon Sep 17 00:00:00 2001
From: What is broken can be reforged
<34939118+GYXkeep@users.noreply.github.com>
Date: Sat, 1 Jul 2023 18:25:35 +0800
Subject: [PATCH] refact: adapt for jraft v1.3.13
---
hg-pd-core/pom.xml | 2 +-
.../apache/hugegraph/pd/raft/RaftEngine.java | 76 +++++++++++++++----
2 files changed, 64 insertions(+), 14 deletions(-)
diff --git a/hg-pd-core/pom.xml b/hg-pd-core/pom.xml
index 8963680d2..a02a4c9de 100644
--- a/hg-pd-core/pom.xml
+++ b/hg-pd-core/pom.xml
@@ -38,7 +38,7 @@
com.alipay.sofa
jraft-core
- 1.3.9
+ 1.3.13
org.rocksdb
diff --git a/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java b/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
index 116bab48c..910240cbd 100644
--- a/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
+++ b/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
@@ -35,8 +35,10 @@ import org.apache.hugegraph.pd.grpc.Pdpb;
import com.alipay.sofa.jraft.JRaftUtils;
import com.alipay.sofa.jraft.Node;
import com.alipay.sofa.jraft.RaftGroupService;
+import com.alipay.sofa.jraft.ReplicatorGroup;
import com.alipay.sofa.jraft.Status;
import com.alipay.sofa.jraft.conf.Configuration;
+import com.alipay.sofa.jraft.core.Replicator;
import com.alipay.sofa.jraft.entity.PeerId;
import com.alipay.sofa.jraft.entity.Task;
import com.alipay.sofa.jraft.error.RaftError;
@@ -46,6 +48,7 @@ import com.alipay.sofa.jraft.option.RpcOptions;
import com.alipay.sofa.jraft.rpc.RaftRpcServerFactory;
import com.alipay.sofa.jraft.rpc.RpcServer;
import com.alipay.sofa.jraft.util.Endpoint;
+import com.alipay.sofa.jraft.util.ThreadId;
import com.alipay.sofa.jraft.util.internal.ThrowUtil;
import lombok.extern.slf4j.Slf4j;
@@ -227,19 +230,18 @@ public class RaftEngine {
CompletableFuture future =
raftRpcClient.getGrpcAddress(peerId.getEndpoint().toString());
- // TODO: uncomment later - jraft problem
-// Metapb.ShardRole role = Metapb.ShardRole.Follower;
-// if (peerEquals(peerId, raftNode.getLeaderId())) {
-// role = Metapb.ShardRole.Leader;
-// } else if (learners.contains(peerId)) {
-// role = Metapb.ShardRole.Learner;
-// var state = raftNode.getReplicatorState(peerId);
-// if (state != null) {
-// builder.setReplicatorState(state.name());
-// }
-// }
-//
-// builder.setRole(role);
+ Metapb.ShardRole role = Metapb.ShardRole.Follower;
+ if (peerEquals(peerId, raftNode.getLeaderId())) {
+ role = Metapb.ShardRole.Leader;
+ } else if (learners.contains(peerId)) {
+ role = Metapb.ShardRole.Learner;
+ var state = getReplicatorState(peerId);
+ if (state != null) {
+ builder.setReplicatorState(state.name());
+ }
+ }
+
+ builder.setRole(role);
try {
if (future.isCompletedExceptionally()) {
@@ -324,4 +326,52 @@ public class RaftEngine {
}
return Objects.equals(p1.getIp(), p2.getIp()) && Objects.equals(p1.getPort(), p2.getPort());
}
+
+ private Replicator.State getReplicatorState(PeerId peerId) {
+ var replicateGroup = getReplicatorGroup();
+ if (replicateGroup == null) {
+ return null;
+ }
+
+ ThreadId threadId = replicateGroup.getReplicator(peerId);
+ if (threadId == null) {
+ return null;
+ } else {
+ Replicator r = (Replicator) threadId.lock();
+ if (r == null) {
+ return Replicator.State.Probe;
+ }
+ Replicator.State result = getState(r);
+ threadId.unlock();
+ return result;
+ }
+ }
+
+ private ReplicatorGroup getReplicatorGroup() {
+ var clz = this.raftNode.getClass();
+ try {
+ var f = clz.getDeclaredField("replicatorGroup");
+ f.setAccessible(true);
+ var group = (ReplicatorGroup) f.get(this.raftNode);
+ f.setAccessible(false);
+ return group;
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ log.info("getReplicatorGroup: error {}", e.getMessage());
+ return null;
+ }
+ }
+
+ private Replicator.State getState(Replicator r) {
+ var clz = r.getClass();
+ try {
+ var f = clz.getDeclaredField("state");
+ f.setAccessible(true);
+ var state = (Replicator.State) f.get(this.raftNode);
+ f.setAccessible(false);
+ return state;
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ log.info("getReplicatorGroup: error {}", e.getMessage());
+ return null;
+ }
+ }
}