Skip to content

Commit 342b65d

Browse files
committed
[fix]Fix entry loss due to incorrect lock of LedgerHandle
1 parent 0621ae6 commit 342b65d

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/HandleFactoryImpl.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,18 @@ class HandleFactoryImpl implements HandleFactory, LedgerDeletionListener {
5353
@Override
5454
public LedgerDescriptor getHandle(final long ledgerId, final byte[] masterKey, boolean journalReplay)
5555
throws IOException, BookieException {
56-
LedgerDescriptor handle = ledgers.get(ledgerId);
57-
58-
if (handle == null) {
59-
if (!journalReplay && recentlyFencedAndDeletedLedgers.getIfPresent(ledgerId) != null) {
60-
throw BookieException.create(BookieException.Code.LedgerFencedAndDeletedException);
56+
if (!ledgers.containsKey(ledgerId)) {
57+
synchronized (ledgers) {
58+
if (!ledgers.containsKey(ledgerId)) {
59+
if (!journalReplay && recentlyFencedAndDeletedLedgers.getIfPresent(ledgerId) != null) {
60+
throw BookieException.create(BookieException.Code.LedgerFencedAndDeletedException);
61+
}
62+
LedgerDescriptor handle = LedgerDescriptor.create(masterKey, ledgerId, ledgerStorage);
63+
ledgers.putIfAbsent(ledgerId, handle);
64+
}
6165
}
62-
handle = LedgerDescriptor.create(masterKey, ledgerId, ledgerStorage);
63-
ledgers.putIfAbsent(ledgerId, handle);
6466
}
65-
67+
LedgerDescriptor handle = ledgers.get(ledgerId);
6668
handle.checkAccess(masterKey);
6769
return handle;
6870
}

0 commit comments

Comments
 (0)