This is an automated email from the ASF dual-hosted git repository. lhotari pushed a commit to branch branch-4.15 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit beae5f9c1ca3c0bdff38e311a6004756bec170ac Author: lifepuzzlefun <[email protected]> AuthorDate: Wed Apr 16 17:36:57 2025 +0800 Reduce metadataLock contention in LedgerHandle (#4549) (cherry picked from commit b10aec21bf35eefb73b96e95028eab7d759209f6) --- .../org/apache/bookkeeper/client/LedgerHandle.java | 28 +++++++++++++++------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java index e1609921f1..adf8b80351 100644 --- a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java +++ b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java @@ -1861,19 +1861,24 @@ public class LedgerHandle implements WriteHandle { } void maybeHandleDelayedWriteBookieFailure() { + Map<Integer, BookieId> toReplace = null; synchronized (metadataLock) { if (delayedWriteFailedBookies.isEmpty()) { return; } - Map<Integer, BookieId> toReplace = new HashMap<>(delayedWriteFailedBookies); + toReplace = new HashMap<>(delayedWriteFailedBookies); delayedWriteFailedBookies.clear(); + } - // Original intent of this change is to do a best-effort ensemble change. - // But this is not possible until the local metadata is completely immutable. - // Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use - // handleBookieFailure() to handle delayed writes as regular bookie failures. - handleBookieFailure(toReplace); + if (toReplace.isEmpty()) { + return; } + + // Original intent of this change is to do a best-effort ensemble change. + // But this is not possible until the local metadata is completely immutable. + // Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use + // handleBookieFailure() to handle delayed writes as regular bookie failures. + handleBookieFailure(toReplace); } void handleBookieFailure(final Map<Integer, BookieId> failedBookies) { @@ -1991,12 +1996,12 @@ public class LedgerHandle implements WriteHandle { List<BookieId> newEnsemble = null; Set<Integer> replaced = null; + + Map<Integer, BookieId> toReplace = null; synchronized (metadataLock) { if (!delayedWriteFailedBookies.isEmpty()) { - Map<Integer, BookieId> toReplace = new HashMap<>(delayedWriteFailedBookies); + toReplace = new HashMap<>(delayedWriteFailedBookies); delayedWriteFailedBookies.clear(); - - ensembleChangeLoop(origEnsemble, toReplace); } else { newEnsemble = getCurrentEnsemble(); replaced = EnsembleUtils.diffEnsemble(origEnsemble, newEnsemble); @@ -2005,6 +2010,11 @@ public class LedgerHandle implements WriteHandle { changingEnsemble = false; } } + + if (toReplace != null && !toReplace.isEmpty()) { + ensembleChangeLoop(origEnsemble, toReplace); + } + if (newEnsemble != null) { // unsetSuccess outside of lock unsetSuccessAndSendWriteRequest(newEnsemble, replaced); }
