This is an automated email from the ASF dual-hosted git repository. lhotari pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
The following commit(s) were added to refs/heads/master by this push: new b10aec21bf Reduce metadataLock contention in LedgerHandle (#4549) b10aec21bf is described below commit b10aec21bf35eefb73b96e95028eab7d759209f6 Author: lifepuzzlefun <wjl_is_...@163.com> AuthorDate: Wed Apr 16 17:36:57 2025 +0800 Reduce metadataLock contention in LedgerHandle (#4549) --- .../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 2f2526e8f2..7d1f67a2e4 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 @@ -2135,19 +2135,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) { @@ -2266,12 +2271,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); @@ -2280,6 +2285,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); }