This is an automated email from the ASF dual-hosted git repository.

eolivelli pushed a commit to branch branch-4.17
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git

commit 74c01cb9f2ce77ba72a7b7876598ae83b9ca73e5
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 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;

Reply via email to