@Test public void asyncClosingManagedLedger() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.openCursor("c1"); bkc.failNow(BKException.Code.NoSuchLedgerExistsException); final CountDownLatch latch = new CountDownLatch(1); ledger.asyncClose(new CloseCallback() { public void closeFailed(ManagedLedgerException exception, Object ctx) { latch.countDown(); } public void closeComplete(Object ctx) { fail("should have failed"); } }, null); latch.await(); }
@Test public void closingManagedLedger() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.openCursor("c1"); ledger.addEntry("entry".getBytes()); bkc.failNow(BKException.Code.NoSuchLedgerExistsException); try { ledger.close(); fail("should fail"); } catch (ManagedLedgerException e) { // ok } // ML should be closed even if it failed before try { ledger.addEntry("entry".getBytes()); fail("managed ledger was closed"); } catch (ManagedLedgerException e) { // ok } }
@Test public void discardEmptyLedgersOnError() throws Exception { ManagedLedgerImpl ledger = (ManagedLedgerImpl) factory.open("my_test_ledger"); assertEquals(ledger.getLedgersInfoAsList().size(), 1); bkc.failNow(BKException.Code.NoBookieAvailableException); zkc.failNow(Code.CONNECTIONLOSS); try { ledger.addEntry("entry".getBytes()); fail("Should have received exception"); } catch (ManagedLedgerException e) { // Ok } assertEquals(ledger.getLedgersInfoAsList().size(), 0); // Next write should fail as well try { ledger.addEntry("entry".getBytes()); fail("Should have received exception"); } catch (ManagedLedgerException e) { // Ok } assertEquals(ledger.getLedgersInfoAsList().size(), 0); assertEquals(ledger.getNumberOfEntries(), 0); }
@Test public void recoverAfterWriteError() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ManagedCursor cursor = ledger.openCursor("c1"); bkc.failNow(BKException.Code.BookieHandleNotAvailableException); // With one single error, the write should succeed ledger.addEntry("entry".getBytes()); assertEquals(cursor.getNumberOfEntriesInBacklog(), 1); bkc.failNow(BKException.Code.BookieHandleNotAvailableException); zkc.failNow(Code.CONNECTIONLOSS); try { ledger.addEntry("entry".getBytes()); fail("should fail"); } catch (ManagedLedgerException e) { // ok } assertEquals(cursor.getNumberOfEntriesInBacklog(), 1); // Next add will fail as well try { ledger.addEntry("entry".getBytes()); fail("should fail"); } catch (ManagedLedgerException e) { // ok } assertEquals(cursor.getNumberOfEntriesInBacklog(), 1); }
@Test public void recoverAfterMarkDeleteError() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ManagedCursor cursor = ledger.openCursor("my-cursor"); Position position = ledger.addEntry("entry".getBytes()); bkc.failNow(BKException.Code.BookieHandleNotAvailableException); zkc.failNow(Code.CONNECTIONLOSS); try { cursor.markDelete(position); fail("should fail"); } catch (ManagedLedgerException e) { // ok } // The metadata ledger is reopened in background, until it's not reopened the mark-delete will fail Thread.sleep(100); // Next markDelete should succeed cursor.markDelete(position); }
@Test public void removingCursor() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ManagedCursor c1 = ledger.openCursor("c1"); assertEquals(zkc.exists("/managed-ledgers/my_test_ledger/c1", false) != null, true); zkc.failNow(Code.BADVERSION); try { c1.close(); fail("should fail"); } catch (ManagedLedgerException e) { // ok } bkc.failNow(BKException.Code.NoSuchLedgerExistsException); // Cursor ledger deletion will fail, but that should not prevent the deleteCursor to fail ledger.deleteCursor("c1"); assertEquals(zkc.exists("/managed-ledgers/my_test_ledger/c1", false) != null, false); assertEquals(bkc.getLedgers().size(), 2); }
@Test public void errorInRecovering() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.addEntry("entry".getBytes()); ledger.close(); factory = new ManagedLedgerFactoryImpl(bkc, zkc); bkc.failNow(BKException.Code.LedgerFencedException); try { ledger = factory.open("my_test_ledger"); fail("should fail"); } catch (ManagedLedgerException e) { // ok } // It should be fine now ledger = factory.open("my_test_ledger"); }