This is an automated email from the ASF dual-hosted git repository.
xiangying pushed a commit to branch branch-2.10
in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/branch-2.10 by this push:
new 3792d63f7ec [fix][meta] fix getChildren in MemoryMetadataStore and
EtcdMetadataStore (#18172)
3792d63f7ec is described below
commit 3792d63f7ecac508ab4c548837b46e7dd5003e6e
Author: Cong Zhao <[email protected]>
AuthorDate: Tue Oct 25 22:05:39 2022 +0800
[fix][meta] fix getChildren in MemoryMetadataStore and EtcdMetadataStore
(#18172)
(cherry picked from commit 4ffa74161af9e3e38e6dc005e732a9b884c4ee61)
---
.../pulsar/metadata/impl/EtcdMetadataStore.java | 5 ++--
.../metadata/impl/LocalMemoryMetadataStore.java | 2 +-
.../apache/pulsar/metadata/MetadataStoreTest.java | 31 ++++++++++++++++++++++
3 files changed, 35 insertions(+), 3 deletions(-)
diff --git
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
index e1c26bead09..2ae1d778ff0 100644
---
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
+++
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/EtcdMetadataStore.java
@@ -338,11 +338,12 @@ public class EtcdMetadataStore extends
AbstractBatchedMetadataStore {
case GET_CHILDREN: {
OpGetChildren getChildren = op.asGetChildren();
GetResponse gr =
txnResponse.getGetResponses().get(getIdx++);
- String basePath = getChildren.getPath() + "/";
+ String basePath =
+ getChildren.getPath().equals("/") ? "/" :
getChildren.getPath() + "/";
Set<String> children = gr.getKvs().stream()
.map(kv ->
kv.getKey().toString(StandardCharsets.UTF_8))
- .map(p -> p.replace(basePath, ""))
+ .map(p -> p.replaceFirst(basePath, ""))
// Only return first-level children
.map(k -> k.split("/", 2)[0])
.collect(Collectors.toCollection(TreeSet::new));
diff --git
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStore.java
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStore.java
index 63efba8f724..1663fb5c041 100644
---
a/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStore.java
+++
b/pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStore.java
@@ -123,7 +123,7 @@ public class LocalMemoryMetadataStore extends
AbstractMetadataStore implements M
Set<String> children = new TreeSet<>();
map.subMap(firstKey, false, lastKey, false).forEach((key, value)
-> {
- String relativePath = key.replace(firstKey, "");
+ String relativePath = key.replaceFirst(firstKey, "");
// Only return first-level children
String child = relativePath.split("/", 2)[0];
diff --git
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataStoreTest.java
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataStoreTest.java
index f4e5bf779ba..a06b8e813e8 100644
---
a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataStoreTest.java
+++
b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataStoreTest.java
@@ -23,11 +23,13 @@ import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
+import com.google.common.collect.Sets;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
@@ -479,4 +481,33 @@ public class MetadataStoreTest extends
BaseMetadataStoreTest {
assertTrue(f1.isCompletedExceptionally() &&
!f2.isCompletedExceptionally() ||
! f1.isCompletedExceptionally() &&
f2.isCompletedExceptionally());
}
+
+ @Test(dataProvider = "impl")
+ public void testGetChildren(String provider, Supplier<String> urlSupplier)
throws Exception {
+ @Cleanup
+ MetadataStore store = MetadataStoreFactory.create(urlSupplier.get(),
MetadataStoreConfig.builder().build());
+
+ store.put("/a/a-1", "value1".getBytes(StandardCharsets.UTF_8),
Optional.empty()).join();
+ store.put("/a/a-2", "value1".getBytes(StandardCharsets.UTF_8),
Optional.empty()).join();
+ store.put("/b/c/b/1", "value1".getBytes(StandardCharsets.UTF_8),
Optional.empty()).join();
+
+ List<String> subPaths = store.getChildren("/").get();
+ Set<String> expectedSet = "ZooKeeper".equals(provider) ?
Sets.newHashSet("a", "b", "zookeeper") :
+ Sets.newHashSet("a", "b");
+ for (String subPath : subPaths) {
+ assertTrue(expectedSet.contains(subPath));
+ }
+
+ List<String> subPaths2 = store.getChildren("/a").get();
+ Set<String> expectedSet2 = Sets.newHashSet("a-1", "a-2");
+ for (String subPath : subPaths2) {
+ assertTrue(expectedSet2.contains(subPath));
+ }
+
+ List<String> subPaths3 = store.getChildren("/b").get();
+ Set<String> expectedSet3 = Sets.newHashSet("c");
+ for (String subPath : subPaths3) {
+ assertTrue(expectedSet3.contains(subPath));
+ }
+ }
}