Search in sources :

Example 6 with Batch

use of org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorage.Batch in project bookkeeper by apache.

the class DbLedgerStorage method checkpoint.

@Override
public void checkpoint(Checkpoint checkpoint) throws IOException {
    Checkpoint thisCheckpoint = checkpointSource.newCheckpoint();
    if (lastCheckpoint.compareTo(checkpoint) > 0) {
        return;
    }
    long startTime = MathUtils.nowInNano();
    // Only a single flush operation can happen at a time
    flushMutex.lock();
    try {
        // Swap the write cache so that writes can continue to happen while the flush is
        // ongoing
        swapWriteCache();
        long sizeToFlush = writeCacheBeingFlushed.size();
        if (log.isDebugEnabled()) {
            log.debug("Flushing entries. count: {} -- size {} Mb", writeCacheBeingFlushed.count(), sizeToFlush / 1024.0 / 1024);
        }
        // Write all the pending entries into the entry logger and collect the offset
        // position for each entry
        Batch batch = entryLocationIndex.newBatch();
        writeCacheBeingFlushed.forEach((ledgerId, entryId, entry) -> {
            try {
                long location = entryLogger.addEntry(ledgerId, entry, true);
                entryLocationIndex.addLocation(batch, ledgerId, entryId, location);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
        entryLogger.flush();
        long batchFlushStarTime = System.nanoTime();
        batch.flush();
        batch.close();
        if (log.isDebugEnabled()) {
            log.debug("DB batch flushed time : {} s", MathUtils.elapsedNanos(batchFlushStarTime) / (double) TimeUnit.SECONDS.toNanos(1));
        }
        ledgerIndex.flush();
        cleanupExecutor.execute(() -> {
            // is single-threaded
            try {
                if (log.isDebugEnabled()) {
                    log.debug("Removing deleted ledgers from db indexes");
                }
                entryLocationIndex.removeOffsetFromDeletedLedgers();
                ledgerIndex.removeDeletedLedgers();
            } catch (Throwable t) {
                log.warn("Failed to cleanup db indexes", t);
            }
        });
        lastCheckpoint = thisCheckpoint;
        // Discard all the entry from the write cache, since they're now persisted
        writeCacheBeingFlushed.clear();
        double flushTimeSeconds = MathUtils.elapsedNanos(startTime) / (double) TimeUnit.SECONDS.toNanos(1);
        double flushThroughput = sizeToFlush / 1024.0 / 1024.0 / flushTimeSeconds;
        if (log.isDebugEnabled()) {
            log.debug("Flushing done time {} s -- Written {} MB/s", flushTimeSeconds, flushThroughput);
        }
        recordSuccessfulEvent(flushStats, startTime);
        flushSizeStats.registerSuccessfulValue(sizeToFlush);
    } catch (IOException e) {
        // Leave IOExecption as it is
        throw e;
    } catch (RuntimeException e) {
        // Wrap unchecked exceptions
        throw new IOException(e);
    } finally {
        try {
            isFlushOngoing.set(false);
        } finally {
            flushMutex.unlock();
        }
    }
}
Also used : Checkpoint(org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint) Batch(org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorage.Batch) IOException(java.io.IOException)

Aggregations

Batch (org.apache.bookkeeper.bookie.storage.ldb.KeyValueStorage.Batch)6 IOException (java.io.IOException)2 File (java.io.File)1 Entry (java.util.Map.Entry)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1 Checkpoint (org.apache.bookkeeper.bookie.CheckpointSource.Checkpoint)1 EntryLocation (org.apache.bookkeeper.bookie.EntryLocation)1 LedgerData (org.apache.bookkeeper.bookie.storage.ldb.DbLedgerStorageDataFormats.LedgerData)1 Test (org.junit.Test)1