diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java index d2f0d04..4c029b4 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/ZKUtil.java @@ -1225,13 +1225,18 @@ public class ZKUtil { if(znode == null) { return; } + try { + createWithParents(zkw, getParent(znode)); + } catch (KeeperException.NodeExistsException nee) { + // ingore the exception because it's all right that parent znode might already exist + } zkw.getRecoverableZooKeeper().create(znode, data, createACL(zkw, znode), CreateMode.PERSISTENT); } catch(KeeperException.NodeExistsException nee) { return; - } catch(KeeperException.NoNodeException nne) { - createWithParents(zkw, getParent(znode)); - createWithParents(zkw, znode); + } catch (KeeperException.NoNodeException nee) { + // retry in case some one else deletes parent znode during after our parent znode creations + createWithParents(zkw, znode, data); } catch(InterruptedException ie) { zkw.interruptedException(ie); } diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java index 48aa625..4163a53 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/TestZooKeeper.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; @@ -282,8 +283,29 @@ public class TestZooKeeper { } /** - * Create a bunch of znodes in a hierarchy, try deleting one that has childs - * (it will fail), then delete it recursively, then delete the last znode + * Create a znode with data + * @throws Exception + */ + @Test + public void testCreateWithParents() throws Exception { + ZooKeeperWatcher zkw = + new ZooKeeperWatcher(new Configuration(TEST_UTIL.getConfiguration()), + TestZooKeeper.class.getName(), null); + byte[] expectedData = new byte[] { 1, 2, 3 }; + ZKUtil.createWithParents(zkw, "/l1/l2/l3/l4/testCreateWithParents", expectedData); + byte[] data = ZKUtil.getData(zkw, "/l1/l2/l3/l4/testCreateWithParents"); + assertTrue(Bytes.equals(expectedData, data)); + ZKUtil.deleteNodeRecursively(zkw, "/l1"); + + ZKUtil.createWithParents(zkw, "/testCreateWithParents", expectedData); + data = ZKUtil.getData(zkw, "/testCreateWithParents"); + assertTrue(Bytes.equals(expectedData, data)); + ZKUtil.deleteNodeRecursively(zkw, "/testCreateWithParents"); + } + + /** + * Create a bunch of znodes in a hierarchy, try deleting one that has childs (it will fail), then + * delete it recursively, then delete the last znode * @throws Exception */ @Test