@Test(timeOut = 20000) public void testEmptyManagedLedgerContent() throws Exception { ZooKeeper zk = bkc.getZkHandle(); zk.create("/managed-ledger", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/managed-ledger/my_test_ledger", " ".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); ManagedLedger ledger = factory.open("my_test_ledger"); ledger.openCursor("test"); ledger.addEntry("entry-1".getBytes(Encoding)); assertEquals(ledger.getNumberOfEntries(), 1); }
@Test(timeOut = 20000) void errorRecoveringCursor2() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.openCursor("c1"); ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); bkc.failAfter(4, BKException.Code.MetadataVersionException); try { ledger = factory2.open("my_test_ledger"); fail("should have failed"); } catch (ManagedLedgerException e) { // ok } factory2.shutdown(); }
ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory2.open("my_test_ledger", new ManagedLedgerConfig()); c1 = ledger.openCursor("c1");
@Test(timeOut = 20000) void readWithCacheDisabled() throws Exception { ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig(); config.setMaxCacheSize(0); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config); ManagedLedger ledger = factory.open("my_test_ledger", new ManagedLedgerConfig().setMaxEntriesPerLedger(1)); ManagedCursor c1 = ledger.openCursor("c1"); ManagedCursor c2 = ledger.openCursor("c2"); ledger.addEntry("entry-1".getBytes(Encoding)); ledger.addEntry("entry-2".getBytes(Encoding)); List<Entry> entries = c1.readEntries(2); assertEquals(entries.size(), 2); assertEquals(new String(entries.get(0).getData(), Encoding), "entry-1"); assertEquals(new String(entries.get(1).getData(), Encoding), "entry-2"); entries.forEach(e -> e.release()); entries = c1.readEntries(2); assertEquals(entries.size(), 0); entries.forEach(e -> e.release()); entries = c2.readEntries(2); assertEquals(entries.size(), 2); entries.forEach(e -> e.release()); entries = c2.readEntries(2); assertEquals(entries.size(), 0); entries.forEach(e -> e.release()); }
@Test(timeOut = 20000) public void closeAndReopen() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.addEntry("dummy-entry-1".getBytes(Encoding)); ManagedCursor cursor = ledger.openCursor("c1"); ledger.addEntry("dummy-entry-2".getBytes(Encoding)); ledger.close(); log.info("Closing ledger and reopening"); // / Reopen the same managed-ledger ManagedLedgerFactoryImpl factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory2.open("my_test_ledger"); cursor = ledger.openCursor("c1"); assertEquals(ledger.getNumberOfEntries(), 2); assertEquals(ledger.getTotalSize(), "dummy-entry-1".getBytes(Encoding).length * 2); List<Entry> entries = cursor.readEntries(100); assertEquals(entries.size(), 1); entries.forEach(e -> e.release()); ledger.close(); factory2.shutdown(); }
@Test(timeOut = 20000) void readWithCacheDisabled() throws Exception { ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig(); config.setMaxCacheSize(0); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config); ManagedLedger ledger = factory.open("my_test_ledger", new ManagedLedgerConfig().setMaxEntriesPerLedger(1) .setRetentionTime(1, TimeUnit.HOURS).setRetentionSizeInMB(1)); ManagedCursor c1 = ledger.newNonDurableCursor(PositionImpl.latest); ManagedCursor c2 = ledger.newNonDurableCursor(PositionImpl.latest); ledger.addEntry("entry-1".getBytes(Encoding)); ledger.addEntry("entry-2".getBytes(Encoding)); List<Entry> entries = c1.readEntries(2); assertEquals(entries.size(), 2); assertEquals(new String(entries.get(0).getData(), Encoding), "entry-1"); assertEquals(new String(entries.get(1).getData(), Encoding), "entry-2"); entries.forEach(e -> e.release()); entries = c1.readEntries(2); assertEquals(entries.size(), 0); entries.forEach(e -> e.release()); entries = c2.readEntries(2); assertEquals(entries.size(), 2); entries.forEach(e -> e.release()); entries = c2.readEntries(2); assertEquals(entries.size(), 0); entries.forEach(e -> e.release()); }
@Test(timeOut = 20000) void errorRecoveringCursor() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); Position p1 = ledger.addEntry("entry".getBytes()); ledger.addEntry("entry".getBytes()); ManagedCursor c1 = ledger.openCursor("c1"); Position p3 = ledger.addEntry("entry".getBytes()); assertEquals(c1.getReadPosition(), p3); ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); bkc.failAfter(3, BKException.Code.LedgerRecoveryException); ledger = factory2.open("my_test_ledger"); c1 = ledger.openCursor("c1"); // Verify the ManagedCursor was rewind back to the snapshotted position assertEquals(c1.getReadPosition(), p3); factory2.shutdown(); }
@Test(timeOut = 20000) public void testReopenAndCleanup() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ledger.openCursor("c1"); ledger.addEntry("data".getBytes(Encoding)); ledger.close(); Thread.sleep(100); assertEquals(bkc.getLedgers().size(), 1); factory.shutdown(); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory.open("my_test_ledger"); ledger.openCursor("c1"); Thread.sleep(100); assertEquals(bkc.getLedgers().size(), 2); ledger.close(); factory.open("my_test_ledger", new ManagedLedgerConfig()).delete(); Thread.sleep(100); assertEquals(bkc.getLedgers().size(), 0); factory.shutdown(); }
@Test(timeOut = 20000) void errorRecoveringCursor3() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); Position p1 = ledger.addEntry("entry".getBytes()); ledger.addEntry("entry".getBytes()); ManagedCursor c1 = ledger.openCursor("c1"); Position p3 = ledger.addEntry("entry".getBytes()); assertEquals(c1.getReadPosition(), p3); ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); bkc.failAfter(4, BKException.Code.ReadException); ledger = factory2.open("my_test_ledger"); c1 = ledger.openCursor("c1"); // Verify the ManagedCursor was rewind back to the snapshotted position assertEquals(c1.getReadPosition(), p3); factory2.shutdown(); }
@Test void verifyNoCacheIfNoConsumer() throws Exception { ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig(); config.setMaxCacheSize(7 * 10); config.setCacheEvictionWatermark(0.8); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config); EntryCacheManager cacheManager = factory.getEntryCacheManager(); ManagedLedgerImpl ledger = (ManagedLedgerImpl) factory.open("ledger"); EntryCache cache1 = ledger.entryCache; for (int i = 0; i < 10; i++) { ledger.addEntry(("entry-" + i).getBytes()); } assertEquals(cache1.getSize(), 0); assertEquals(cacheManager.getSize(), 0); cacheManager.mlFactoryMBean.refreshStats(1, TimeUnit.SECONDS); assertEquals(cacheManager.mlFactoryMBean.getCacheMaxSize(), 7 * 10); assertEquals(cacheManager.mlFactoryMBean.getCacheUsedSize(), 0); assertEquals(cacheManager.mlFactoryMBean.getCacheHitsRate(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getCacheMissesRate(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getCacheHitsThroughput(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getNumberOfCacheEvictions(), 0); }
@Test(enabled = false) public void fenceManagedLedger() throws Exception { ManagedLedgerFactory factory1 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedger ledger1 = factory1.open("my_test_ledger"); ManagedCursor cursor1 = ledger1.openCursor("c1"); ledger1.addEntry("entry-1".getBytes(Encoding)); ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedger ledger2 = factory2.open("my_test_ledger"); ManagedCursor cursor2 = ledger2.openCursor("c1");
@Test void doubleInsert() throws Exception { ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig(); config.setMaxCacheSize(10); config.setCacheEvictionWatermark(0.8); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config); EntryCacheManager cacheManager = factory.getEntryCacheManager(); EntryCache cache1 = cacheManager.getEntryCache(ml1); assertEquals(cache1.insert(EntryImpl.create(1, 1, new byte[4])), true); assertEquals(cache1.insert(EntryImpl.create(1, 0, new byte[3])), true); assertEquals(cache1.getSize(), 7); assertEquals(cacheManager.getSize(), 7); assertEquals(cache1.insert(EntryImpl.create(1, 0, new byte[5])), false); assertEquals(cache1.getSize(), 7); assertEquals(cacheManager.getSize(), 7); }
@Test(enabled = true) public void testNoRetention() throws Exception { ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedgerConfig config = new ManagedLedgerConfig(); config.setRetentionSizeInMB(0); config.setMaxEntriesPerLedger(1); // Default is no-retention ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open("noretention_test_ledger", config); ManagedCursor c1 = ml.openCursor("c1noretention"); ml.addEntry("iamaverylongmessagethatshouldnotberetained".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); // reopen ml ml = (ManagedLedgerImpl) factory.open("noretention_test_ledger", config); c1 = ml.openCursor("c1noretention"); ml.addEntry("shortmessage".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); // sleep for trim Thread.sleep(1000); ml.close(); assertTrue(ml.getLedgersInfoAsList().size() <= 1); assertTrue(ml.getTotalSize() <= "shortmessage".getBytes().length); }
@Test public void testRetention() throws Exception { ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedgerConfig config = new ManagedLedgerConfig(); config.setRetentionSizeInMB(10); config.setMaxEntriesPerLedger(1); config.setRetentionTime(1, TimeUnit.HOURS); ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open("retention_test_ledger", config); ManagedCursor c1 = ml.openCursor("c1"); ml.addEntry("iamaverylongmessagethatshouldberetained".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); // reopen ml ml = (ManagedLedgerImpl) factory.open("retention_test_ledger", config); c1 = ml.openCursor("c1"); ml.addEntry("shortmessage".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); assertTrue(ml.getLedgersInfoAsList().size() > 1); assertTrue(ml.getTotalSize() > "shortmessage".getBytes().length); }
@Test public void testDeletionAfterRetention() throws Exception { ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedgerConfig config = new ManagedLedgerConfig(); config.setRetentionSizeInMB(0); config.setMaxEntriesPerLedger(1); config.setRetentionTime(1, TimeUnit.SECONDS); ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open("deletion_after_retention_test_ledger", config); ManagedCursor c1 = ml.openCursor("c1noretention"); ml.addEntry("iamaverylongmessagethatshouldnotberetained".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); // reopen ml ml = (ManagedLedgerImpl) factory.open("deletion_after_retention_test_ledger", config); c1 = ml.openCursor("c1noretention"); ml.addEntry("shortmessage".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); // let retention expire Thread.sleep(1000); ml.internalTrimConsumedLedgers(CompletableFuture.completedFuture(null)); assertTrue(ml.getLedgersInfoAsList().size() <= 1); assertTrue(ml.getTotalSize() <= "shortmessage".getBytes().length); ml.close(); }
@Test public void testInfiniteRetention() throws Exception { ManagedLedgerFactory factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ManagedLedgerConfig config = new ManagedLedgerConfig(); config.setRetentionSizeInMB(-1); config.setRetentionTime(-1, TimeUnit.HOURS); config.setMaxEntriesPerLedger(1); ManagedLedgerImpl ml = (ManagedLedgerImpl) factory.open("retention_test_ledger", config); ManagedCursor c1 = ml.openCursor("c1"); ml.addEntry("iamaverylongmessagethatshouldberetained".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); // reopen ml ml = (ManagedLedgerImpl) factory.open("retention_test_ledger", config); c1 = ml.openCursor("c1"); ml.addEntry("shortmessage".getBytes()); c1.skipEntries(1, IndividualDeletedEntries.Exclude); ml.close(); assertTrue(ml.getLedgersInfoAsList().size() > 1); assertTrue(ml.getTotalSize() > "shortmessage".getBytes().length); }
@Test(timeOut = 20000) void cursorPersistence() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger"); ManagedCursor c1 = ledger.openCursor("c1"); ManagedCursor c2 = ledger.openCursor("c2"); ledger.addEntry("dummy-entry-1".getBytes(Encoding)); ledger.addEntry("dummy-entry-2".getBytes(Encoding)); ledger.addEntry("dummy-entry-3".getBytes(Encoding)); ledger.addEntry("dummy-entry-4".getBytes(Encoding)); ledger.addEntry("dummy-entry-5".getBytes(Encoding)); ledger.addEntry("dummy-entry-6".getBytes(Encoding)); List<Entry> entries = c1.readEntries(3); Position p1 = entries.get(2).getPosition(); c1.markDelete(p1); entries.forEach(e -> e.release()); entries = c1.readEntries(4); Position p2 = entries.get(2).getPosition(); c2.markDelete(p2); entries.forEach(e -> e.release()); // Reopen ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory2.open("my_test_ledger"); c1 = ledger.openCursor("c1"); c2 = ledger.openCursor("c2"); assertEquals(c1.getMarkDeletedPosition(), p1); assertEquals(c2.getMarkDeletedPosition(), p2); factory2.shutdown(); }
@Test(timeOut = 20000) void testNumberOfEntriesWithReopen() throws Exception { ManagedLedger ledger = factory.open("my_test_ledger", new ManagedLedgerConfig().setMaxEntriesPerLedger(1)); ManagedCursor c1 = ledger.openCursor("c1"); ledger.addEntry("dummy-entry-1".getBytes(Encoding)); ManagedCursor c2 = ledger.openCursor("c2"); ledger.addEntry("dummy-entry-2".getBytes(Encoding)); ManagedCursor c3 = ledger.openCursor("c3"); ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory2.open("my_test_ledger", new ManagedLedgerConfig().setMaxEntriesPerLedger(1)); c1 = ledger.openCursor("c1"); c2 = ledger.openCursor("c2"); c3 = ledger.openCursor("c3"); assertEquals(c1.getNumberOfEntries(), 2); assertEquals(c1.hasMoreEntries(), true); assertEquals(c2.getNumberOfEntries(), 1); assertEquals(c2.hasMoreEntries(), true); assertEquals(c3.getNumberOfEntries(), 0); assertEquals(c3.hasMoreEntries(), false); factory2.shutdown(); }
@Test(timeOut = 20000) void testRateLimitMarkDelete() throws Exception { ManagedLedgerConfig config = new ManagedLedgerConfig(); config.setThrottleMarkDelete(1); // Throttle to 1/s ManagedLedger ledger = factory.open("my_test_ledger", config); ManagedCursor c1 = ledger.openCursor("c1"); Position p1 = ledger.addEntry("dummy-entry-1".getBytes(Encoding)); Position p2 = ledger.addEntry("dummy-entry-2".getBytes(Encoding)); Position p3 = ledger.addEntry("dummy-entry-3".getBytes(Encoding)); assertEquals(c1.getNumberOfEntriesInBacklog(), 3); c1.markDelete(p1); c1.markDelete(p2); c1.markDelete(p3); assertEquals(c1.getNumberOfEntriesInBacklog(), 0); // Re-open to recover from storage ManagedLedgerFactory factory2 = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle()); ledger = factory2.open("my_test_ledger", new ManagedLedgerConfig()); c1 = ledger.openCursor("c1"); // Only the 1st mark-delete was persisted assertEquals(c1.getNumberOfEntriesInBacklog(), 2); factory2.shutdown(); }
@Test void cacheDisabled() throws Exception { ManagedLedgerFactoryConfig config = new ManagedLedgerFactoryConfig(); config.setMaxCacheSize(0); config.setCacheEvictionWatermark(0.8); factory = new ManagedLedgerFactoryImpl(bkc, bkc.getZkHandle(), config); EntryCacheManager cacheManager = factory.getEntryCacheManager(); EntryCache cache1 = cacheManager.getEntryCache(ml1); EntryCache cache2 = cacheManager.getEntryCache(ml2); assertTrue(cache1 instanceof EntryCacheManager.EntryCacheDisabled); assertTrue(cache2 instanceof EntryCacheManager.EntryCacheDisabled); cache1.insert(EntryImpl.create(1, 1, new byte[4])); cache1.insert(EntryImpl.create(1, 0, new byte[3])); assertEquals(cache1.getSize(), 0); assertEquals(cacheManager.getSize(), 0); cacheManager.mlFactoryMBean.refreshStats(1, TimeUnit.SECONDS); assertEquals(cacheManager.mlFactoryMBean.getCacheMaxSize(), 0); assertEquals(cacheManager.mlFactoryMBean.getCacheUsedSize(), 0); assertEquals(cacheManager.mlFactoryMBean.getCacheHitsRate(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getCacheMissesRate(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getCacheHitsThroughput(), 0.0); assertEquals(cacheManager.mlFactoryMBean.getNumberOfCacheEvictions(), 0); cache2.insert(EntryImpl.create(2, 0, new byte[1])); cache2.insert(EntryImpl.create(2, 1, new byte[1])); cache2.insert(EntryImpl.create(2, 2, new byte[1])); assertEquals(cache2.getSize(), 0); assertEquals(cacheManager.getSize(), 0); }