Skip to content

Commit 954f406

Browse files
authored
[fix] [test] Wrong mock-fail of the test ManagedLedgerErrorsTest.recoverLongTimeAfterMultipleWriteErrors (apache#19545)
1 parent e0b50c9 commit 954f406

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

managed-ledger/src/test/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerErrorsTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import java.util.concurrent.atomic.AtomicReference;
3535
import lombok.Cleanup;
3636
import org.apache.bookkeeper.client.BKException;
37+
import org.apache.bookkeeper.client.BookKeeper;
38+
import org.apache.bookkeeper.client.LedgerHandle;
3739
import org.apache.bookkeeper.client.api.DigestType;
3840
import org.apache.bookkeeper.mledger.AsyncCallbacks.AddEntryCallback;
3941
import org.apache.bookkeeper.mledger.AsyncCallbacks.CloseCallback;
@@ -48,6 +50,7 @@
4850
import org.apache.bookkeeper.test.MockedBookKeeperTestCase;
4951
import org.apache.pulsar.metadata.api.MetadataStoreException;
5052
import org.apache.pulsar.metadata.impl.FaultInjectionMetadataStore;
53+
import org.awaitility.Awaitility;
5154
import org.slf4j.Logger;
5255
import org.slf4j.LoggerFactory;
5356
import org.testng.annotations.Test;
@@ -511,9 +514,10 @@ public void recoverAfterWriteError() throws Exception {
511514
public void recoverLongTimeAfterMultipleWriteErrors() throws Exception {
512515
ManagedLedgerImpl ledger = (ManagedLedgerImpl) factory.open("recoverLongTimeAfterMultipleWriteErrors");
513516
ManagedCursor cursor = ledger.openCursor("c1");
517+
LedgerHandle firstLedger = ledger.currentLedger;
514518

515-
bkc.failAfter(0, BKException.Code.BookieHandleNotAvailableException);
516-
bkc.failAfter(1, BKException.Code.BookieHandleNotAvailableException);
519+
bkc.addEntryFailAfter(0, BKException.Code.BookieHandleNotAvailableException);
520+
bkc.addEntryFailAfter(1, BKException.Code.BookieHandleNotAvailableException);
517521

518522
CountDownLatch counter = new CountDownLatch(2);
519523
AtomicReference<ManagedLedgerException> ex = new AtomicReference<>();
@@ -540,6 +544,18 @@ public void addFailed(ManagedLedgerException exception, Object ctx) {
540544
counter.await();
541545
assertNull(ex.get());
542546

547+
Awaitility.await().untilAsserted(() -> {
548+
try {
549+
bkc.openLedger(firstLedger.getId(),
550+
BookKeeper.DigestType.fromApiDigestType(ledger.getConfig().getDigestType()),
551+
ledger.getConfig().getPassword());
552+
fail("The expected behavior is that the first ledger will be deleted, but it still exists.");
553+
} catch (Exception ledgerDeletedEx){
554+
// Expected LedgerNotExistsEx: the first ledger will be deleted after add entry fail.
555+
assertTrue(ledgerDeletedEx instanceof BKException.BKNoSuchLedgerExistsException);
556+
}
557+
});
558+
543559
assertEquals(cursor.getNumberOfEntriesInBacklog(false), 2);
544560

545561
// Ensure that we are only creating one new ledger

testmocks/src/main/java/org/apache/bookkeeper/client/PulsarMockBookKeeper.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public static Collection<BookieId> getMockEnsemble() {
9090

9191
final Queue<Long> addEntryDelaysMillis = new ConcurrentLinkedQueue<>();
9292
final List<CompletableFuture<Void>> failures = new ArrayList<>();
93+
final List<CompletableFuture<Void>> addEntryFailures = new ArrayList<>();
9394

9495
public PulsarMockBookKeeper(OrderedExecutor orderedExecutor) throws Exception {
9596
this.orderedExecutor = orderedExecutor;
@@ -317,6 +318,13 @@ synchronized boolean checkReturnEmptyLedger() {
317318
return shouldFailNow;
318319
}
319320

321+
synchronized CompletableFuture<Void> getAddEntryFailure() {
322+
if (!addEntryFailures.isEmpty()){
323+
return addEntryFailures.remove(0);
324+
}
325+
return failures.isEmpty() ? defaultResponse : failures.remove(0);
326+
}
327+
320328
synchronized CompletableFuture<Void> getProgrammedFailure() {
321329
return failures.isEmpty() ? defaultResponse : failures.remove(0);
322330
}
@@ -326,7 +334,11 @@ public void failNow(int rc) {
326334
}
327335

328336
public void failAfter(int steps, int rc) {
329-
promiseAfter(steps).completeExceptionally(BKException.create(rc));
337+
promiseAfter(steps, failures).completeExceptionally(BKException.create(rc));
338+
}
339+
340+
public void addEntryFailAfter(int steps, int rc) {
341+
promiseAfter(steps, addEntryFailures).completeExceptionally(BKException.create(rc));
330342
}
331343

332344
private int emptyLedgerAfter = -1;
@@ -339,6 +351,10 @@ public synchronized void returnEmptyLedgerAfter(int steps) {
339351
}
340352

341353
public synchronized CompletableFuture<Void> promiseAfter(int steps) {
354+
return promiseAfter(steps, failures);
355+
}
356+
357+
public synchronized CompletableFuture<Void> promiseAfter(int steps, List<CompletableFuture<Void>> failures) {
342358
while (failures.size() <= steps) {
343359
failures.add(defaultResponse);
344360
}

testmocks/src/main/java/org/apache/bookkeeper/client/PulsarMockLedgerHandle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public void asyncAddEntry(final byte[] data, final int offset, final int length,
168168

169169
@Override
170170
public void asyncAddEntry(final ByteBuf data, final AddCallback cb, final Object ctx) {
171-
bk.getProgrammedFailure().thenComposeAsync((res) -> {
171+
bk.getAddEntryFailure().thenComposeAsync((res) -> {
172172
Long delayMillis = bk.addEntryDelaysMillis.poll();
173173
if (delayMillis == null) {
174174
delayMillis = 1L;

0 commit comments

Comments
 (0)