Class ControlledRealTimeReopenThread<T>

  • All Implemented Interfaces:
    java.io.Closeable, java.lang.AutoCloseable, java.lang.Runnable

    public class ControlledRealTimeReopenThread<T>
    extends java.lang.Thread
    implements java.io.Closeable
    Utility class that runs a thread to manage periodicc reopens of a ReferenceManager, with methods to wait for a specific index changes to become visible. When a given search request needs to see a specific index change, call the {#waitForGeneration} to wait for that change to be visible. Note that this will only scale well if most searches do not need to wait for a specific index generation.
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private class  ControlledRealTimeReopenThread.HandleRefresh  
      • Nested classes/interfaces inherited from class java.lang.Thread

        java.lang.Thread.State, java.lang.Thread.UncaughtExceptionHandler
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void close()  
      long getSearchingGen()
      Returns which generation the current searcher is guaranteed to include.
      private void refreshDone()  
      void run()  
      void waitForGeneration​(long targetGen)
      Waits for the target generation to become visible in the searcher.
      boolean waitForGeneration​(long targetGen, int maxMS)
      Waits for the target generation to become visible in the searcher, up to a maximum specified milli-seconds.
      • Methods inherited from class java.lang.Thread

        activeCount, checkAccess, clone, countStackFrames, currentThread, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, onSpinWait, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, suspend, toString, yield
      • Methods inherited from class java.lang.Object

        equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • targetMaxStaleNS

        private final long targetMaxStaleNS
      • targetMinStaleNS

        private final long targetMinStaleNS
      • finish

        private volatile boolean finish
      • waitingGen

        private volatile long waitingGen
      • searchingGen

        private volatile long searchingGen
      • refreshStartGen

        private long refreshStartGen
      • reopenLock

        private final java.util.concurrent.locks.ReentrantLock reopenLock
      • reopenCond

        private final java.util.concurrent.locks.Condition reopenCond
    • Constructor Detail

      • ControlledRealTimeReopenThread

        public ControlledRealTimeReopenThread​(IndexWriter writer,
                                              ReferenceManager<T> manager,
                                              double targetMaxStaleSec,
                                              double targetMinStaleSec)
        Create ControlledRealTimeReopenThread, to periodically reopen the ReferenceManager.
        Parameters:
        targetMaxStaleSec - Maximum time until a new reader must be opened; this sets the upper bound on how slowly reopens may occur, when no caller is waiting for a specific generation to become visible.
        targetMinStaleSec - Mininum time until a new reader can be opened; this sets the lower bound on how quickly reopens may occur, when a caller is waiting for a specific generation to become visible.
    • Method Detail

      • refreshDone

        private void refreshDone()
      • close

        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
      • waitForGeneration

        public void waitForGeneration​(long targetGen)
                               throws java.lang.InterruptedException
        Waits for the target generation to become visible in the searcher. If the current searcher is older than the target generation, this method will block until the searcher is reopened, by another via ReferenceManager.maybeRefresh() or until the ReferenceManager is closed.
        Parameters:
        targetGen - the generation to wait for
        Throws:
        java.lang.InterruptedException
      • waitForGeneration

        public boolean waitForGeneration​(long targetGen,
                                         int maxMS)
                                  throws java.lang.InterruptedException
        Waits for the target generation to become visible in the searcher, up to a maximum specified milli-seconds. If the current searcher is older than the target generation, this method will block until the searcher has been reopened by another thread via ReferenceManager.maybeRefresh(), the given waiting time has elapsed, or until the ReferenceManager is closed.

        NOTE: if the waiting time elapses before the requested target generation is available the current SearcherManager is returned instead.

        Parameters:
        targetGen - the generation to wait for
        maxMS - maximum milliseconds to wait, or -1 to wait indefinitely
        Returns:
        true if the targetGeneration is now available, or false if maxMS wait time was exceeded
        Throws:
        java.lang.InterruptedException
      • run

        public void run()
        Specified by:
        run in interface java.lang.Runnable
        Overrides:
        run in class java.lang.Thread
      • getSearchingGen

        public long getSearchingGen()
        Returns which generation the current searcher is guaranteed to include.