use of com.yahoo.pulsar.broker.service.persistent.PersistentMessageExpiryMonitor in project pulsar by yahoo.
the class PersistentMessageFinderTest method testPersistentMessageFinder.
@Test
void testPersistentMessageFinder() throws Exception {
final String ledgerAndCursorName = "testPersistentMessageFinder";
int entriesPerLedger = 2;
long beginTimestamp = System.currentTimeMillis();
ManagedLedgerConfig config = new ManagedLedgerConfig();
config.setRetentionSizeInMB(10);
config.setMaxEntriesPerLedger(entriesPerLedger);
config.setRetentionTime(1, TimeUnit.HOURS);
ManagedLedger ledger = factory.open(ledgerAndCursorName, config);
ManagedCursorImpl c1 = (ManagedCursorImpl) ledger.openCursor(ledgerAndCursorName);
ledger.addEntry(createMessageWrittenToLedger("retained1"));
// space apart message publish times
Thread.sleep(100);
ledger.addEntry(createMessageWrittenToLedger("retained2"));
Thread.sleep(100);
Position newPosition = ledger.addEntry(createMessageWrittenToLedger("retained3"));
Thread.sleep(100);
long timestamp = System.currentTimeMillis();
Thread.sleep(10);
ledger.addEntry(createMessageWrittenToLedger("afterresetposition"));
Position lastPosition = ledger.addEntry(createMessageWrittenToLedger("not-read"));
List<Entry> entries = c1.readEntries(3);
c1.markDelete(entries.get(2).getPosition());
c1.close();
ledger.close();
entries.forEach(e -> e.release());
// give timed ledger trimming a chance to run
Thread.sleep(1000);
ledger = factory.open(ledgerAndCursorName, config);
c1 = (ManagedCursorImpl) ledger.openCursor(ledgerAndCursorName);
long endTimestamp = System.currentTimeMillis();
Result result = new Result();
CompletableFuture<Void> future = findMessage(result, c1, timestamp);
future.get();
assertEquals(result.exception, null);
assertTrue(result.position != null);
assertEquals(result.position, newPosition);
result.reset();
future = findMessage(result, c1, beginTimestamp);
future.get();
assertEquals(result.exception, null);
assertEquals(result.position, null);
result.reset();
future = findMessage(result, c1, endTimestamp);
future.get();
assertEquals(result.exception, null);
assertNotEquals(result.position, null);
assertEquals(result.position, lastPosition);
PersistentMessageFinder messageFinder = new PersistentMessageFinder("topicname", c1);
final AtomicBoolean ex = new AtomicBoolean(false);
messageFinder.findEntryFailed(new ManagedLedgerException("failed"), new AsyncCallbacks.FindEntryCallback() {
@Override
public void findEntryComplete(Position position, Object ctx) {
}
@Override
public void findEntryFailed(ManagedLedgerException exception, Object ctx) {
ex.set(true);
}
});
assertTrue(ex.get());
PersistentMessageExpiryMonitor monitor = new PersistentMessageExpiryMonitor("topicname", c1);
monitor.findEntryFailed(new ManagedLedgerException.ConcurrentFindCursorPositionException("failed"), null);
Field field = monitor.getClass().getDeclaredField("expirationCheckInProgress");
field.setAccessible(true);
assertEquals(0, field.get(monitor));
result.reset();
c1.close();
ledger.close();
factory.shutdown();
}
Aggregations