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 {