Skip to content

Commit 963a540

Browse files
tmzk1005nicoloboschi
authored andcommitted
Issue 4200: fix flaky test DeferredSyncTest.testForceWillAdvanceLacOnlyUpToLastAcknoledgedWrite (#4234)
* Issue 4200: fix flaky test DeferredSyncTest.testForceWillAdvanceLacOnlyUpToLastAcknoledgedWrite * add a comment (cherry picked from commit 37708ad)
1 parent 222f42a commit 963a540

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java

+20-7
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,15 @@ protected void suspendBookieForceLedgerAcks(BookieId address) {
301301
}
302302

303303
protected void resumeBookieWriteAcks(BookieId address) {
304-
suspendedBookiesForForceLedgerAcks.remove(address);
305-
List<Runnable> pendingResponses = deferredBookieForceLedgerResponses.remove(address);
304+
List<Runnable> pendingResponses;
305+
306+
// why use the BookieId instance as the object monitor? there is a date race problem if not
307+
// see https://github.com/apache/bookkeeper/issues/4200
308+
synchronized (address) {
309+
suspendedBookiesForForceLedgerAcks.remove(address);
310+
pendingResponses = deferredBookieForceLedgerResponses.remove(address);
311+
}
312+
306313
if (pendingResponses != null) {
307314
pendingResponses.forEach(Runnable::run);
308315
}
@@ -654,11 +661,17 @@ protected void setupBookieClientForceLedger() {
654661
callback.forceLedgerComplete(BKException.Code.OK, ledgerId, bookieSocketAddress, ctx);
655662
});
656663
};
657-
if (suspendedBookiesForForceLedgerAcks.contains(bookieSocketAddress)) {
658-
List<Runnable> queue = deferredBookieForceLedgerResponses.computeIfAbsent(bookieSocketAddress,
659-
(k) -> new CopyOnWriteArrayList<>());
660-
queue.add(activity);
661-
} else {
664+
List<Runnable> queue = null;
665+
666+
synchronized (bookieSocketAddress) {
667+
if (suspendedBookiesForForceLedgerAcks.contains(bookieSocketAddress)) {
668+
queue = deferredBookieForceLedgerResponses.computeIfAbsent(bookieSocketAddress,
669+
(k) -> new CopyOnWriteArrayList<>());
670+
queue.add(activity);
671+
}
672+
}
673+
674+
if (queue == null) {
662675
activity.run();
663676
}
664677
return null;

0 commit comments

Comments
 (0)