Search in sources :

Example 1 with LocalCheckpointTracker

use of org.elasticsearch.index.seqno.LocalCheckpointTracker in project elasticsearch by elastic.

the class RecoverySourceHandler method isTranslogReadyForSequenceNumberBasedRecovery.

/**
     * Determines if the source translog is ready for a sequence-number-based peer recovery. The main condition here is that the source
     * translog contains all operations between the local checkpoint on the target and the current maximum sequence number on the source.
     *
     * @param translogView a view of the translog on the source
     * @return {@code true} if the source is ready for a sequence-number-based recovery
     * @throws IOException if an I/O exception occurred reading the translog snapshot
     */
boolean isTranslogReadyForSequenceNumberBasedRecovery(final Translog.View translogView) throws IOException {
    final long startingSeqNo = request.startingSeqNo();
    assert startingSeqNo >= 0;
    final long endingSeqNo = shard.seqNoStats().getMaxSeqNo();
    logger.trace("testing sequence numbers in range: [{}, {}]", startingSeqNo, endingSeqNo);
    // the start recovery request is initialized with the starting sequence number set to the target shard's local checkpoint plus one
    if (startingSeqNo - 1 <= endingSeqNo) {
        /*
             * We need to wait for all operations up to the current max to complete, otherwise we can not guarantee that all
             * operations in the required range will be available for replaying from the translog of the source.
             */
        cancellableThreads.execute(() -> shard.waitForOpsToComplete(endingSeqNo));
        logger.trace("all operations up to [{}] completed, checking translog content", endingSeqNo);
        final LocalCheckpointTracker tracker = new LocalCheckpointTracker(shard.indexSettings(), startingSeqNo, startingSeqNo - 1);
        final Translog.Snapshot snapshot = translogView.snapshot();
        Translog.Operation operation;
        while ((operation = snapshot.next()) != null) {
            if (operation.seqNo() != SequenceNumbersService.UNASSIGNED_SEQ_NO) {
                tracker.markSeqNoAsCompleted(operation.seqNo());
            }
        }
        return tracker.getCheckpoint() >= endingSeqNo;
    } else {
        // all assumptions regarding local and global checkpoints
        return false;
    }
}
Also used : LocalCheckpointTracker(org.elasticsearch.index.seqno.LocalCheckpointTracker) Translog(org.elasticsearch.index.translog.Translog)

Aggregations

LocalCheckpointTracker (org.elasticsearch.index.seqno.LocalCheckpointTracker)1 Translog (org.elasticsearch.index.translog.Translog)1