This is an automated email from the ASF dual-hosted git repository. nicoloboschi pushed a commit to branch branch-4.16 in repository https://gitbox.apache.org/repos/asf/bookkeeper.git
commit 963a5408158b9afcc544f7d5fd76995ea9aebb0c Author: Kang Zou <[email protected]> AuthorDate: Fri Mar 22 00:12:02 2024 +0800 Issue 4200: fix flaky test DeferredSyncTest.testForceWillAdvanceLacOnlyUpToLastAcknoledgedWrite (#4234) * Issue 4200: fix flaky test DeferredSyncTest.testForceWillAdvanceLacOnlyUpToLastAcknoledgedWrite * add a comment (cherry picked from commit 37708ade69129db1ff05bfd82d1f4f5b75593053) --- .../bookkeeper/client/MockBookKeeperTestCase.java | 27 ++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java index e771012470..97c690dae1 100644 --- a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java +++ b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/MockBookKeeperTestCase.java @@ -301,8 +301,15 @@ public abstract class MockBookKeeperTestCase { } protected void resumeBookieWriteAcks(BookieId address) { - suspendedBookiesForForceLedgerAcks.remove(address); - List<Runnable> pendingResponses = deferredBookieForceLedgerResponses.remove(address); + List<Runnable> pendingResponses; + + // why use the BookieId instance as the object monitor? there is a date race problem if not + // see https://github.com/apache/bookkeeper/issues/4200 + synchronized (address) { + suspendedBookiesForForceLedgerAcks.remove(address); + pendingResponses = deferredBookieForceLedgerResponses.remove(address); + } + if (pendingResponses != null) { pendingResponses.forEach(Runnable::run); } @@ -654,11 +661,17 @@ public abstract class MockBookKeeperTestCase { callback.forceLedgerComplete(BKException.Code.OK, ledgerId, bookieSocketAddress, ctx); }); }; - if (suspendedBookiesForForceLedgerAcks.contains(bookieSocketAddress)) { - List<Runnable> queue = deferredBookieForceLedgerResponses.computeIfAbsent(bookieSocketAddress, - (k) -> new CopyOnWriteArrayList<>()); - queue.add(activity); - } else { + List<Runnable> queue = null; + + synchronized (bookieSocketAddress) { + if (suspendedBookiesForForceLedgerAcks.contains(bookieSocketAddress)) { + queue = deferredBookieForceLedgerResponses.computeIfAbsent(bookieSocketAddress, + (k) -> new CopyOnWriteArrayList<>()); + queue.add(activity); + } + } + + if (queue == null) { activity.run(); } return null;
