You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by pe...@apache.org on 2022/10/25 14:05:53 UTC

[pulsar] branch master updated: [fix][meta] fix getChildren in MemoryMetadataStore and EtcdMetadataStore (#18172)

This is an automated email from the ASF dual-hosted git repository.

penghui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 4ffa74161af  [fix][meta] fix getChildren in MemoryMetadataStore and EtcdMetadataStore (#18172)
4ffa74161af is described below

commit 4ffa74161af9e3e38e6dc005e732a9b884c4ee61
Author: Cong Zhao <zh...@apache.org>
AuthorDate: Tue Oct 25 22:05:39 2022 +0800

     [fix][meta] fix getChildren in MemoryMetadataStore and EtcdMetadataStore (#18172)
---
 .../pulsar/metadata/impl/EtcdMetadataStore.java    |  5 ++--
 .../metadata/impl/LocalMemoryMetadataStore.java    |  2 +-
 .../apache/pulsar/metadata/MetadataStoreTest.java  | 29 ++++++++++++++++++++++
 .../impl/LocalMemoryMetadataStoreTest.java         |  4 +--
 4 files changed, 35 insertions(+), 5 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 147eb128bd0..7ab34ba608b 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
@@ -385,11 +385,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 302bf290772..e682300612d 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
@@ -129,7 +129,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 ede6ba708a1..ece23583c4d 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
@@ -28,6 +28,7 @@ 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;
@@ -500,4 +501,32 @@ 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) ? Set.of("a", "b", "zookeeper") : Set.of("a", "b");
+        for (String subPath : subPaths) {
+            assertTrue(expectedSet.contains(subPath));
+        }
+
+        List<String> subPaths2 = store.getChildren("/a").get();
+        Set<String> expectedSet2 = Set.of("a-1", "a-2");
+        for (String subPath : subPaths2) {
+            assertTrue(expectedSet2.contains(subPath));
+        }
+
+        List<String> subPaths3 = store.getChildren("/b").get();
+        Set<String> expectedSet3 = Set.of("c");
+        for (String subPath : subPaths3) {
+            assertTrue(expectedSet3.contains(subPath));
+        }
+    }
 }
diff --git a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStoreTest.java b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStoreTest.java
index cc813b0686a..3fabe9647eb 100644
--- a/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStoreTest.java
+++ b/pulsar-metadata/src/test/java/org/apache/pulsar/metadata/impl/LocalMemoryMetadataStoreTest.java
@@ -86,7 +86,7 @@ public class LocalMemoryMetadataStoreTest {
             assertEquals((long) event2.getExpectedVersion(), exptectedVersion);
             assertEquals(event2.getType(), NotificationType.Modified);
         }
-        
+
         // (3) delete node
         sync.notifiedEvents.remove(path);
         store1.delete(path, Optional.of(exptectedVersion)).join();
@@ -176,7 +176,7 @@ public class LocalMemoryMetadataStoreTest {
         store1.put(path, value1, Optional.empty()).join();
 
         assertTrue(store1.exists(path).join());
-        
+
         Stat stats = store1.get(path).get().get().getStat();
         MetadataEvent event = new MetadataEvent(path, value2, EMPTY_SET, stats.getVersion(),
                 stats.getModificationTimestamp() + 1, sync.clusterName, NotificationType.Modified);