diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
index 342594ef74..e70ac92340 100644
--- a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
@@ -370,50 +370,6 @@ private boolean peerEquals(PeerId p1, PeerId p2) {
}
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;
- }
+ return RaftReflectionUtil.getReplicatorState(this.raftNode, peerId);
}
}
diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java
new file mode 100644
index 0000000000..16cb5941d6
--- /dev/null
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.ReplicatorGroup;
+import com.alipay.sofa.jraft.core.Replicator;
+import com.alipay.sofa.jraft.entity.PeerId;
+import com.alipay.sofa.jraft.util.ThreadId;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class RaftReflectionUtil {
+
+ public static Replicator.State getReplicatorState(Node node, PeerId peerId) {
+ if (node == null || peerId == null) {
+ return null;
+ }
+
+ // Get ReplicatorGroup from Node
+ var clz = node.getClass();
+ ReplicatorGroup replicateGroup = null;
+ try {
+ var f = clz.getDeclaredField("replicatorGroup");
+ f.setAccessible(true);
+ try {
+ replicateGroup = (ReplicatorGroup)f.get(node);
+ }
+ finally {
+ f.setAccessible(false);
+ }
+ }
+ catch (NoSuchFieldException | IllegalAccessException e) {
+ log.warn("Failed to get replicator state via reflection: {}", e.getMessage(), e);
+ return null;
+ }
+
+ if (replicateGroup == null) {
+ return null;
+ }
+
+ ThreadId threadId = replicateGroup.getReplicator(peerId);
+ if (threadId == null) {
+ return null;
+ }
+ else {
+ Replicator r = (Replicator)threadId.lock();
+ try {
+ if (r == null) {
+ return Replicator.State.Probe;
+ }
+ Replicator.State result = null;
+
+ // Get state from Replicator
+
+ var replicatorClz = r.getClass();
+ try {
+ var f = replicatorClz.getDeclaredField("state");
+ f.setAccessible(true);
+ try {
+ result = (Replicator.State)f.get(r);
+ }catch (Exception e){
+ log.warn("Failed to get replicator state for peerId: {}, error: {}", peerId, e.getMessage());
+ }
+ finally {
+ f.setAccessible(false);
+ }
+ }
+ catch (NoSuchFieldException e) {
+ log.warn("Failed to get replicator state via reflection: {}", e.getMessage(), e);
+ result = null;
+ }
+ return result;
+ } finally {
+ threadId.unlock();
+ }
+ }
+ }
+}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java
new file mode 100644
index 0000000000..c29e2a95a6
--- /dev/null
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.core.Replicator;
+import com.alipay.sofa.jraft.entity.PeerId;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+
+public class RaftReflectionUtilTest {
+
+ @Test
+ public void testGetReplicatorStateWithNullNode() {
+ // Setup
+ PeerId peerId = mock(PeerId.class);
+
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(null, peerId);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+
+ @Test
+ public void testGetReplicatorStateWithNullPeerId() {
+ // Setup
+ Node node = mock(Node.class);
+
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(node, null);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+
+ @Test
+ public void testGetReplicatorStateWithBothNull() {
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(null, null);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+}
diff --git a/hugegraph-store/hg-store-core/pom.xml b/hugegraph-store/hg-store-core/pom.xml
index 6f3c4c305b..0ecf723280 100644
--- a/hugegraph-store/hg-store-core/pom.xml
+++ b/hugegraph-store/hg-store-core/pom.xml
@@ -178,6 +178,11 @@
hg-store-client
test
+
+ org.apache.hugegraph
+ hg-pd-core
+ ${revision}
+
diff --git a/hugegraph-store/hg-store-core/src/main/java/org/apache/hugegraph/store/PartitionEngine.java b/hugegraph-store/hg-store-core/src/main/java/org/apache/hugegraph/store/PartitionEngine.java
index 3b4a8427ed..a70f17465f 100644
--- a/hugegraph-store/hg-store-core/src/main/java/org/apache/hugegraph/store/PartitionEngine.java
+++ b/hugegraph-store/hg-store-core/src/main/java/org/apache/hugegraph/store/PartitionEngine.java
@@ -42,6 +42,7 @@
import org.apache.hugegraph.pd.common.PDException;
import org.apache.hugegraph.pd.grpc.MetaTask;
import org.apache.hugegraph.pd.grpc.Metapb;
+import org.apache.hugegraph.pd.raft.RaftReflectionUtil;
import org.apache.hugegraph.store.business.BusinessHandler;
import org.apache.hugegraph.store.business.BusinessHandlerImpl;
import org.apache.hugegraph.store.cmd.HgCmdClient;
@@ -1146,51 +1147,7 @@ public Configuration getCurrentConf() {
}
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;
- }
+ return RaftReflectionUtil.getReplicatorState(this.raftNode, peerId);
}
class ReplicatorStateListener implements Replicator.ReplicatorStateListener {