Skip to content

Commit 84ca507

Browse files
lifepuzzlefunlhotari
authored andcommitted
Reduce metadataLock contention in LedgerHandle (#4549)
(cherry picked from commit b10aec2)
1 parent a18dc64 commit 84ca507

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerHandle.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1849,19 +1849,24 @@ void notifyWriteFailed(int index, BookieId addr) {
18491849
}
18501850

18511851
void maybeHandleDelayedWriteBookieFailure() {
1852+
Map<Integer, BookieId> toReplace = null;
18521853
synchronized (metadataLock) {
18531854
if (delayedWriteFailedBookies.isEmpty()) {
18541855
return;
18551856
}
1856-
Map<Integer, BookieId> toReplace = new HashMap<>(delayedWriteFailedBookies);
1857+
toReplace = new HashMap<>(delayedWriteFailedBookies);
18571858
delayedWriteFailedBookies.clear();
1859+
}
18581860

1859-
// Original intent of this change is to do a best-effort ensemble change.
1860-
// But this is not possible until the local metadata is completely immutable.
1861-
// Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use
1862-
// handleBookieFailure() to handle delayed writes as regular bookie failures.
1863-
handleBookieFailure(toReplace);
1861+
if (toReplace.isEmpty()) {
1862+
return;
18641863
}
1864+
1865+
// Original intent of this change is to do a best-effort ensemble change.
1866+
// But this is not possible until the local metadata is completely immutable.
1867+
// Until the feature "Make LedgerMetadata Immutable #610" Is complete we will use
1868+
// handleBookieFailure() to handle delayed writes as regular bookie failures.
1869+
handleBookieFailure(toReplace);
18651870
}
18661871

18671872
void handleBookieFailure(final Map<Integer, BookieId> failedBookies) {
@@ -1980,12 +1985,12 @@ void ensembleChangeLoop(List<BookieId> origEnsemble, Map<Integer, BookieId> fail
19801985

19811986
List<BookieId> newEnsemble = null;
19821987
Set<Integer> replaced = null;
1988+
1989+
Map<Integer, BookieId> toReplace = null;
19831990
synchronized (metadataLock) {
19841991
if (!delayedWriteFailedBookies.isEmpty()) {
1985-
Map<Integer, BookieId> toReplace = new HashMap<>(delayedWriteFailedBookies);
1992+
toReplace = new HashMap<>(delayedWriteFailedBookies);
19861993
delayedWriteFailedBookies.clear();
1987-
1988-
ensembleChangeLoop(origEnsemble, toReplace);
19891994
} else {
19901995
newEnsemble = getCurrentEnsemble();
19911996
replaced = EnsembleUtils.diffEnsemble(origEnsemble, newEnsemble);
@@ -1994,6 +1999,11 @@ void ensembleChangeLoop(List<BookieId> origEnsemble, Map<Integer, BookieId> fail
19941999
changingEnsemble = false;
19952000
}
19962001
}
2002+
2003+
if (toReplace != null && !toReplace.isEmpty()) {
2004+
ensembleChangeLoop(origEnsemble, toReplace);
2005+
}
2006+
19972007
if (newEnsemble != null) { // unsetSuccess outside of lock
19982008
unsetSuccessAndSendWriteRequest(newEnsemble, replaced);
19992009
}

0 commit comments

Comments
 (0)