Chris M. Hostetter created LUCENE-10292:
-------------------------------------------

             Summary: AnalyzingInfixSuggester thread safety: lookup() fails 
during (re)build()
                 Key: LUCENE-10292
                 URL: https://issues.apache.org/jira/browse/LUCENE-10292
             Project: Lucene - Core
          Issue Type: Bug
            Reporter: Chris M. Hostetter


I'm filing this based on anecdotal information from a Solr user w/o 
experiencing it first hand (and I don't have a test case to demonstrate it) but 
based on a reading of the code the underlying problem seems self evident...

With all other Lookup implementations I've examined, it is possible to call 
{{lookup()}} regardless of whether another thread is concurrently calling 
{{build()}} – in all cases I've seen, it is even possible to call {{lookup()}} 
even if {{build()}} has never been called: the result is just an "empty" 
{{List<LookupResult>}} 

Typically this is works because the {{build()}} method uses temporary 
datastructures until it's "build logic" is complete, at which point it 
atomically replaces the datastructures used by the {{lookup()}} method.   In 
the case of {{AnalyzingInfixSuggester}} however, the {{build()}} method starts 
by closing & null'ing out the {{protected SearcherManager searcherMgr}} (which 
it only populates again once it's completed building up it's index) and then 
the lookup method starts with...
{code:java}
    if (searcherMgr == null) {
      throw new IllegalStateException("suggester was not built");
    }
{code}
... meaning it is unsafe to call {{AnalyzingInfixSuggester.lookup()}} in any 
situation where another thread may be calling 
{{AnalyzingInfixSuggester.build()}}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org
For additional commands, e-mail: issues-h...@lucene.apache.org

Reply via email to