From d2722ebd65877c4ff0f30422aad47eb1bb20b33d 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 | 13 +++++-------- 1 file changed, 5 insertions(+), 8 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 8d8a4e0d68cab..5e3f522a80178 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 @@ -3218,13 +3220,8 @@ public PositionImpl getPreviousPosition(PositionImpl position) { } } - 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); } /**