5656import java .util .ArrayList ;
5757import java .util .Arrays ;
5858import java .util .Collections ;
59+ import java .util .Deque ;
5960import java .util .HashMap ;
6061import java .util .HashSet ;
6162import java .util .Iterator ;
6970import java .util .UUID ;
7071import java .util .concurrent .BlockingQueue ;
7172import java .util .concurrent .CompletableFuture ;
73+ import java .util .concurrent .ConcurrentLinkedDeque ;
7274import java .util .concurrent .CountDownLatch ;
7375import java .util .concurrent .CyclicBarrier ;
7476import java .util .concurrent .ExecutorService ;
@@ -3784,35 +3786,39 @@ public void testExpiredLedgerDeletionAfterManagedLedgerRestart() throws Exceptio
37843786 });
37853787 }
37863788
3789+ // Huh, maybeUpdateCursorBeforeTrimmingConsumedLedger seems not working well.
37873790 @ Test (timeOut = 20000 )
37883791 public void testNeverThrowsMarkDeletingMarkedPositionInMaybeUpdateCursorBeforeTrimmingConsumedLedger ()
37893792 throws Exception {
37903793 ManagedLedgerConfig config = new ManagedLedgerConfig ();
37913794 initManagedLedgerConfig (config );
37923795 config .setMaxEntriesPerLedger (1 );
37933796 int entryNum = 100 ;
3794- config .setMaxEntriesPerLedger (entryNum );
37953797
3796- ManagedLedgerImpl managedLedger =
3798+ ManagedLedgerImpl realManagedLedger =
37973799 (ManagedLedgerImpl ) factory .open ("maybeUpdateCursorBeforeTrimmingConsumed_ledger" , config );
3800+ ManagedLedgerImpl managedLedger = spy (realManagedLedger );
37983801 ManagedCursor cursor = managedLedger .openCursor ("c1" );
37993802
3803+ Deque <CompletableFuture <Void >> futures = new ConcurrentLinkedDeque <>();
3804+ doAnswer (invocation -> {
3805+ CompletableFuture <Void > result = (CompletableFuture <Void >) invocation .callRealMethod ();
3806+ futures .offer (result );
3807+ return result ;
3808+ }).when (managedLedger ).maybeUpdateCursorBeforeTrimmingConsumedLedger ();
3809+
38003810 final CountDownLatch latch = new CountDownLatch (entryNum );
3801- List <CompletableFuture <Void >> updateCursorFutures = new ArrayList <>(entryNum );
3802- // Three asyncMarkDelete operations running concurrently:
3811+ // Two asyncMarkDelete operations running concurrently:
38033812 // 1. ledger rollover triggered maybeUpdateCursorBeforeTrimmingConsumedLedger.
38043813 // 2. user triggered asyncMarkDelete.
3805- // 3. user triggered maybeUpdateCursorBeforeTrimmingConsumedLedger.
38063814 for (int i = 0 ; i < entryNum ; i ++) {
3807- CountDownLatch taskFireLatch = new CountDownLatch (1 );
38083815 managedLedger .asyncAddEntry ("entry" .getBytes (Encoding ), new AddEntryCallback () {
38093816 @ Override
38103817 public void addFailed (ManagedLedgerException exception , Object ctx ) {
38113818 }
38123819
38133820 @ Override
38143821 public void addComplete (Position position , ByteBuf entryData , Object ctx ) {
3815- taskFireLatch .countDown ();
38163822 cursor .asyncMarkDelete (position , new MarkDeleteCallback () {
38173823 @ Override
38183824 public void markDeleteFailed (ManagedLedgerException exception , Object ctx ) {
@@ -3826,15 +3832,13 @@ public void markDeleteComplete(Object ctx) {
38263832
38273833 }
38283834 }, null );
3829- taskFireLatch .await ();
3830- CompletableFuture <Void > future = managedLedger .maybeUpdateCursorBeforeTrimmingConsumedLedger ();
3831- updateCursorFutures .add (future );
38323835 }
38333836
38343837 latch .await ();
38353838 assertEquals (cursor .getNumberOfEntries (), 0 );
3839+
38363840 // Will not throw exception
3837- FutureUtil .waitForAll (updateCursorFutures ).get ();
3841+ FutureUtil .waitForAll (futures ).get ();
38383842 }
38393843
38403844 @ Test (timeOut = 20000 )
0 commit comments