From b8c39b3ba1430d2e8f49d65e54a0b41410c44c12 Mon Sep 17 00:00:00 2001 From: gavingaozhangmin Date: Tue, 10 Aug 2021 18:13:18 +0800 Subject: [PATCH] make a copy of ledgers --- .../bookkeeper/mledger/impl/ManagedLedgerImpl.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 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 8d8a4e0d68cab4..a5ef1749e1f382 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 @@ -53,6 +53,7 @@ import java.util.concurrent.CompletionException; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ConcurrentNavigableMap; import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; @@ -3202,8 +3203,9 @@ public PositionImpl getPreviousPosition(PositionImpl position) { return PositionImpl.get(position.getLedgerId(), position.getEntryId() - 1); } + final ConcurrentNavigableMap ledgersCopied = new ConcurrentSkipListMap<>(ledgers); // The previous position will be the last position of an earlier ledgers - NavigableMap headMap = ledgers.headMap(position.getLedgerId(), false); + NavigableMap headMap = ledgersCopied.headMap(position.getLedgerId(), false); if (headMap.isEmpty()) { // There is no previous ledger, return an invalid position in the current ledger @@ -3217,14 +3219,8 @@ public PositionImpl getPreviousPosition(PositionImpl position) { return PositionImpl.get(li.getLedgerId(), li.getEntries() - 1); } } - - Map.Entry firstLedgerEntry = headMap.firstEntry(); - if(firstLedgerEntry != null) { - // in case there are only empty ledgers, we return a position in the first one - return PositionImpl.get(firstLedgerEntry.getKey(), -1); - } else { - return PositionImpl.get(position.getLedgerId(), -1); - } + // in case there are only empty ledgers, we return a position in the first one + return PositionImpl.get(headMap.firstEntry().getKey(), -1); } /**