You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by li...@apache.org on 2017/07/26 07:20:32 UTC
hbase git commit: HBASE-18441 ZookeeperWatcher#interruptedException
should throw exception
Repository: hbase
Updated Branches:
refs/heads/master 421029d0c -> 1e49decfa
HBASE-18441 ZookeeperWatcher#interruptedException should throw exception
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1e49decf
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1e49decf
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1e49decf
Branch: refs/heads/master
Commit: 1e49decfa2bc72c039ed559055d41b1c2c2b3a61
Parents: 421029d
Author: Yu Li <li...@apache.org>
Authored: Wed Jul 26 15:19:11 2017 +0800
Committer: Yu Li <li...@apache.org>
Committed: Wed Jul 26 15:19:11 2017 +0800
----------------------------------------------------------------------
.../hbase/zookeeper/ZooKeeperWatcher.java | 32 ++++++++++++--------
.../hadoop/hbase/zookeeper/TestZKUtil.java | 22 ++++++++++++++
2 files changed, 41 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/1e49decf/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.java
index f18b8ba..6bec352 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.java
@@ -207,7 +207,7 @@ public class ZooKeeperWatcher implements Watcher, Abortable, Closeable {
} catch(KeeperException.NoNodeException nne) {
return;
} catch(InterruptedException ie) {
- interruptedException(ie);
+ interruptedExceptionNoThrow(ie, false);
} catch (IOException|KeeperException e) {
LOG.warn("Received exception while checking and setting zookeeper ACLs", e);
}
@@ -587,20 +587,26 @@ public class ZooKeeperWatcher implements Watcher, Abortable, Closeable {
/**
* Handles InterruptedExceptions in client calls.
- * <p>
- * This may be temporary but for now this gives one place to deal with these.
- * <p>
- * TODO: Currently, this method does nothing.
- * Is this ever expected to happen? Do we abort or can we let it run?
- * Maybe this should be logged as WARN? It shouldn't happen?
- * <p>
- * @param ie
+ * @param ie the InterruptedException instance thrown
+ * @throws KeeperException the exception to throw, transformed from the InterruptedException
+ */
+ public void interruptedException(InterruptedException ie) throws KeeperException {
+ interruptedExceptionNoThrow(ie, true);
+ // Throw a system error exception to let upper level handle it
+ throw new KeeperException.SystemErrorException();
+ }
+
+ /**
+ * Log the InterruptedException and interrupt current thread
+ * @param ie The IterruptedException to log
+ * @param throwLater Whether we will throw the exception latter
*/
- public void interruptedException(InterruptedException ie) {
- LOG.debug(prefix("Received InterruptedException, doing nothing here"), ie);
- // At least preserver interrupt.
+ public void interruptedExceptionNoThrow(InterruptedException ie, boolean throwLater) {
+ LOG.debug(prefix("Received InterruptedException, will interrupt current thread"
+ + (throwLater ? " and rethrow a SystemErrorException" : "")),
+ ie);
+ // At least preserve interrupt.
Thread.currentThread().interrupt();
- // no-op
}
/**
http://git-wip-us.apache.org/repos/asf/hbase/blob/1e49decf/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKUtil.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKUtil.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKUtil.java
index 0e1ab92..53dcdbc 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKUtil.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/zookeeper/TestZKUtil.java
@@ -27,6 +27,7 @@ import org.apache.hadoop.hbase.ZooKeeperConnectionException;
import org.apache.hadoop.hbase.security.Superusers;
import org.apache.hadoop.hbase.testclassification.SmallTests;
import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooDefs.Perms;
import org.apache.zookeeper.data.ACL;
@@ -34,6 +35,7 @@ import org.apache.zookeeper.data.Id;
import org.junit.Assert;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.mockito.Mockito;
/**
*
@@ -93,4 +95,24 @@ public class TestZKUtil {
Assert.assertTrue(aclList.contains(new ACL(Perms.ALL, new Id("sasl", "user5"))));
Assert.assertTrue(aclList.contains(new ACL(Perms.ALL, new Id("sasl", "user6"))));
}
+
+ public void testInterruptedDuringAction()
+ throws ZooKeeperConnectionException, IOException, KeeperException, InterruptedException {
+ final RecoverableZooKeeper recoverableZk = Mockito.mock(RecoverableZooKeeper.class);
+ ZooKeeperWatcher zkw = new ZooKeeperWatcher(HBaseConfiguration.create(), "unittest", null) {
+ @Override
+ public RecoverableZooKeeper getRecoverableZooKeeper() {
+ return recoverableZk;
+ }
+ };
+ Mockito.doThrow(new InterruptedException()).when(recoverableZk)
+ .getChildren(zkw.znodePaths.baseZNode, null);
+ try {
+ ZKUtil.listChildrenNoWatch(zkw, zkw.znodePaths.baseZNode);
+ } catch (KeeperException.SystemErrorException e) {
+ // expected
+ return;
+ }
+ Assert.fail("Should have thrown KeeperException but not");
+ }
}