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);