This is an automated email from the ASF dual-hosted git repository. mattisonchao pushed a commit to branch branch-2.9 in repository https://gitbox.apache.org/repos/asf/pulsar.git
commit 6f33cdea0543a00412a0b5fb1fa3ea4e3c80bb7d Author: yapeng <[email protected]> AuthorDate: Wed Jul 27 10:01:33 2022 +0800 [fix][broker] Fix stats-internal with option -m cause active ledger recover then close (#16662) (cherry picked from commit b3bced282d647a47f9fd60db35390cc6348d25dc) --- .../bookkeeper/mledger/impl/ManagedLedgerImpl.java | 17 +++++++++++++++-- .../bookkeeper/mledger/impl/ManagedLedgerTest.java | 17 +++++++++++++++++ 2 files changed, 32 insertions(+), 2 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 0f879b057a9..28232f31b17 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 @@ -1726,7 +1726,12 @@ public class ManagedLedgerImpl implements ManagedLedger, CreateCallback { } public CompletableFuture<String> getLedgerMetadata(long ledgerId) { - return getLedgerHandle(ledgerId).thenApply(rh -> rh.getLedgerMetadata().toSafeString()); + LedgerHandle currentLedger = this.currentLedger; + if (currentLedger != null && ledgerId == currentLedger.getId()) { + return CompletableFuture.completedFuture(currentLedger.getLedgerMetadata().toSafeString()); + } else { + return getLedgerHandle(ledgerId).thenApply(rh -> rh.getLedgerMetadata().toSafeString()); + } } @Override @@ -4006,7 +4011,15 @@ public class ManagedLedgerImpl implements ManagedLedger, CreateCallback { return CompletableFuture.completedFuture(Collections.emptySet()); } - return getLedgerHandle(ledgerId).thenCompose(lh -> { + CompletableFuture<ReadHandle> ledgerHandleFuture; + LedgerHandle currentLedger = this.currentLedger; + if (currentLedger != null && ledgerId == currentLedger.getId()) { + ledgerHandleFuture = CompletableFuture.completedFuture(currentLedger); + } else { + ledgerHandleFuture = getLedgerHandle(ledgerId); + } + + return ledgerHandleFuture.thenCompose(lh -> { Set<BookieId> ensembles = new HashSet<>(); lh.getLedgerMetadata().getAllEnsembles().values().forEach(ensembles::addAll); return CompletableFuture.completedFuture(ensembles); 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 317fb7e2b30..ae835dccb3f 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 @@ -3519,4 +3519,21 @@ public class ManagedLedgerTest extends MockedBookKeeperTestCase { Assert.assertFalse(ledgerInfo.get(100, TimeUnit.MILLISECONDS).getOffloadContext().getComplete()); }); } + + @Test + public void testGetLedgerMetadata() throws Exception { + ManagedLedgerImpl managedLedger = (ManagedLedgerImpl) factory.open("testGetLedgerMetadata"); + long lastLedger = managedLedger.ledgers.lastEntry().getKey(); + managedLedger.getLedgerMetadata(lastLedger); + Assert.assertFalse(managedLedger.ledgerCache.containsKey(lastLedger)); + } + + @Test + public void testGetEnsemblesAsync() throws Exception { + // test getEnsemblesAsync of latest ledger will not open it twice and put it in ledgerCache. + ManagedLedgerImpl managedLedger = (ManagedLedgerImpl) factory.open("testGetLedgerMetadata"); + long lastLedger = managedLedger.ledgers.lastEntry().getKey(); + managedLedger.getEnsemblesAsync(lastLedger).join(); + Assert.assertFalse(managedLedger.ledgerCache.containsKey(lastLedger)); + } }
