Skip to content

Commit 40d5af4

Browse files
authored
[fix][meta] Fix ephemeral Zookeeper put which creates a persistent znode (#23984)
1 parent 5443c69 commit 40d5af4

2 files changed

Lines changed: 36 additions & 2 deletions

File tree

pulsar-metadata/src/main/java/org/apache/pulsar/metadata/impl/ZKMetadataStore.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,8 +439,8 @@ private void internalStorePut(OpPut opPut) {
439439
future.completeExceptionally(getException(Code.BADVERSION, opPut.getPath()));
440440
} else {
441441
// The z-node does not exist, let's create it first
442-
put(opPut.getPath(), opPut.getData(), Optional.of(-1L)).thenAccept(
443-
s -> future.complete(s))
442+
put(opPut.getPath(), opPut.getData(), Optional.of(-1L), opPut.getOptions())
443+
.thenAccept(s -> future.complete(s))
444444
.exceptionally(ex -> {
445445
if (ex.getCause() instanceof BadVersionException) {
446446
// The z-node exist now, let's overwrite it

pulsar-metadata/src/test/java/org/apache/pulsar/metadata/MetadataStoreExtendedTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,38 @@ public void sequentialKeys(String provider, Supplier<String> urlSupplier) throws
6666
assertNotEquals(seq1, seq2);
6767
assertTrue(n1 < n2);
6868
}
69+
70+
@Test(dataProvider = "impl")
71+
public void testPersistentOrEphemeralPut(String provider, Supplier<String> urlSupplier) throws Exception {
72+
final String key1 = newKey();
73+
MetadataStoreExtended store = MetadataStoreExtended.create(urlSupplier.get(), MetadataStoreConfig.builder().build());
74+
store.put(key1, "value-1".getBytes(), Optional.empty(), EnumSet.noneOf(CreateOption.class)).join();
75+
var value = store.get(key1).join().get();
76+
assertEquals(value.getValue(), "value-1".getBytes());
77+
// assertFalse(value.getStat().isEphemeral()); // Todo : fix zkStat.getEphemeralOwner() != 0 from test zk
78+
assertTrue(value.getStat().isFirstVersion());
79+
var version = value.getStat().getVersion();
80+
81+
store.put(key1, "value-2".getBytes(), Optional.empty(), EnumSet.noneOf(CreateOption.class)).join();
82+
value = store.get(key1).join().get();
83+
assertEquals(value.getValue(), "value-2".getBytes());
84+
//assertFalse(value.getStat().isEphemeral()); // Todo : fix zkStat.getEphemeralOwner() != 0 from test zk
85+
assertEquals(value.getStat().getVersion(), version + 1);
86+
87+
final String key2 = newKey();
88+
store.put(key2, "value-4".getBytes(), Optional.empty(), EnumSet.of(CreateOption.Ephemeral)).join();
89+
value = store.get(key2).join().get();
90+
assertEquals(value.getValue(), "value-4".getBytes());
91+
assertTrue(value.getStat().isEphemeral());
92+
assertTrue(value.getStat().isFirstVersion());
93+
version = value.getStat().getVersion();
94+
95+
96+
store.put(key2, "value-5".getBytes(), Optional.empty(), EnumSet.of(CreateOption.Ephemeral)).join();
97+
value = store.get(key2).join().get();
98+
assertEquals(value.getValue(), "value-5".getBytes());
99+
assertTrue(value.getStat().isEphemeral());
100+
assertEquals(value.getStat().getVersion(), version + 1);
101+
}
102+
69103
}

0 commit comments

Comments
 (0)