public long getCursorLedgerLastEntry() { LedgerHandle lh = cursorLedger; return lh != null ? lh.getLastAddConfirmed() : -1; }
public LedgerStreamReader(LedgerHandle lh, ReadEntryListener readEntryListener, int concurrency) { this.lh = lh; this.lac = lh.getLastAddConfirmed(); this.readEntryListener = readEntryListener; this.concurrency = concurrency; for (int i = 0; i < concurrency; i++) { long entryId = nextReadEntry.getAndIncrement(); if (entryId > lac) { break; } PendingReadRequest request = new PendingReadRequest(entryId); pendingReads.add(request); request.read(); } if (pendingReads.isEmpty()) { done.countDown(); } }
/** * Get the last add confirmed of <code>ledgerDesc</code>. * * @param ledgerDesc * ledger descriptor. * @return last add confirmed of <code>ledgerDesc</code> * @throws BKException */ public long getLastAddConfirmed(LedgerDescriptor ledgerDesc) throws BKException { RefCountedLedgerHandle refhandle = getLedgerHandle(ledgerDesc); if (null == refhandle) { LOG.error("Accessing ledger {} without opening.", ledgerDesc); throw BKException.create(BKException.Code.UnexpectedConditionException); } return refhandle.handle.getLastAddConfirmed(); }
@Override public void run() { long lac = lh.getLastAddConfirmed();
boolean shouldCloseLedger(LedgerHandle lh) { long now = clock.millis(); if ((lh.getLastAddConfirmed() >= config.getMetadataMaxEntriesPerLedger() || lastLedgerSwitchTimestamp < (now - config.getLedgerRolloverTimeout() * 1000)) && STATE_UPDATER.get(this) != State.Closed) { // It's safe to modify the timestamp since this method will be only called from a callback, implying that // calls will be serialized on one single thread lastLedgerSwitchTimestamp = now; return true; } else { return false; } }
lastEntryId = lastEntry.getEntryId(); if (lastEntryId != lh.getLastAddConfirmed()) { System.out.println("Inconsistent Last Add Confirmed Found for LogSegment " + metadata.getLogSegmentSequenceNumber() + ": "); System.out.println("\t metadata: " + metadata); System.out.println("\t lac in ledger metadata is " + lh.getLastAddConfirmed() + ", but lac in bookies is " + lastEntryId); return false; } else {
callback.terminateFailed(createManagedLedgerException(rc), ctx); } else { lastConfirmedEntry = new PositionImpl(lh.getId(), lh.getLastAddConfirmed());
.setEntries(lh.getLastAddConfirmed() + 1).setSize(lh.getLength()) .setTimestamp(clock.millis()).build(); ledgers.put(id, info);
private void checkAndWaitWriterReaderPosition(BKLogSegmentWriter writer, long expectedWriterPosition, BKAsyncLogReaderDLSN reader, long expectedReaderPosition, LedgerHandle inspector, long expectedLac) throws Exception { while (getLedgerHandle(writer).getLastAddConfirmed() < expectedWriterPosition) { Thread.sleep(1000); } assertEquals(expectedWriterPosition, getLedgerHandle(writer).getLastAddConfirmed()); assertEquals(expectedLac, inspector.readLastConfirmed()); LedgerReadPosition readPosition = reader.bkLedgerManager.readAheadWorker.getNextReadAheadPosition(); logger.info("ReadAhead moved read position {} : ", readPosition); while (readPosition.getEntryId() < expectedReaderPosition) { Thread.sleep(1000); readPosition = reader.bkLedgerManager.readAheadWorker.getNextReadAheadPosition(); logger.info("ReadAhead moved read position {} : ", readPosition); } assertEquals(expectedReaderPosition, readPosition.getEntryId()); }
long entriesInLedger = lh.getLastAddConfirmed() + 1; if (log.isDebugEnabled()) { log.debug("[{}] Ledger has been closed id={} entries={}", name, lh.getId(), entriesInLedger);
lid, BookKeeper.DigestType.CRC32, conf.getBKDigestPW().getBytes(UTF_8)); logger.info("It took {} ms to open log segment {}", new Object[] { stopwatch.elapsed(TimeUnit.MILLISECONDS), (lh.getLastAddConfirmed() + 1), segment }); stopwatch.reset().start(); Runnable reader; new Object[] { stopwatch.elapsed(TimeUnit.MILLISECONDS), (lh.getLastAddConfirmed() + 1), segment });
long lac = lh.getLastAddConfirmed(); Enumeration<LedgerEntry> entries = lh.readEntries(lac, lac); if (!entries.hasMoreElements()) {
long lastEntryInLedger = lh.getLastAddConfirmed(); lh.asyncReadEntries(lastEntryInLedger, lastEntryInLedger, (rc1, lh1, seq, ctx1) -> { if (log.isDebugEnabled()) { log.debug("[{}} readComplete rc={} entryId={}", ledger.getName(), rc1, lh1.getLastAddConfirmed());
if (entryId > lh.getLastAddConfirmed()) { return false;
bkc.asyncOpenLedger(c1.getCursorLedger(), DigestType.CRC32C, "".getBytes(), (rc, lh, ctx) -> { if (rc == BKException.Code.OK) { long lastEntry = lh.getLastAddConfirmed(); lh.asyncReadEntries(lastEntry, lastEntry, (rc1, lh1, seq, ctx1) -> { try {
assertTrue("Ledger " + lh.getId() + " should be closed", readLh.isClosed()); assertEquals("There should be two entries in ledger " + lh.getId(), 1L, readLh.getLastAddConfirmed());
0L, lh.getLastAddPushed()); assertEquals("Only one entry is written for ledger " + lh.getId(), 0L, readLh.getLastAddConfirmed());
assertTrue("Ledger " + lh.getId() + " should not be closed", readLh.isClosed()); assertEquals("There should be no entries in ledger " + lh.getId(), LedgerHandle.INVALID_ENTRY_ID, readLh.getLastAddConfirmed());
assertTrue("Ledger " + lh.getId() + " should be closed", readLh.isClosed()); assertEquals("There should be no entries in ledger " + lh.getId(), LedgerHandle.INVALID_ENTRY_ID, readLh.getLastAddConfirmed());
assertFalse("Ledger " + lh.getId() + " should not be closed", readLh.isClosed()); assertEquals("There should be no entries in ledger " + lh.getId(), LedgerHandle.INVALID_ENTRY_ID, readLh.getLastAddConfirmed());