Class Engine

java.lang.Object
org.elasticsearch.index.engine.Engine
All Implemented Interfaces:
Closeable, AutoCloseable
Direct Known Subclasses:
InternalEngine, ReadOnlyEngine

public abstract class Engine extends Object implements Closeable
  • Field Details

  • Constructor Details

  • Method Details

    • guardedRamBytesUsed

      protected static long guardedRamBytesUsed(org.apache.lucene.util.Accountable a)
      Returns 0 in the case where accountable is null, otherwise returns ramBytesUsed()
    • config

      public final EngineConfig config()
    • getLastCommittedSegmentInfos

      protected abstract org.apache.lucene.index.SegmentInfos getLastCommittedSegmentInfos()
    • getMergeStats

      public MergeStats getMergeStats()
    • getHistoryUUID

      public abstract String getHistoryUUID()
      returns the history uuid for the engine
    • getWritingBytes

      public abstract long getWritingBytes()
      Returns how many bytes we are currently moving from heap to disk
    • completionStats

      public abstract CompletionStats completionStats(String... fieldNamePatterns)
      Returns the CompletionStats for this engine
    • docStats

      public DocsStats docStats()
      Returns the DocsStats for this engine
    • docsStats

      protected final DocsStats docsStats(org.apache.lucene.index.IndexReader indexReader)
    • verifyEngineBeforeIndexClosing

      public void verifyEngineBeforeIndexClosing() throws IllegalStateException
      Performs the pre-closing checks on the Engine.
      Throws:
      IllegalStateException - if the sanity checks failed
    • getIndexThrottleTimeInMillis

      public abstract long getIndexThrottleTimeInMillis()
      Returns the number of milliseconds this engine was under index throttling.
    • isThrottled

      public abstract boolean isThrottled()
      Returns the true iff this engine is currently under index throttling.
      See Also:
      getIndexThrottleTimeInMillis()
    • trimOperationsFromTranslog

      public abstract void trimOperationsFromTranslog(long belowTerm, long aboveSeqNo) throws EngineException
      Trims translog for terms below belowTerm and seq# above aboveSeqNo
      Throws:
      EngineException
      See Also:
      Translog.trimOperations(long, long)
    • index

      public abstract Engine.IndexResult index(Engine.Index index) throws IOException
      Perform document index operation on the engine
      Parameters:
      index - operation to perform
      Returns:
      Engine.IndexResult containing updated translog location, version and document specific failures Note: engine level failures (i.e. persistent engine failures) are thrown
      Throws:
      IOException
    • delete

      public abstract Engine.DeleteResult delete(Engine.Delete delete) throws IOException
      Perform document delete operation on the engine
      Parameters:
      delete - operation to perform
      Returns:
      Engine.DeleteResult containing updated translog location, version and document specific failures Note: engine level failures (i.e. persistent engine failures) are thrown
      Throws:
      IOException
    • noOp

      public abstract Engine.NoOpResult noOp(Engine.NoOp noOp) throws IOException
      Throws:
      IOException
    • syncFlush

      public abstract Engine.SyncedFlushResult syncFlush(String syncId, Engine.CommitId expectedCommitId) throws EngineException
      Attempts to do a special commit where the given syncID is put into the commit data. The attempt succeeds if there are not pending writes in lucene and the current point is equal to the expected one.
      Parameters:
      syncId - id of this sync
      expectedCommitId - the expected value of
      Returns:
      true if the sync commit was made, false o.w.
      Throws:
      EngineException
    • getFromSearcher

      protected final Engine.GetResult getFromSearcher(Engine.Get get, Engine.Searcher searcher, boolean uncachedLookup) throws EngineException
      Throws:
      EngineException
    • get

      public abstract Engine.GetResult get(Engine.Get get, MappingLookup mappingLookup, DocumentParser documentParser, Function<Engine.Searcher,​Engine.Searcher> searcherWrapper)
    • acquireSearcherSupplier

      public final Engine.SearcherSupplier acquireSearcherSupplier(Function<Engine.Searcher,​Engine.Searcher> wrapper) throws EngineException
      Acquires a point-in-time reader that can be used to create Engine.Searchers on demand.
      Throws:
      EngineException
    • acquireSearcherSupplier

      public Engine.SearcherSupplier acquireSearcherSupplier(Function<Engine.Searcher,​Engine.Searcher> wrapper, Engine.SearcherScope scope) throws EngineException
      Acquires a point-in-time reader that can be used to create Engine.Searchers on demand.
      Throws:
      EngineException
    • acquireSearcher

      public final Engine.Searcher acquireSearcher(String source) throws EngineException
      Throws:
      EngineException
    • acquireSearcher

      public Engine.Searcher acquireSearcher(String source, Engine.SearcherScope scope) throws EngineException
      Throws:
      EngineException
    • acquireSearcher

      public Engine.Searcher acquireSearcher(String source, Engine.SearcherScope scope, Function<Engine.Searcher,​Engine.Searcher> wrapper) throws EngineException
      Throws:
      EngineException
    • getReferenceManager

      protected abstract org.apache.lucene.search.ReferenceManager<ElasticsearchDirectoryReader> getReferenceManager(Engine.SearcherScope scope)
    • isTranslogSyncNeeded

      public abstract boolean isTranslogSyncNeeded()
      Checks if the underlying storage sync is required.
    • ensureTranslogSynced

      public abstract boolean ensureTranslogSynced(Stream<Translog.Location> locations) throws IOException
      Ensures that all locations in the given stream have been written to the underlying storage.
      Throws:
      IOException
    • syncTranslog

      public abstract void syncTranslog() throws IOException
      Throws:
      IOException
    • acquireHistoryRetentionLock

      public abstract Closeable acquireHistoryRetentionLock(Engine.HistorySource historySource)
      Acquires a lock on the translog files and Lucene soft-deleted documents to prevent them from being trimmed
    • newChangesSnapshot

      public abstract Translog.Snapshot newChangesSnapshot(String source, MapperService mapperService, long fromSeqNo, long toSeqNo, boolean requiredFullRange) throws IOException
      Creates a new history snapshot from Lucene for reading operations whose seqno in the requesting seqno range (both inclusive). This feature requires soft-deletes enabled. If soft-deletes are disabled, this method will throw an IllegalStateException.
      Throws:
      IOException
    • readHistoryOperations

      public abstract Translog.Snapshot readHistoryOperations(String reason, Engine.HistorySource historySource, MapperService mapperService, long startingSeqNo) throws IOException
      Creates a new history snapshot for reading operations since startingSeqNo (inclusive). The returned snapshot can be retrieved from either Lucene index or translog files.
      Throws:
      IOException
    • estimateNumberOfHistoryOperations

      public abstract int estimateNumberOfHistoryOperations(String reason, Engine.HistorySource historySource, MapperService mapperService, long startingSeqNo) throws IOException
      Returns the estimated number of history operations whose seq# at least startingSeqNo(inclusive) in this engine.
      Throws:
      IOException
    • hasCompleteOperationHistory

      public abstract boolean hasCompleteOperationHistory(String reason, Engine.HistorySource historySource, MapperService mapperService, long startingSeqNo) throws IOException
      Checks if this engine has every operations since startingSeqNo(inclusive) in its history (either Lucene or translog)
      Throws:
      IOException
    • getMinRetainedSeqNo

      public abstract long getMinRetainedSeqNo()
      Gets the minimum retained sequence number for this engine.
      Returns:
      the minimum retained sequence number
    • getTranslogStats

      public abstract TranslogStats getTranslogStats()
    • getTranslogLastWriteLocation

      public abstract Translog.Location getTranslogLastWriteLocation()
      Returns the last location that the translog of this engine has written into.
    • ensureOpen

      protected final void ensureOpen(Exception suppressed)
    • ensureOpen

      protected final void ensureOpen()
    • commitStats

      public final CommitStats commitStats()
      get commits stats for the last commit
    • getPersistedLocalCheckpoint

      public abstract long getPersistedLocalCheckpoint()
      Returns:
      the persisted local checkpoint for this Engine
    • getSeqNoStats

      public abstract SeqNoStats getSeqNoStats(long globalCheckpoint)
      Returns:
      a SeqNoStats object, using local state and the supplied global checkpoint
    • getLastSyncedGlobalCheckpoint

      public abstract long getLastSyncedGlobalCheckpoint()
      Returns the latest global checkpoint value that has been persisted in the underlying storage (i.e. translog's checkpoint)
    • segmentsStats

      public SegmentsStats segmentsStats(boolean includeSegmentFileSizes, boolean includeUnloadedSegments)
      Global stats on segments.
    • fillSegmentStats

      protected void fillSegmentStats(org.apache.lucene.index.SegmentReader segmentReader, boolean includeSegmentFileSizes, SegmentsStats stats)
    • writerSegmentStats

      protected void writerSegmentStats(SegmentsStats stats)
    • getIndexBufferRAMBytesUsed

      public abstract long getIndexBufferRAMBytesUsed()
      How much heap is used that would be freed by a refresh. Note that this may throw AlreadyClosedException.
    • segments

      public abstract List<Segment> segments(boolean verbose)
      The list of segments in the engine.
    • refreshNeeded

      public boolean refreshNeeded()
    • refresh

      @Nullable public abstract void refresh(String source) throws EngineException
      Synchronously refreshes the engine for new search operations to reflect the latest changes.
      Throws:
      EngineException
    • maybeRefresh

      @Nullable public abstract boolean maybeRefresh(String source) throws EngineException
      Synchronously refreshes the engine for new search operations to reflect the latest changes unless another thread is already refreshing the engine concurrently.
      Returns:
      true if the a refresh happened. Otherwise false
      Throws:
      EngineException
    • writeIndexingBuffer

      public abstract void writeIndexingBuffer() throws EngineException
      Called when our engine is using too much heap and should move buffered indexed/deleted documents to disk.
      Throws:
      EngineException
    • shouldPeriodicallyFlush

      public abstract boolean shouldPeriodicallyFlush()
      Checks if this engine should be flushed periodically. This check is mainly based on the uncommitted translog size and the translog flush threshold setting.
    • flush

      public abstract Engine.CommitId flush(boolean force, boolean waitIfOngoing) throws EngineException
      Flushes the state of the engine including the transaction log, clearing memory.
      Parameters:
      force - if true a lucene commit is executed even if no changes need to be committed.
      waitIfOngoing - if true this call will block until all currently running flushes have finished. Otherwise this call will return without blocking.
      Returns:
      the commit Id for the resulting commit
      Throws:
      EngineException
    • flush

      public final Engine.CommitId flush() throws EngineException
      Flushes the state of the engine including the transaction log, clearing memory and persisting documents in the lucene index to disk including a potentially heavy and durable fsync operation. This operation is not going to block if another flush operation is currently running and won't write a lucene commit if nothing needs to be committed.
      Returns:
      the commit Id for the resulting commit
      Throws:
      EngineException
    • trimUnreferencedTranslogFiles

      public abstract void trimUnreferencedTranslogFiles() throws EngineException
      checks and removes translog files that no longer need to be retained. See TranslogDeletionPolicy for details
      Throws:
      EngineException
    • shouldRollTranslogGeneration

      public abstract boolean shouldRollTranslogGeneration()
      Tests whether or not the translog generation should be rolled to a new generation. This test is based on the size of the current generation compared to the configured generation threshold size.
      Returns:
      true if the current generation should be rolled to a new generation
    • rollTranslogGeneration

      public abstract void rollTranslogGeneration() throws EngineException
      Rolls the translog generation and cleans unneeded.
      Throws:
      EngineException
    • forceMerge

      public abstract void forceMerge(boolean flush, int maxNumSegments, boolean onlyExpungeDeletes, boolean upgrade, boolean upgradeOnlyAncientSegments, @Nullable String forceMergeUUID) throws EngineException, IOException
      Triggers a forced merge on this engine
      Throws:
      EngineException
      IOException
    • acquireLastIndexCommit

      public abstract Engine.IndexCommitRef acquireLastIndexCommit(boolean flushFirst) throws EngineException
      Snapshots the most recent index and returns a handle to it. If needed will try and "commit" the lucene index to make sure we have a "fresh" copy of the files to snapshot.
      Parameters:
      flushFirst - indicates whether the engine should flush before returning the snapshot
      Throws:
      EngineException
    • acquireSafeIndexCommit

      public abstract Engine.IndexCommitRef acquireSafeIndexCommit() throws EngineException
      Snapshots the most recent safe index commit from the engine.
      Throws:
      EngineException
    • acquireIndexCommitForSnapshot

      public final Engine.IndexCommitRef acquireIndexCommitForSnapshot() throws EngineException
      Acquires the index commit that should be included in a snapshot.
      Throws:
      EngineException
    • getSafeCommitInfo

      public abstract SafeCommitInfo getSafeCommitInfo()
      Returns:
      a summary of the contents of the current safe commit
    • failEngine

      public void failEngine(String reason, @Nullable Exception failure)
      fail engine due to some error. the engine will also be closed. The underlying store is marked corrupted iff failure is caused by index corruption
    • maybeFailEngine

      protected boolean maybeFailEngine(String source, Exception e)
      Check whether the engine should be failed
    • closeNoLock

      protected abstract void closeNoLock(String reason, CountDownLatch closedLatch)
      Method to close the engine while the write lock is held. Must decrement the supplied when closing work is done and resources are freed.
    • flushAndClose

      public void flushAndClose() throws IOException
      Flush the engine (committing segments to disk and truncating the translog) and close it.
      Throws:
      IOException
    • close

      public void close() throws IOException
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Throws:
      IOException
    • onSettingsChanged

      public void onSettingsChanged(org.elasticsearch.core.TimeValue translogRetentionAge, ByteSizeValue translogRetentionSize, long softDeletesRetentionOps)
    • getLastWriteNanos

      public long getLastWriteNanos()
      Returns the timestamp of the last write in nanoseconds. Note: this time might not be absolutely accurate since the Engine.Operation.startTime() is used which might be slightly inaccurate.
      See Also:
      System.nanoTime(), Engine.Operation.startTime()
    • activateThrottling

      public abstract void activateThrottling()
      Request that this engine throttle incoming indexing requests to one thread. Must be matched by a later call to deactivateThrottling().
    • deactivateThrottling

      public abstract void deactivateThrottling()
      Reverses a previous activateThrottling() call.
    • restoreLocalHistoryFromTranslog

      public abstract int restoreLocalHistoryFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner) throws IOException
      This method replays translog to restore the Lucene index which might be reverted previously. This ensures that all acknowledged writes are restored correctly when this engine is promoted.
      Returns:
      the number of translog operations have been recovered
      Throws:
      IOException
    • fillSeqNoGaps

      public abstract int fillSeqNoGaps(long primaryTerm) throws IOException
      Fills up the local checkpoints history with no-ops until the local checkpoint and the max seen sequence ID are identical.
      Parameters:
      primaryTerm - the shards primary term this engine was created for
      Returns:
      the number of no-ops added
      Throws:
      IOException
    • recoverFromTranslog

      public abstract Engine recoverFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner, long recoverUpToSeqNo) throws IOException
      Performs recovery from the transaction log up to recoverUpToSeqNo (inclusive). This operation will close the engine if the recovery fails.
      Parameters:
      translogRecoveryRunner - the translog recovery runner
      recoverUpToSeqNo - the upper bound, inclusive, of sequence number to be recovered
      Throws:
      IOException
    • skipTranslogRecovery

      public abstract void skipTranslogRecovery()
      Do not replay translog operations, but make the engine be ready.
    • maybePruneDeletes

      public abstract void maybePruneDeletes()
      Tries to prune buffered deletes from the version map.
    • getMaxSeenAutoIdTimestamp

      public long getMaxSeenAutoIdTimestamp()
      Returns the maximum auto_id_timestamp of all append-only index requests have been processed by this engine or the auto_id_timestamp received from its primary shard via updateMaxUnsafeAutoIdTimestamp(long). Notes this method returns the auto_id_timestamp of all append-only requests, not max_unsafe_auto_id_timestamp.
    • updateMaxUnsafeAutoIdTimestamp

      public abstract void updateMaxUnsafeAutoIdTimestamp(long newTimestamp)
      Forces this engine to advance its max_unsafe_auto_id_timestamp marker to at least the given timestamp. The engine will disable optimization for all append-only whose timestamp at most newTimestamp.
    • getMaxSeqNoOfUpdatesOrDeletes

      public abstract long getMaxSeqNoOfUpdatesOrDeletes()
      Returns the maximum sequence number of either update or delete operations have been processed in this engine or the sequence number from advanceMaxSeqNoOfUpdatesOrDeletes(long). An index request is considered as an update operation if it overwrites the existing documents in Lucene index with the same document id.

      A note on the optimization using max_seq_no_of_updates_or_deletes: For each operation O, the key invariants are:

      1. I1: There is no operation on docID(O) with seqno that is > MSU(O) and < seqno(O)
      2. I2: If MSU(O) < seqno(O) then docID(O) did not exist when O was applied; more precisely, if there is any O' with seqno(O') < seqno(O) and docID(O') = docID(O) then the one with the greatest seqno is a delete.

      When a receiving shard (either a replica or a follower) receives an operation O, it must first ensure its own MSU at least MSU(O), and then compares its MSU to its local checkpoint (LCP). If LCP < MSU then there's a gap: there may be some operations that act on docID(O) about which we do not yet know, so we cannot perform an add. Note this also covers the case where a future operation O' with seqNo(O') > seqNo(O) and docId(O') = docID(O) is processed before O. In that case MSU(O') is at least seqno(O') and this means MSU >= seqNo(O') > seqNo(O) > LCP (because O wasn't processed yet).

      However, if MSU <= LCP then there is no gap: we have processed every operation <= LCP, and no operation O' with seqno(O') > LCP and seqno(O') < seqno(O) also has docID(O') = docID(O), because such an operation would have seqno(O') > LCP >= MSU >= MSU(O) which contradicts the first invariant. Furthermore in this case we immediately know that docID(O) has been deleted (or never existed) without needing to check Lucene for the following reason. If there's no earlier operation on docID(O) then this is clear, so suppose instead that the preceding operation on docID(O) is O': 1. The first invariant above tells us that seqno(O') <= MSU(O) <= LCP so we have already applied O' to Lucene. 2. Also MSU(O) <= MSU <= LCP < seqno(O) (we discard O if seqno(O) <= LCP) so the second invariant applies, meaning that the O' was a delete.

      Therefore, if MSU <= LCP < seqno(O) we know that O can safely be optimized with and added to lucene with addDocument. Moreover, operations that are optimized using the MSU optimization must not be processed twice as this will create duplicates in Lucene. To avoid this we check the local checkpoint tracker to see if an operation was already processed.

      See Also:
      advanceMaxSeqNoOfUpdatesOrDeletes(long)
    • advanceMaxSeqNoOfUpdatesOrDeletes

      public abstract void advanceMaxSeqNoOfUpdatesOrDeletes(long maxSeqNoOfUpdatesOnPrimary)
      A replica shard receives a new max_seq_no_of_updates from its primary shard, then calls this method to advance this marker to at least the given sequence number.
    • getRawFieldRange

      public abstract ShardLongFieldRange getRawFieldRange(String field) throws IOException
      Returns:
      a ShardLongFieldRange containing the min and max raw values of the given field for this shard if the engine guarantees these values never to change, or ShardLongFieldRange.EMPTY if this field is empty, or ShardLongFieldRange.UNKNOWN if this field's value range may change in future.
      Throws:
      IOException
    • getEngineConfig

      public final EngineConfig getEngineConfig()