Package org.elasticsearch.index.engine
Class ReadOnlyEngine
- java.lang.Object
-
- org.elasticsearch.index.engine.Engine
-
- org.elasticsearch.index.engine.ReadOnlyEngine
-
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
public class ReadOnlyEngine extends Engine
A basic read-only engine that allows switching a shard to be true read-only temporarily or permanently. Note: this engine can be opened side-by-side with a read-write engine but will not reflect any changes made to the read-write engine.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.elasticsearch.index.engine.Engine
Engine.CommitId, Engine.Delete, Engine.DeleteResult, Engine.EventListener, Engine.Get, Engine.GetResult, Engine.Index, Engine.IndexCommitRef, Engine.IndexResult, Engine.IndexThrottle, Engine.NoOp, Engine.NoOpLock, Engine.NoOpResult, Engine.Operation, Engine.Result, Engine.Searcher, Engine.SearcherScope, Engine.SyncedFlushResult, Engine.TranslogRecoveryRunner, Engine.Warmer
-
-
Field Summary
-
Fields inherited from class org.elasticsearch.index.engine.Engine
allocationId, engineConfig, eventListener, failedEngine, failEngineLock, HISTORY_UUID_KEY, isClosed, lastWriteNanos, logger, MAX_UNSAFE_AUTO_ID_TIMESTAMP_COMMIT_ID, MIN_RETAINED_SEQNO, readLock, rwl, shardId, store, SYNC_COMMIT_ID, writeLock
-
-
Constructor Summary
Constructors Constructor Description ReadOnlyEngine(EngineConfig config, SeqNoStats seqNoStats, TranslogStats translogStats, boolean obtainLock, java.util.function.Function<org.apache.lucene.index.DirectoryReader,org.apache.lucene.index.DirectoryReader> readerWrapperFunction)
Creates a new ReadOnlyEngine.
-
Method Summary
Modifier and Type Method Description Engine.IndexCommitRef
acquireLastIndexCommit(boolean flushFirst)
Snapshots the most recent index and returns a handle to it.java.io.Closeable
acquireRetentionLock()
Acquires a lock on the translog files and Lucene soft-deleted documents to prevent them from being trimmedEngine.IndexCommitRef
acquireSafeIndexCommit()
Snapshots the most recent safe index commit from the engine.void
activateThrottling()
Request that this engine throttle incoming indexing requests to one thread.protected void
assertMaxSeqNoEqualsToGlobalCheckpoint(long maxSeqNo, long globalCheckpoint)
static SeqNoStats
buildSeqNoStats(org.apache.lucene.index.SegmentInfos infos)
protected void
closeNoLock(java.lang.String reason, java.util.concurrent.CountDownLatch closedLatch)
Method to close the engine while the write lock is held.void
deactivateThrottling()
Reverses a previousEngine.activateThrottling()
call.Engine.DeleteResult
delete(Engine.Delete delete)
Perform document delete operation on the engineDocsStats
docStats()
Returns theDocsStats
for this engineboolean
ensureTranslogSynced(java.util.stream.Stream<Translog.Location> locations)
Ensures that all locations in the given stream have been written to the underlying storage.int
estimateNumberOfHistoryOperations(java.lang.String source, MapperService mapperService, long startingSeqNo)
Returns the estimated number of history operations whose seq# at leaststartingSeqNo
(inclusive) in this engine.int
fillSeqNoGaps(long primaryTerm)
Fills up the local checkpoints history with no-ops until the local checkpoint and the max seen sequence ID are identical.Engine.CommitId
flush(boolean force, boolean waitIfOngoing)
Flushes the state of the engine including the transaction log, clearing memory.void
forceMerge(boolean flush, int maxNumSegments, boolean onlyExpungeDeletes, boolean upgrade, boolean upgradeOnlyAncientSegments)
Triggers a forced merge on this engineEngine.GetResult
get(Engine.Get get, java.util.function.BiFunction<java.lang.String,Engine.SearcherScope,Engine.Searcher> searcherFactory)
java.lang.String
getHistoryUUID()
returns the history uuid for the enginelong
getIndexBufferRAMBytesUsed()
How much heap is used that would be freed by a refresh.long
getIndexThrottleTimeInMillis()
Returns the number of milliseconds this engine was under index throttling.protected org.apache.lucene.index.SegmentInfos
getLastCommittedSegmentInfos()
long
getLastSyncedGlobalCheckpoint()
Returns the latest global checkpoint value that has been persisted in the underlying storage (i.e.long
getLocalCheckpoint()
long
getMinRetainedSeqNo()
Gets the minimum retained sequence number for this engine.protected org.apache.lucene.search.ReferenceManager<org.apache.lucene.search.IndexSearcher>
getReferenceManager(Engine.SearcherScope scope)
SeqNoStats
getSeqNoStats(long globalCheckpoint)
Translog.Location
getTranslogLastWriteLocation()
Returns the last location that the translog of this engine has written into.TranslogStats
getTranslogStats()
long
getWritingBytes()
Returns how many bytes we are currently moving from heap to diskboolean
hasCompleteOperationHistory(java.lang.String source, MapperService mapperService, long startingSeqNo)
Checks if this engine has every operations sincestartingSeqNo
(inclusive) in its history (either Lucene or translog)Engine.IndexResult
index(Engine.Index index)
Perform document index operation on the engineboolean
isThrottled()
Returns thetrue
iff this engine is currently under index throttling.boolean
isTranslogSyncNeeded()
Checks if the underlying storage sync is required.void
maybePruneDeletes()
Tries to prune buffered deletes from the version map.Translog.Snapshot
newChangesSnapshot(java.lang.String source, MapperService mapperService, long fromSeqNo, long toSeqNo, boolean requiredFullRange)
Creates a new history snapshot from Lucene for reading operations whose seqno in the requesting seqno range (both inclusive).Engine.NoOpResult
noOp(Engine.NoOp noOp)
protected org.apache.lucene.index.DirectoryReader
open(org.apache.lucene.index.IndexCommit commit)
protected void
processReaders(org.apache.lucene.index.IndexReader reader, org.apache.lucene.index.IndexReader previousReader)
Translog.Snapshot
readHistoryOperations(java.lang.String source, MapperService mapperService, long startingSeqNo)
Creates a new history snapshot for reading operations sincestartingSeqNo
(inclusive).Engine
recoverFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner, long recoverUpToSeqNo)
Performs recovery from the transaction log up torecoverUpToSeqNo
(inclusive).void
refresh(java.lang.String source)
Synchronously refreshes the engine for new search operations to reflect the latest changes.boolean
refreshNeeded()
void
reinitializeMaxSeqNoOfUpdatesOrDeletes()
A primary shard calls this method to re-initialize the max_seq_no_of_updates marker using the max_seq_no from Lucene index and translog before replaying the local translog in its local recovery.int
restoreLocalHistoryFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner)
This method replays translog to restore the Lucene index which might be reverted previously.void
rollTranslogGeneration()
Rolls the translog generation and cleans unneeded.java.util.List<Segment>
segments(boolean verbose)
The list of segments in the engine.boolean
shouldPeriodicallyFlush()
Checks if this engine should be flushed periodically.boolean
shouldRollTranslogGeneration()
Tests whether or not the translog generation should be rolled to a new generation.void
skipTranslogRecovery()
Do not replay translog operations, but make the engine be ready.Engine.SyncedFlushResult
syncFlush(java.lang.String syncId, Engine.CommitId expectedCommitId)
Attempts to do a special commit where the given syncID is put into the commit data.void
syncTranslog()
void
trimOperationsFromTranslog(long belowTerm, long aboveSeqNo)
Trims translog for terms belowbelowTerm
and seq# aboveaboveSeqNo
void
trimUnreferencedTranslogFiles()
checks and removes translog files that no longer need to be retained.void
updateMaxUnsafeAutoIdTimestamp(long newTimestamp)
Forces this engine to advance its max_unsafe_auto_id_timestamp marker to at least the given timestamp.void
verifyEngineBeforeIndexClosing()
Performs the pre-closing checks on theEngine
.protected org.apache.lucene.index.DirectoryReader
wrapReader(org.apache.lucene.index.DirectoryReader reader, java.util.function.Function<org.apache.lucene.index.DirectoryReader,org.apache.lucene.index.DirectoryReader> readerWrapperFunction)
void
writeIndexingBuffer()
Called when our engine is using too much heap and should move buffered indexed/deleted documents to disk.-
Methods inherited from class org.elasticsearch.index.engine.Engine
acquireSearcher, acquireSearcher, advanceMaxSeqNoOfUpdatesOrDeletes, close, commitStats, completionStats, config, docsStats, ensureOpen, ensureOpen, failEngine, flush, flushAndClose, forceMerge, getFromSearcher, getLastWriteNanos, getMaxSeenAutoIdTimestamp, getMaxSeqNoOfUpdatesOrDeletes, getMergeStats, guardedRamBytesUsed, isMergedSegment, isRecovering, maybeFailEngine, onSettingsChanged, segmentsStats, writerSegmentStats
-
-
-
-
Constructor Detail
-
ReadOnlyEngine
public ReadOnlyEngine(EngineConfig config, SeqNoStats seqNoStats, TranslogStats translogStats, boolean obtainLock, java.util.function.Function<org.apache.lucene.index.DirectoryReader,org.apache.lucene.index.DirectoryReader> readerWrapperFunction)
Creates a new ReadOnlyEngine. This ctor can also be used to open a read-only engine on top of an already opened read-write engine. It allows to optionally obtain the writer locks for the shard which would time-out if another engine is still open.- Parameters:
config
- the engine configurationseqNoStats
- sequence number statistics for this engine or null if not providedtranslogStats
- translog stats for this engine or null if not providedobtainLock
- iftrue
this engine will try to obtain theIndexWriter.WRITE_LOCK_NAME
lock. Otherwise the lock won't be obtainedreaderWrapperFunction
- allows to wrap the index-reader for this engine.
-
-
Method Detail
-
assertMaxSeqNoEqualsToGlobalCheckpoint
protected void assertMaxSeqNoEqualsToGlobalCheckpoint(long maxSeqNo, long globalCheckpoint)
-
verifyEngineBeforeIndexClosing
public void verifyEngineBeforeIndexClosing() throws java.lang.IllegalStateException
Description copied from class:Engine
Performs the pre-closing checks on theEngine
.- Overrides:
verifyEngineBeforeIndexClosing
in classEngine
- Throws:
java.lang.IllegalStateException
- if the sanity checks failed
-
wrapReader
protected final org.apache.lucene.index.DirectoryReader wrapReader(org.apache.lucene.index.DirectoryReader reader, java.util.function.Function<org.apache.lucene.index.DirectoryReader,org.apache.lucene.index.DirectoryReader> readerWrapperFunction) throws java.io.IOException
- Throws:
java.io.IOException
-
open
protected org.apache.lucene.index.DirectoryReader open(org.apache.lucene.index.IndexCommit commit) throws java.io.IOException
- Throws:
java.io.IOException
-
closeNoLock
protected void closeNoLock(java.lang.String reason, java.util.concurrent.CountDownLatch closedLatch)
Description copied from class:Engine
Method to close the engine while the write lock is held. Must decrement the supplied when closing work is done and resources are freed.- Specified by:
closeNoLock
in classEngine
-
buildSeqNoStats
public static SeqNoStats buildSeqNoStats(org.apache.lucene.index.SegmentInfos infos)
-
get
public Engine.GetResult get(Engine.Get get, java.util.function.BiFunction<java.lang.String,Engine.SearcherScope,Engine.Searcher> searcherFactory) throws EngineException
- Specified by:
get
in classEngine
- Throws:
EngineException
-
getReferenceManager
protected org.apache.lucene.search.ReferenceManager<org.apache.lucene.search.IndexSearcher> getReferenceManager(Engine.SearcherScope scope)
- Specified by:
getReferenceManager
in classEngine
-
getLastCommittedSegmentInfos
protected org.apache.lucene.index.SegmentInfos getLastCommittedSegmentInfos()
- Specified by:
getLastCommittedSegmentInfos
in classEngine
-
getHistoryUUID
public java.lang.String getHistoryUUID()
Description copied from class:Engine
returns the history uuid for the engine- Specified by:
getHistoryUUID
in classEngine
-
getWritingBytes
public long getWritingBytes()
Description copied from class:Engine
Returns how many bytes we are currently moving from heap to disk- Specified by:
getWritingBytes
in classEngine
-
getIndexThrottleTimeInMillis
public long getIndexThrottleTimeInMillis()
Description copied from class:Engine
Returns the number of milliseconds this engine was under index throttling.- Specified by:
getIndexThrottleTimeInMillis
in classEngine
-
isThrottled
public boolean isThrottled()
Description copied from class:Engine
Returns thetrue
iff this engine is currently under index throttling.- Specified by:
isThrottled
in classEngine
- See Also:
Engine.getIndexThrottleTimeInMillis()
-
index
public Engine.IndexResult index(Engine.Index index)
Description copied from class:Engine
Perform document index operation on the engine- Specified by:
index
in classEngine
- 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
-
delete
public Engine.DeleteResult delete(Engine.Delete delete)
Description copied from class:Engine
Perform document delete operation on the engine- Specified by:
delete
in classEngine
- 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
-
noOp
public Engine.NoOpResult noOp(Engine.NoOp noOp)
-
isTranslogSyncNeeded
public boolean isTranslogSyncNeeded()
Description copied from class:Engine
Checks if the underlying storage sync is required.- Specified by:
isTranslogSyncNeeded
in classEngine
-
ensureTranslogSynced
public boolean ensureTranslogSynced(java.util.stream.Stream<Translog.Location> locations)
Description copied from class:Engine
Ensures that all locations in the given stream have been written to the underlying storage.- Specified by:
ensureTranslogSynced
in classEngine
-
syncTranslog
public void syncTranslog()
- Specified by:
syncTranslog
in classEngine
-
acquireRetentionLock
public java.io.Closeable acquireRetentionLock()
Description copied from class:Engine
Acquires a lock on the translog files and Lucene soft-deleted documents to prevent them from being trimmed- Specified by:
acquireRetentionLock
in classEngine
-
newChangesSnapshot
public Translog.Snapshot newChangesSnapshot(java.lang.String source, MapperService mapperService, long fromSeqNo, long toSeqNo, boolean requiredFullRange) throws java.io.IOException
Description copied from class:Engine
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 anIllegalStateException
.- Specified by:
newChangesSnapshot
in classEngine
- Throws:
java.io.IOException
-
readHistoryOperations
public Translog.Snapshot readHistoryOperations(java.lang.String source, MapperService mapperService, long startingSeqNo) throws java.io.IOException
Description copied from class:Engine
Creates a new history snapshot for reading operations sincestartingSeqNo
(inclusive). The returned snapshot can be retrieved from either Lucene index or translog files.- Specified by:
readHistoryOperations
in classEngine
- Throws:
java.io.IOException
-
estimateNumberOfHistoryOperations
public int estimateNumberOfHistoryOperations(java.lang.String source, MapperService mapperService, long startingSeqNo) throws java.io.IOException
Description copied from class:Engine
Returns the estimated number of history operations whose seq# at leaststartingSeqNo
(inclusive) in this engine.- Specified by:
estimateNumberOfHistoryOperations
in classEngine
- Throws:
java.io.IOException
-
hasCompleteOperationHistory
public boolean hasCompleteOperationHistory(java.lang.String source, MapperService mapperService, long startingSeqNo) throws java.io.IOException
Description copied from class:Engine
Checks if this engine has every operations sincestartingSeqNo
(inclusive) in its history (either Lucene or translog)- Specified by:
hasCompleteOperationHistory
in classEngine
- Throws:
java.io.IOException
-
getMinRetainedSeqNo
public long getMinRetainedSeqNo()
Description copied from class:Engine
Gets the minimum retained sequence number for this engine.- Specified by:
getMinRetainedSeqNo
in classEngine
- Returns:
- the minimum retained sequence number
-
getTranslogStats
public TranslogStats getTranslogStats()
- Specified by:
getTranslogStats
in classEngine
-
getTranslogLastWriteLocation
public Translog.Location getTranslogLastWriteLocation()
Description copied from class:Engine
Returns the last location that the translog of this engine has written into.- Specified by:
getTranslogLastWriteLocation
in classEngine
-
getLocalCheckpoint
public long getLocalCheckpoint()
- Specified by:
getLocalCheckpoint
in classEngine
- Returns:
- the local checkpoint for this Engine
-
getSeqNoStats
public SeqNoStats getSeqNoStats(long globalCheckpoint)
- Specified by:
getSeqNoStats
in classEngine
- Returns:
- a
SeqNoStats
object, using local state and the supplied global checkpoint
-
getLastSyncedGlobalCheckpoint
public long getLastSyncedGlobalCheckpoint()
Description copied from class:Engine
Returns the latest global checkpoint value that has been persisted in the underlying storage (i.e. translog's checkpoint)- Specified by:
getLastSyncedGlobalCheckpoint
in classEngine
-
getIndexBufferRAMBytesUsed
public long getIndexBufferRAMBytesUsed()
Description copied from class:Engine
How much heap is used that would be freed by a refresh. Note that this may throwAlreadyClosedException
.- Specified by:
getIndexBufferRAMBytesUsed
in classEngine
-
segments
public java.util.List<Segment> segments(boolean verbose)
Description copied from class:Engine
The list of segments in the engine.
-
refresh
public void refresh(java.lang.String source)
Description copied from class:Engine
Synchronously refreshes the engine for new search operations to reflect the latest changes.
-
writeIndexingBuffer
public void writeIndexingBuffer() throws EngineException
Description copied from class:Engine
Called when our engine is using too much heap and should move buffered indexed/deleted documents to disk.- Specified by:
writeIndexingBuffer
in classEngine
- Throws:
EngineException
-
shouldPeriodicallyFlush
public boolean shouldPeriodicallyFlush()
Description copied from class:Engine
Checks if this engine should be flushed periodically. This check is mainly based on the uncommitted translog size and the translog flush threshold setting.- Specified by:
shouldPeriodicallyFlush
in classEngine
-
syncFlush
public Engine.SyncedFlushResult syncFlush(java.lang.String syncId, Engine.CommitId expectedCommitId)
Description copied from class:Engine
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.
-
flush
public Engine.CommitId flush(boolean force, boolean waitIfOngoing) throws EngineException
Description copied from class:Engine
Flushes the state of the engine including the transaction log, clearing memory.- Specified by:
flush
in classEngine
- Parameters:
force
- iftrue
a lucene commit is executed even if no changes need to be committed.waitIfOngoing
- iftrue
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
-
forceMerge
public void forceMerge(boolean flush, int maxNumSegments, boolean onlyExpungeDeletes, boolean upgrade, boolean upgradeOnlyAncientSegments)
Description copied from class:Engine
Triggers a forced merge on this engine- Specified by:
forceMerge
in classEngine
-
acquireLastIndexCommit
public Engine.IndexCommitRef acquireLastIndexCommit(boolean flushFirst)
Description copied from class:Engine
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.- Specified by:
acquireLastIndexCommit
in classEngine
- Parameters:
flushFirst
- indicates whether the engine should flush before returning the snapshot
-
acquireSafeIndexCommit
public Engine.IndexCommitRef acquireSafeIndexCommit()
Description copied from class:Engine
Snapshots the most recent safe index commit from the engine.- Specified by:
acquireSafeIndexCommit
in classEngine
-
activateThrottling
public void activateThrottling()
Description copied from class:Engine
Request that this engine throttle incoming indexing requests to one thread. Must be matched by a later call toEngine.deactivateThrottling()
.- Specified by:
activateThrottling
in classEngine
-
deactivateThrottling
public void deactivateThrottling()
Description copied from class:Engine
Reverses a previousEngine.activateThrottling()
call.- Specified by:
deactivateThrottling
in classEngine
-
trimUnreferencedTranslogFiles
public void trimUnreferencedTranslogFiles()
Description copied from class:Engine
checks and removes translog files that no longer need to be retained. SeeTranslogDeletionPolicy
for details- Specified by:
trimUnreferencedTranslogFiles
in classEngine
-
shouldRollTranslogGeneration
public boolean shouldRollTranslogGeneration()
Description copied from class:Engine
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.- Specified by:
shouldRollTranslogGeneration
in classEngine
- Returns:
true
if the current generation should be rolled to a new generation
-
rollTranslogGeneration
public void rollTranslogGeneration()
Description copied from class:Engine
Rolls the translog generation and cleans unneeded.- Specified by:
rollTranslogGeneration
in classEngine
-
restoreLocalHistoryFromTranslog
public int restoreLocalHistoryFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner)
Description copied from class:Engine
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.- Specified by:
restoreLocalHistoryFromTranslog
in classEngine
- Returns:
- the number of translog operations have been recovered
-
fillSeqNoGaps
public int fillSeqNoGaps(long primaryTerm)
Description copied from class:Engine
Fills up the local checkpoints history with no-ops until the local checkpoint and the max seen sequence ID are identical.- Specified by:
fillSeqNoGaps
in classEngine
- Parameters:
primaryTerm
- the shards primary term this engine was created for- Returns:
- the number of no-ops added
-
recoverFromTranslog
public Engine recoverFromTranslog(Engine.TranslogRecoveryRunner translogRecoveryRunner, long recoverUpToSeqNo)
Description copied from class:Engine
Performs recovery from the transaction log up torecoverUpToSeqNo
(inclusive). This operation will close the engine if the recovery fails.- Specified by:
recoverFromTranslog
in classEngine
- Parameters:
translogRecoveryRunner
- the translog recovery runnerrecoverUpToSeqNo
- the upper bound, inclusive, of sequence number to be recovered
-
skipTranslogRecovery
public void skipTranslogRecovery()
Description copied from class:Engine
Do not replay translog operations, but make the engine be ready.- Specified by:
skipTranslogRecovery
in classEngine
-
trimOperationsFromTranslog
public void trimOperationsFromTranslog(long belowTerm, long aboveSeqNo)
Description copied from class:Engine
Trims translog for terms belowbelowTerm
and seq# aboveaboveSeqNo
- Specified by:
trimOperationsFromTranslog
in classEngine
- See Also:
Translog.trimOperations(long, long)
-
maybePruneDeletes
public void maybePruneDeletes()
Description copied from class:Engine
Tries to prune buffered deletes from the version map.- Specified by:
maybePruneDeletes
in classEngine
-
docStats
public DocsStats docStats()
Description copied from class:Engine
Returns theDocsStats
for this engine
-
updateMaxUnsafeAutoIdTimestamp
public void updateMaxUnsafeAutoIdTimestamp(long newTimestamp)
Description copied from class:Engine
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 mostnewTimestamp
.- Specified by:
updateMaxUnsafeAutoIdTimestamp
in classEngine
-
reinitializeMaxSeqNoOfUpdatesOrDeletes
public void reinitializeMaxSeqNoOfUpdatesOrDeletes()
Description copied from class:Engine
A primary shard calls this method to re-initialize the max_seq_no_of_updates marker using the max_seq_no from Lucene index and translog before replaying the local translog in its local recovery.- Specified by:
reinitializeMaxSeqNoOfUpdatesOrDeletes
in classEngine
-
processReaders
protected void processReaders(org.apache.lucene.index.IndexReader reader, org.apache.lucene.index.IndexReader previousReader)
-
refreshNeeded
public boolean refreshNeeded()
- Overrides:
refreshNeeded
in classEngine
-
-