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 <[email protected]>
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);
}