This is an automated email from the ASF dual-hosted git repository.
nicoloboschi 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 37708ade69 Issue 4200: fix flaky test
DeferredSyncTest.testForceWillAdvanceLacOnlyUpToLastAcknoledgedWrite (#4234)
37708ade69 is described below
commit 37708ade69129db1ff05bfd82d1f4f5b75593053
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
---
.../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 f43b6136c8..e1881d7477 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
@@ -303,8 +303,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);
}
@@ -656,11 +663,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;