You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by da...@apache.org on 2026/07/23 04:42:59 UTC
(pulsar) branch master updated: [fix][ml] Preserve ledger properties when closing ledger (#26227)
This is an automated email from the ASF dual-hosted git repository.
dao-jun 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 79a2c6ff5641 [fix][ml] Preserve ledger properties when closing ledger (#26227)
79a2c6ff5641 is described below
commit 79a2c6ff5641fb6fae01576c51d730ed59cdebe1
Author: 道君- Tao Jiuming <da...@apache.org>
AuthorDate: Thu Jul 23 12:42:53 2026 +0800
[fix][ml] Preserve ledger properties when closing ledger (#26227)
---
.../bookkeeper/mledger/impl/ManagedLedgerImpl.java | 12 ++++++--
.../bookkeeper/mledger/impl/ManagedLedgerTest.java | 36 ++++++++++++----------
2 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java
index 26fdb458a21b..91bc3a7543ae 100644
--- a/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java
+++ b/managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java
@@ -1969,9 +1969,15 @@ public class ManagedLedgerImpl implements ManagedLedger, CreateCallback {
long entriesInLedger = lastAddConfirmed != null ? lastAddConfirmed + 1 : lh.getLastAddConfirmed() + 1;
log.debug().attr("ledgerId", lh.getId()).attr("entries", entriesInLedger).log("Ledger has been closed");
if (entriesInLedger > 0) {
- LedgerInfo info = new LedgerInfo().setLedgerId(lh.getId()).setEntries(entriesInLedger)
- .setSize(lh.getLength()).setTimestamp(clock.millis());
- ledgers.put(lh.getId(), info);
+ ledgers.compute(lh.getId(), (ledgerId, oldInfo) -> {
+ LedgerInfo info = new LedgerInfo();
+ if (oldInfo != null) {
+ info.copyFrom(oldInfo);
+ } else {
+ info.setLedgerId(ledgerId);
+ }
+ return info.setEntries(entriesInLedger).setSize(lh.getLength()).setTimestamp(clock.millis());
+ });
} else {
// The last ledger was empty, so we can discard it
ledgers.remove(lh.getId());
diff --git a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
index f186d5ca1765..dd110f5c913f 100644
--- a/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
+++ b/managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerTest.java
@@ -4788,30 +4788,27 @@ public class ManagedLedgerTest extends MockedBookKeeperTestCase {
private ManagedLedger testSetLedgerProperty0(String name) throws Exception {
ManagedLedgerConfig config = new ManagedLedgerConfig();
config.setMaxEntriesPerLedger(2);
+ config.setMinimumRolloverTime(0, TimeUnit.SECONDS);
ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open(name, config);
ml.addEntry("entry-1".getBytes());
+ long firstLedger = ml.ledgers.firstKey();
+ ml.asyncAddLedgerProperty(firstLedger, "key1", "value1").join();
ml.addEntry("entry-2".getBytes());
ml.addEntry("entry-3".getBytes());
+ long lastLedger = ml.ledgers.lastKey();
+ ml.asyncAddLedgerProperty(lastLedger, "key2", "value2").join();
- Assert.assertEquals(ml.getLedgersInfo().size(), 2);
- long firstLedger = ml.getLedgersInfo().firstKey();
- LedgerInfo firstLedgerInfo = ml.getLedgersInfo().get(firstLedger);
- Assert.assertEquals(firstLedgerInfo.getPropertiesCount(), 0);
- long lastLedger = ml.getLedgersInfo().lastKey();
- LedgerInfo lastLedgerInfo = ml.getLedgersInfo().get(lastLedger);
- Assert.assertEquals(lastLedgerInfo.getPropertiesCount(), 0);
-
- ml.asyncAddLedgerProperty(firstLedger, "key1", "value1").get();
- ml.asyncAddLedgerProperty(lastLedger, "key2", "value2").get();
-
- firstLedgerInfo = ml.getLedgersInfo().get(firstLedger);
- Assert.assertEquals(firstLedgerInfo.getPropertiesCount(), 1);
- Assert.assertEquals(ml.asyncGetLedgerProperty(firstLedger, "key1").get(), "value1");
+ Assert.assertNotEquals(firstLedger, lastLedger);
+ LedgerInfo firstLedgerInfo = ml.ledgers.get(firstLedger);
+ Assert.assertEquals(firstLedgerInfo.getEntries(), 2);
- lastLedgerInfo = ml.getLedgersInfo().get(lastLedger);
- Assert.assertEquals(lastLedgerInfo.getPropertiesCount(), 1);
- Assert.assertEquals(ml.asyncGetLedgerProperty(lastLedger, "key2").get(), "value2");
+ ml.asyncAddLedgerProperty(firstLedger, "key3", "value3").join();
+ ml.asyncAddLedgerProperty(lastLedger, "key4", "value4").join();
+ Assert.assertEquals(ml.asyncGetLedgerProperty(firstLedger, "key1").join(), "value1");
+ Assert.assertEquals(ml.asyncGetLedgerProperty(firstLedger, "key3").join(), "value3");
+ Assert.assertEquals(ml.asyncGetLedgerProperty(lastLedger, "key2").join(), "value2");
+ Assert.assertEquals(ml.asyncGetLedgerProperty(lastLedger, "key4").join(), "value4");
return ml;
}
@@ -4825,6 +4822,11 @@ public class ManagedLedgerTest extends MockedBookKeeperTestCase {
ml.asyncRemoveLedgerProperty(firstLedger, "key1").get();
ml.asyncRemoveLedgerProperty(lastLedger, "key2").get();
+ Assert.assertEquals(ml.getLedgersInfo().get(firstLedger).getPropertiesCount(), 1);
+ Assert.assertEquals(ml.getLedgersInfo().get(lastLedger).getPropertiesCount(), 1);
+
+ ml.asyncRemoveLedgerProperty(firstLedger, "key3").get();
+ ml.asyncRemoveLedgerProperty(lastLedger, "key4").get();
Assert.assertEquals(ml.getLedgersInfo().get(firstLedger).getPropertiesCount(), 0);
Assert.assertEquals(ml.getLedgersInfo().get(lastLedger).getPropertiesCount(), 0);
}