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

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

commit 15fb058c8d6cddd8c899392c783da9145e32b7bc
Author: Masahiro Sakamoto <[email protected]>
AuthorDate: Thu Sep 29 22:39:24 2022 +0900

    Issue 3070: Fix bug where checkAllLedgers gets stuck when read throttling 
is enabled (#3214)
    
    (cherry picked from commit 21560fb9afd9da61231a709c0b86a1a7b2d0f8b0)
---
 .../main/java/org/apache/bookkeeper/client/LedgerChecker.java    | 9 +++++++--
 .../java/org/apache/bookkeeper/client/TestLedgerChecker.java     | 2 +-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
index f3a49d31a6..68c6adb0b0 100644
--- 
a/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
+++ 
b/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -425,6 +426,11 @@ public class LedgerChecker {
             if (curEntryId == lastEntry) {
                 final long entryToRead = curEntryId;
 
+                final CompletableFuture<Void> future = new 
CompletableFuture<>();
+                future.whenCompleteAsync((re, ex) -> {
+                    checkFragments(fragments, cb, 
percentageOfLedgerFragmentToBeVerified);
+                });
+
                 final EntryExistsCallback eecb = new 
EntryExistsCallback(lh.getLedgerMetadata().getWriteQuorumSize(),
                                               new GenericCallback<Boolean>() {
                                                   @Override
@@ -432,8 +438,7 @@ public class LedgerChecker {
                                                       if (result) {
                                                           
fragments.add(lastLedgerFragment);
                                                       }
-                                                      
checkFragments(fragments, cb,
-                                                          
percentageOfLedgerFragmentToBeVerified);
+                                                      future.complete(null);
                                                   }
                                               });
 
diff --git 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerChecker.java
 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerChecker.java
index d78d1599f9..43122205e9 100644
--- 
a/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerChecker.java
+++ 
b/bookkeeper-server/src/test/java/org/apache/bookkeeper/client/TestLedgerChecker.java
@@ -518,7 +518,7 @@ public class TestLedgerChecker extends 
BookKeeperClusterTestCase {
 
     private Set<LedgerFragment> getUnderReplicatedFragments(LedgerHandle lh)
             throws InterruptedException {
-        LedgerChecker checker = new LedgerChecker(bkc);
+        LedgerChecker checker = new LedgerChecker(bkc, 1);
         CheckerCallback cb = new CheckerCallback();
         checker.checkLedger(lh, cb);
         Set<LedgerFragment> result = cb.waitAndGetResult();

Reply via email to