This is an automated email from the ASF dual-hosted git repository.

jin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git


The following commit(s) were added to refs/heads/master by this push:
     new 6409d9277 optimize: remove lock of globalMasterInfo (#2151)
6409d9277 is described below

commit 6409d9277d44535a12dc3b7e4f9963f3d4d35b28
Author: vaughn <[email protected]>
AuthorDate: Tue Mar 14 18:55:29 2023 +0800

    optimize: remove lock of globalMasterInfo (#2151)
---
 .../hugegraph/api/filter/RedirectFilter.java       | 19 +++++------
 .../hugegraph/masterelection/GlobalMasterInfo.java | 39 +++++++++++++++-------
 .../StandardStateMachineCallback.java              |  4 +--
 3 files changed, 38 insertions(+), 24 deletions(-)

diff --git 
a/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/RedirectFilter.java
 
b/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/RedirectFilter.java
index 23e5f0735..e675dd955 100644
--- 
a/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/RedirectFilter.java
+++ 
b/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/RedirectFilter.java
@@ -76,23 +76,22 @@ public class RedirectFilter implements 
ContainerRequestFilter {
         E.checkState(handle != null, "Context GraphManager is absent");
         GraphManager manager = handle.getService();
         E.checkState(manager != null, "Context GraphManager is absent");
-        GlobalMasterInfo globalMasterInfo = manager.globalMasterInfo();
-        if (globalMasterInfo == null || !globalMasterInfo.isFeatureSupport()) {
-            return;
-        }
 
         String redirectTag = context.getHeaderString(X_HG_REDIRECT);
         if (StringUtils.isNotEmpty(redirectTag)) {
             return;
         }
 
-        String url;
-        synchronized (globalMasterInfo) {
-            if (globalMasterInfo.isMaster() || 
StringUtils.isEmpty(globalMasterInfo.url())) {
-                return;
-            }
-            url = globalMasterInfo.url();
+        GlobalMasterInfo globalMasterInfo = manager.globalMasterInfo();
+        if (globalMasterInfo == null || !globalMasterInfo.isFeatureSupport()) {
+            return;
+        }
+        GlobalMasterInfo.NodeInfo masterNodeInfo = globalMasterInfo.nodeInfo();
+        if (masterNodeInfo == null || masterNodeInfo.isMaster() ||
+            StringUtils.isEmpty(masterNodeInfo.url())) {
+            return;
         }
+        String url = masterNodeInfo.url();
 
         URI redirectUri;
         try {
diff --git 
a/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/GlobalMasterInfo.java
 
b/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/GlobalMasterInfo.java
index 9d8f85a9b..d7dd127af 100644
--- 
a/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/GlobalMasterInfo.java
+++ 
b/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/GlobalMasterInfo.java
@@ -19,26 +19,22 @@ package org.apache.hugegraph.masterelection;
 
 public class GlobalMasterInfo {
 
-    private boolean isMaster;
-    private String url;
-
+    private NodeInfo nodeInfo;
     private volatile boolean featureSupport;
 
     public GlobalMasterInfo() {
         this.featureSupport = false;
+        this.nodeInfo = new NodeInfo(false, "");
     }
 
-    public synchronized void set(boolean isMaster, String url) {
-        this.isMaster = isMaster;
-        this.url = url;
-    }
-
-    public synchronized boolean isMaster() {
-        return this.isMaster;
+    public final void nodeInfo(boolean isMaster, String url) {
+        // final can avoid instruction rearrangement, visibility can be ignored
+        final NodeInfo tmp = new NodeInfo(isMaster, url);
+        this.nodeInfo = tmp;
     }
 
-    public synchronized String url() {
-        return this.url;
+    public final NodeInfo nodeInfo() {
+        return this.nodeInfo;
     }
 
     public void isFeatureSupport(boolean featureSupport) {
@@ -48,4 +44,23 @@ public class GlobalMasterInfo {
     public boolean isFeatureSupport() {
         return this.featureSupport;
     }
+
+    public static class NodeInfo {
+
+        private final boolean isMaster;
+        private final String url;
+
+        public NodeInfo(boolean isMaster, String url) {
+            this.isMaster = isMaster;
+            this.url = url;
+        }
+
+        public boolean isMaster() {
+            return this.isMaster;
+        }
+
+        public String url() {
+            return this.url;
+        }
+    }
 }
diff --git 
a/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/StandardStateMachineCallback.java
 
b/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/StandardStateMachineCallback.java
index 11a989ecd..88bec95b3 100644
--- 
a/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/StandardStateMachineCallback.java
+++ 
b/hugegraph-core/src/main/java/org/apache/hugegraph/masterelection/StandardStateMachineCallback.java
@@ -94,12 +94,12 @@ public class StandardStateMachineCallback implements 
StateMachineCallback {
     public void initGlobalMasterInfo(StateMachineContext context) {
         StateMachineContext.MasterServerInfo master = context.master();
         if (master == null) {
-            this.globalMasterInfo.set(false, null);
+            this.globalMasterInfo.nodeInfo(false, "");
             return;
         }
 
         boolean isMaster = Objects.equals(context.node(), master.node());
         String url = master.url();
-        this.globalMasterInfo.set(isMaster, url);
+        this.globalMasterInfo.nodeInfo(isMaster, url);
     }
 }

Reply via email to