Matthew, just because an index is read-only on some server it doesn't mean it 
contains no deletes (no docs marked as deleted, but not yet removed from the 
index).  So you still want to check isDeleted(doc) *unless* you are certain the 
index has no docs marked as deleted (this happens after optimization).

Otis
--
Sematext -- http://sematext.com/ -- Lucene - Solr - Nutch



----- Original Message ----
> From: Matthew Runo <[EMAIL PROTECTED]>
> To: solr-user@lucene.apache.org
> Sent: Tuesday, August 19, 2008 4:26:59 PM
> Subject: Re: Deadlock in lucene?
> 
> I know this isn't really the place for this, so please forgive me -  
> but does this patch look reasonably safe to use to skip the isDeleted  
> check inside of FunctionQuery?
> 
> My reasoning behind this is that many people (us included) will be  
> building the index on a separate server, and then using the  
> replication scripts to publish the files out to several read-only  
> servers. On those instances, deletedDocs would always be empty, since  
> it's a read only instance - and so we can conveniently skip the Lucene  
> code in question. This flag would also be good for other optimizations  
> that can only be made when you assume the index is read-only.
> 
> Solr seems to work with the flag set - any reasons why this will crash  
> and/or kill my kitten?
> 
> (please forgive my posting this here instead of in solr-dev!)
> 
> Index: src/java/org/apache/solr/search/FunctionQParser.java
> ===================================================================
> --- src/java/org/apache/solr/search/FunctionQParser.java    (revision  
> 687135)
> +++ src/java/org/apache/solr/search/FunctionQParser.java    Tue Aug 19  
> 11:08:45 PDT 2008
> @@ -49,7 +49,7 @@
>       }
>       ***/
> 
> -    return new FunctionQuery(vs);
> +    return new FunctionQuery(vs,  
> req.getSchema().getSolrConfig().isReadOnly() );
>     }
> 
>     /**
> Index: src/java/org/apache/solr/search/function/FunctionQuery.java
> ===================================================================
> --- src/java/org/apache/solr/search/function/FunctionQuery.java    
> (revision 687135)
> +++ src/java/org/apache/solr/search/function/FunctionQuery.java    Tue  
> Aug 19 11:08:45 PDT 2008
> @@ -31,12 +31,14 @@
>    */
>   public class FunctionQuery extends Query {
>     ValueSource func;
> +  Boolean readOnly;
> 
>     /**
>      * @param func defines the function to be used for scoring
>      */
> -  public FunctionQuery(ValueSource func) {
> +  public FunctionQuery(ValueSource func, Boolean readOnly) {
>       this.func=func;
> +    this.readOnly=readOnly;
>     }
> 
>     /** @return The associated ValueSource */
> @@ -113,7 +115,7 @@
>           if (doc>=maxDoc) {
>             return false;
>           }
> -        if (reader.isDeleted(doc)) continue;
> +        if (!readOnly && reader.isDeleted(doc)) continue;
>           // todo: maybe allow score() to throw a specific exception
>           // and continue on to the next document if it is thrown...
>           // that may be useful, but exceptions aren't really good
> Index: src/java/org/apache/solr/core/Config.java
> ===================================================================
> --- src/java/org/apache/solr/core/Config.java    (revision 687135)
> +++ src/java/org/apache/solr/core/Config.java    Tue Aug 19 11:08:45 PDT  
> 2008
> @@ -45,6 +45,8 @@
>     private final String name;
>     private final SolrResourceLoader loader;
> 
> +  private Boolean readOnly;
> +
>     /**
>      * @deprecated Use [EMAIL PROTECTED] #Config(SolrResourceLoader, String,  
> InputStream, String)} instead.
>      */
> @@ -254,6 +256,19 @@
>        return val!=null ? Double.parseDouble(val) : def;
>      }
> 
> +  /**
> +   * Is the index set up to be readOnly? If so, this will cause the  
> FunctionQuery stuff to not check
> +   * for deleted documents.
> +   * @return boolean readOnly
> +   */
> +   public boolean isReadOnly() {
> +       if( this.readOnly == null ){
> +           readOnly = getBool("/mainIndex/readOnly", false);
> +       }
> +
> +       return readOnly;
> +   }
> +
>     // The following functions were moved to ResourceLoader
>     
> //-----------------------------------------------------------------------------
> 
> Index: example/solr/conf/solrconfig.xml
> ===================================================================
> --- example/solr/conf/solrconfig.xml    (revision 687135)
> +++ example/solr/conf/solrconfig.xml    Tue Aug 19 11:13:13 PDT 2008
> @@ -114,6 +114,12 @@
>            This is not needed if lock type is 'none' or 'single'
>        -->
>       false
> +
> +    
> +    false
>     
> 
>     > use
> 
> 
> 
> --- end patch ---
> 
> On Aug 18, 2008, at 8:04 PM, Yonik Seeley wrote:
> 
> > It's not a deadlock (just a synchronization bottleneck) , but it is a
> > known issue in Lucene and there has been some progress in improving
> > the situation.
> > -Yonik
> >
> >
> > On Mon, Aug 18, 2008 at 10:55 PM, Matthew Runo   
> > wrote:
> >> Hello folks!
> >>
> >> I was just wondering if anyone else has seen this issue under heavy  
> >> load. We
> >> had some servers set to very high thread limits (12 core servers  
> >> with 32
> >> gigs of ram), and found several threads would end up in this  
> >> state....
> >>
> >> Name: http-8080-891
> >> State: BLOCKED on [EMAIL PROTECTED]  
> >> owned by:
> >> http-8080-191
> >> Total blocked: 97,926  Total waited: 16
> >>
> >> Stack trace:
> >> org.apache.lucene.index.SegmentReader.isDeleted(SegmentReader.java: 
> >> 674)
> >> org.apache.solr.search.function.FunctionQuery 
> >> $AllScorer.next(FunctionQuery.java:116)
> >> org 
> >> .apache 
> >> .lucene 
> >> .util.ScorerDocQueue.topNextAndAdjustElsePop(ScorerDocQueue.java:116)
> >> org 
> >> .apache 
> >> .lucene 
> >> .search 
> >> .DisjunctionSumScorer.advanceAfterCurrent(DisjunctionSumScorer.java: 
> >> 175)
> >> org 
> >> .apache 
> >> .lucene 
> >> .search.DisjunctionSumScorer.skipTo(DisjunctionSumScorer.java:228)
> >> org.apache.lucene.search.ReqOptSumScorer.score(ReqOptSumScorer.java: 
> >> 76)
> >> org.apache.lucene.search.BooleanScorer2.score(BooleanScorer2.java: 
> >> 357)
> >> org.apache.lucene.search.BooleanScorer2.score(BooleanScorer2.java: 
> >> 320)
> >> org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:137)
> >> org.apache.lucene.search.Searcher.search(Searcher.java:126)
> >> org.apache.lucene.search.Searcher.search(Searcher.java:105)
> >> org 
> >> .apache 
> >> .solr 
> >> .search.SolrIndexSearcher.getDocListAndSetNC(SolrIndexSearcher.java: 
> >> 1148)
> >> org 
> >> .apache 
> >> .solr.search.SolrIndexSearcher.getDocListC(SolrIndexSearcher.java: 
> >> 834)
> >> org 
> >> .apache.solr.search.SolrIndexSearcher.search(SolrIndexSearcher.java: 
> >> 269)
> >> org 
> >> .apache 
> >> .solr.handler.component.QueryComponent.process(QueryComponent.java: 
> >> 160)
> >> org 
> >> .apache 
> >> .solr 
> >> .handler 
> >> .component.SearchHandler.handleRequestBody(SearchHandler.java:169)
> >> org 
> >> .apache 
> >> .solr 
> >> .handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java: 
> >> 128)
> >> org.apache.solr.core.SolrCore.execute(SolrCore.java:1143)
> >> org 
> >> .apache 
> >> .solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338)
> >> org 
> >> .apache 
> >> .solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java: 
> >> 272)
> >> org 
> >> .apache 
> >> .catalina 
> >> .core 
> >> .ApplicationFilterChain 
> >> .internalDoFilter(ApplicationFilterChain.java:235)
> >> org 
> >> .apache 
> >> .catalina 
> >> .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 
> >> 206)
> >> org 
> >> .apache 
> >> .catalina 
> >> .core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
> >> org 
> >> .apache 
> >> .catalina 
> >> .core.StandardContextValve.invoke(StandardContextValve.java:175)
> >> org 
> >> .apache 
> >> .catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
> >> org 
> >> .apache 
> >> .catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
> >> org 
> >> .apache 
> >> .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 
> >> 109)
> >> org 
> >> .apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 
> >> 286)
> >> org 
> >> .apache.coyote.http11.Http11Processor.process(Http11Processor.java: 
> >> 844)
> >> org.apache.coyote.http11.Http11Protocol 
> >> $Http11ConnectionHandler.process(Http11Protocol.java:583)
> >> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java: 
> >> 447)
> >> java.lang.Thread.run(Thread.java:619)
> >>
> >> Thanks for your time!
> >>
> >> Matthew Runo
> >> Software Engineer, Zappos.com
> >> [EMAIL PROTECTED] - 702-943-7833
> >>
> >>
> >

Reply via email to