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 f3a49d31a61..68c6adb0b01 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.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 void checkLedger(final LedgerHandle lh, if (curEntryId == lastEntry) { final long entryToRead = curEntryId; + final CompletableFuture future = new CompletableFuture<>(); + future.whenCompleteAsync((re, ex) -> { + checkFragments(fragments, cb, percentageOfLedgerFragmentToBeVerified); + }); + final EntryExistsCallback eecb = new EntryExistsCallback(lh.getLedgerMetadata().getWriteQuorumSize(), new GenericCallback() { @Override @@ -432,8 +438,7 @@ public void operationComplete(int rc, Boolean result) { 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 4fa37978565..4f3ee9fc9ca 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 @@ -517,7 +517,7 @@ public void testVerifyLedgerFragmentSkipsUnavailableBookie() throws Exception { private Set 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 result = cb.waitAndGetResult();