You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by pb...@apache.org on 2019/05/01 07:36:49 UTC

[phoenix] 11/12: PHOENIX-5251: Avoid taking explicit lock by using AtomicReference in PhoenixAccessController class

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

pboado pushed a commit to branch 5.x-cdh6
in repository https://gitbox.apache.org/repos/asf/phoenix.git

commit abe6dfec042f96fc0ce66ce923ef3aaf5c84826a
Author: s.kadam <s....@salesforce.com>
AuthorDate: Fri Apr 26 23:41:30 2019 +0100

    PHOENIX-5251: Avoid taking explicit lock by using AtomicReference in PhoenixAccessController class
    
    Signed-off-by: Geoffrey Jacoby <gj...@apache.org>
---
 .../coprocessor/PhoenixAccessController.java       | 23 +++++++++++-----------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
index 1303363..dad663d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/PhoenixAccessController.java
@@ -26,6 +26,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -77,7 +78,7 @@ import com.google.protobuf.RpcController;
 public class PhoenixAccessController extends BaseMetaDataEndpointObserver {
 
     private PhoenixMetaDataControllerEnvironment env;
-    private volatile ArrayList<MasterObserver> accessControllers;
+    AtomicReference<ArrayList<MasterObserver>> accessControllers = new AtomicReference<>();
     private boolean accessCheckEnabled;
     private UserProvider userProvider;
     public static final Log LOG = LogFactory.getLog(PhoenixAccessController.class);
@@ -90,20 +91,18 @@ public class PhoenixAccessController extends BaseMetaDataEndpointObserver {
     }
     
     private List<MasterObserver> getAccessControllers() throws IOException {
-        if (accessControllers == null) {
-            synchronized (this) {
-                if (accessControllers == null) {
-                    accessControllers = new ArrayList<MasterObserver>();
-                    RegionCoprocessorHost cpHost = this.env.getCoprocessorHost();
-                    for (RegionCoprocessor cp : cpHost.findCoprocessors(RegionCoprocessor.class)) {
-                        if (cp instanceof AccessControlService.Interface && cp instanceof MasterObserver) {
-                            accessControllers.add((MasterObserver)cp);
-                        }
-                    }
+        ArrayList<MasterObserver> oldAccessControllers = accessControllers.get();
+        if (oldAccessControllers == null) {
+            oldAccessControllers = new ArrayList<>();
+            RegionCoprocessorHost cpHost = this.env.getCoprocessorHost();
+            for (RegionCoprocessor cp : cpHost.findCoprocessors(RegionCoprocessor.class)) {
+                if (cp instanceof AccessControlService.Interface && cp instanceof MasterObserver) {
+                    oldAccessControllers.add((MasterObserver)cp);
                 }
             }
+            accessControllers.set(oldAccessControllers);
         }
-        return accessControllers;
+        return accessControllers.get();
     }
 
     public ObserverContext<MasterCoprocessorEnvironment> getMasterObsevrverContext() throws IOException {