You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by ma...@apache.org on 2021/07/18 07:18:00 UTC
[zookeeper] branch master updated: ZOOKEEPER-4325: Fix bug when
list "/" with ZkUtil::listSubTreeBFS
This is an automated email from the ASF dual-hosted git repository.
maoling pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new 2aa17ff ZOOKEEPER-4325: Fix bug when list "/" with ZkUtil::listSubTreeBFS
2aa17ff is described below
commit 2aa17ffe428b9ac8477cedfed293b18f12c2376e
Author: autumind <sh...@mobcb.com>
AuthorDate: Sun Jul 18 15:17:50 2021 +0800
ZOOKEEPER-4325: Fix bug when list "/" with ZkUtil::listSubTreeBFS
Fix bug [ZOOKEEPER-4325](https://issues.apache.org/jira/browse/ZOOKEEPER-4325), re-create PR from [#1719](https://github.com/apache/zookeeper/pull/1719)
Author: autumind <sh...@mobcb.com>
Reviewers: maoling <ma...@apache.org>
Closes #1729 from autumind/master
---
.../src/main/java/org/apache/zookeeper/ZKUtil.java | 3 +-
.../test/java/org/apache/zookeeper/ZKUtilTest.java | 36 +++++++++++++++++++++-
2 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java b/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
index fd35ae3..d206341 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/ZKUtil.java
@@ -193,7 +193,8 @@ public class ZKUtil {
String node = queue.poll();
List<String> children = zk.getChildren(node, false);
for (final String child : children) {
- final String childPath = node + "/" + child;
+ // Fix IllegalArgumentException when list "/".
+ final String childPath = (node.equals("/") ? "" : node) + "/" + child;
queue.add(childPath);
tree.add(childPath);
}
diff --git a/zookeeper-server/src/test/java/org/apache/zookeeper/ZKUtilTest.java b/zookeeper-server/src/test/java/org/apache/zookeeper/ZKUtilTest.java
index 1111c2a..51df907 100644
--- a/zookeeper-server/src/test/java/org/apache/zookeeper/ZKUtilTest.java
+++ b/zookeeper-server/src/test/java/org/apache/zookeeper/ZKUtilTest.java
@@ -20,15 +20,20 @@ package org.apache.zookeeper;
import static org.junit.Assume.assumeTrue;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertIterableEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.io.File;
import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
import java.util.UUID;
+import org.apache.zookeeper.test.ClientBase;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
-public class ZKUtilTest {
+public class ZKUtilTest extends ClientBase {
private static final File testData = new File(System.getProperty("test.data.dir", "build/test/data"));
@@ -85,4 +90,33 @@ public class ZKUtilTest {
assertEquals(expectedMessage, error);
}
+ @Test
+ public void testListRootPathSuccess() throws IOException, InterruptedException, KeeperException {
+ TestableZooKeeper zk = createClient();
+ zk.setData("/", "some".getBytes(), -1);
+ zk.create("/a", "some".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+ zk.create("/a/b", "some".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+
+ List<String> list = ZKUtil.listSubTreeBFS(zk, "/");
+ list.remove(Quotas.procZookeeper);
+ list.remove(Quotas.quotaZookeeper);
+ list.remove(ZooDefs.CONFIG_NODE);
+ assertEquals(3, list.size());
+ assertIterableEquals(Arrays.asList("/", "/a", "/a/b"), list);
+ }
+
+ @Test
+ public void testListNoneRootPathSuccess() throws IOException, InterruptedException, KeeperException {
+ TestableZooKeeper zk = createClient();
+ zk.setData("/", "some".getBytes(), -1);
+ zk.create("/a", "some".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+ zk.create("/a/b", "some".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
+ List<String> aList = ZKUtil.listSubTreeBFS(zk, "/a");
+ assertEquals(2, aList.size());
+ assertIterableEquals(Arrays.asList("/a", "/a/b"), aList);
+
+ List<String> bList = ZKUtil.listSubTreeBFS(zk, "/a/b");
+ assertEquals(1, bList.size());
+ assertIterableEquals(Collections.singletonList("/a/b"), bList);
+ }
}