Index: hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestTableLockManager.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestTableLockManager.java (revision 1467465) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/master/TestTableLockManager.java (working copy) @@ -44,6 +44,7 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.LargeTests; import org.apache.hadoop.hbase.ServerName; +import org.apache.hadoop.hbase.Waiter; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.coprocessor.BaseMasterObserver; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; @@ -245,11 +246,20 @@ admin.deleteTable(TABLE_NAME); //ensure that znode for the table node has been deleted - ZooKeeperWatcher zkWatcher = TEST_UTIL.getZooKeeperWatcher(); + final ZooKeeperWatcher zkWatcher = TEST_UTIL.getZooKeeperWatcher(); + final String znode = ZKUtil.joinZNode(zkWatcher.tableLockZNode, Bytes.toString(TABLE_NAME)); + + TEST_UTIL.waitFor(400, new Waiter.Predicate() { + @Override + public boolean evaluate() throws Exception { + int ver = ZKUtil.checkExists(zkWatcher, znode); + return ver < 0; + } + }); + int ver = ZKUtil.checkExists(zkWatcher, + ZKUtil.joinZNode(zkWatcher.tableLockZNode, Bytes.toString(TABLE_NAME))); + assertTrue("Unexpected znode version " + ver, ver < 0); - assertTrue(ZKUtil.checkExists(zkWatcher, - ZKUtil.joinZNode(zkWatcher.tableLockZNode, Bytes.toString(TABLE_NAME))) < 0); - } Index: hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/lock/ZKInterProcessLockBase.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/lock/ZKInterProcessLockBase.java (revision 1467465) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/zookeeper/lock/ZKInterProcessLockBase.java (working copy) @@ -285,7 +285,10 @@ } try { if (ZKUtil.checkExists(zkWatcher, lock.getPath()) != -1) { - ZKUtil.deleteNode(zkWatcher, lock.getPath(), lock.getVersion()); + boolean ret = ZKUtil.deleteNode(zkWatcher, lock.getPath(), lock.getVersion()); + if (!ret && ZKUtil.checkExists(zkWatcher, lock.getPath()) != -1) { + throw new IllegalStateException("Couldn't delete " + lock.getPath()); + } if (!acquiredLock.compareAndSet(lock, null)) { LOG.debug("Current process no longer holds " + lock + " for " + fullyQualifiedZNode);