Repository: hbase Updated Branches: refs/heads/branch-1 ce33cf2d3 -> cec40f941
HBASE-17374 ZKPermissionWatcher crashed when grant after region close (Liu Junhong) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/cec40f94 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/cec40f94 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/cec40f94 Branch: refs/heads/branch-1 Commit: cec40f941f36f129db22adc00928907aaea9cdcb Parents: ce33cf2 Author: tedyu <[email protected]> Authored: Thu Dec 29 05:46:40 2016 -0800 Committer: tedyu <[email protected]> Committed: Thu Dec 29 05:46:40 2016 -0800 ---------------------------------------------------------------------- .../security/access/ZKPermissionWatcher.java | 23 ++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/cec40f94/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java index b3aa782..b4bf510 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java @@ -38,6 +38,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicReference; /** @@ -120,7 +121,7 @@ public class ZKPermissionWatcher extends ZooKeeperListener implements Closeable public void nodeCreated(String path) { waitUntilStarted(); if (path.equals(aclZNode)) { - executor.submit(new Runnable() { + asyncProcessNodeUpdate(new Runnable() { @Override public void run() { try { @@ -141,7 +142,7 @@ public class ZKPermissionWatcher extends ZooKeeperListener implements Closeable public void nodeDeleted(final String path) { waitUntilStarted(); if (aclZNode.equals(ZKUtil.getParent(path))) { - executor.submit(new Runnable() { + asyncProcessNodeUpdate(new Runnable() { @Override public void run() { String table = ZKUtil.getNodeName(path); @@ -159,7 +160,7 @@ public class ZKPermissionWatcher extends ZooKeeperListener implements Closeable public void nodeDataChanged(final String path) { waitUntilStarted(); if (aclZNode.equals(ZKUtil.getParent(path))) { - executor.submit(new Runnable() { + asyncProcessNodeUpdate(new Runnable() { @Override public void run() { // update cache on an existing table node @@ -198,7 +199,7 @@ public class ZKPermissionWatcher extends ZooKeeperListener implements Closeable LOG.error("Error reading data from zookeeper for path "+path, ke); watcher.abort("Zookeeper error get node children for path "+path, ke); } - executor.submit(new Runnable() { + asyncProcessNodeUpdate(new Runnable() { // allows subsequent nodeChildrenChanged event to preempt current processing of // nodeChildrenChanged event @Override @@ -211,6 +212,20 @@ public class ZKPermissionWatcher extends ZooKeeperListener implements Closeable } } + private void asyncProcessNodeUpdate(Runnable runnable) { + if (!executor.isShutdown()) { + try { + executor.submit(runnable); + } catch (RejectedExecutionException e) { + if (executor.isShutdown()) { + LOG.warn("aclZNode changed after ZKPermissionWatcher was shutdown"); + } else { + throw e; + } + } + } + } + private void refreshNodes(List<ZKUtil.NodeAndData> nodes, AtomicReference ref) { for (ZKUtil.NodeAndData n : nodes) { if (ref != null && ref.get() != null) {
