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);
                         }

Reply via email to