A
Workspace implementation taking advantage of NRT Lucene features.
IndexReader instances are obtained directly from the
IndexWriter, which is not forced
to flush all pending changes to the
Directory structure.
Lucene requires in its current version to flush delete operations, or the
IndexReaders
retrieved via NRT will include deleted Document instances in queries; flushing delete operations
happens to be quite expensive so this
Workspace implementation attempts to detect when such
a flush operation is needed.
Applying write operations flags "indexReader requirements" with needs for either normal flush
or flush including deletes, but does not update
IndexReader instances. The
IndexReaders
are updated only if and when a fresh
IndexReader is requested via
#openIndexReader().
This method will check if it can return the last opened
IndexReader or in case of the reader being stale
open a fresh reader from the current
IndexWriter.
Generation counters are used to track need-at-least version versus last-updated-at version:
shared state is avoided between index writers and reader threads to avoid high complexity.
The method
#afterTransactionApplied(boolean,boolean) might trigger multiple times flagging
the index to be dirty without triggering an actual
IndexReader refresh, so the version counters
can have gaps: method
#refreshReaders() will always jump to latest seen version, as it will
refresh the index to satisfy both kinds of flush requirements (writes and deletes).
We keep a reference
IndexReader in the
#currentReader atomic reference as a fast path
for multiple read events when the index is not dirty.
This class implements both
Workspace and
ReaderProvider.