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.ka...@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 <gjac...@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 {