[ 
https://issues.apache.org/jira/browse/OAK-2569?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14506543#comment-14506543
 ] 

Thomas Mueller commented on OAK-2569:
-------------------------------------

I think this is an important issue and needs to be fixed for 1.2.2.

> catching the exception

I think that's the wrong solution. There are multiple problem with this, one is 
that we should not use exceptions for flow control. But more importantly, if 
many documents were added and removed at the same time, some of them might not 
be returned. That means the query result would be wrong (the result could miss 
data that was there in both the old and the new revision).

> key thing would be to come up with a test case reproducing the issue

Yes, that is probably quite tricky. But it should be possible, by adding some 
delay to read the result, and/or by using a synchronous lucene index.

> We would need to hold on to IndexSearcher from within Cursor

That would be a possible solution. What are the disadvantages?


> LuceneIndex#loadDocs can throw IllegalArgumentException
> -------------------------------------------------------
>
>                 Key: OAK-2569
>                 URL: https://issues.apache.org/jira/browse/OAK-2569
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: lucene
>    Affects Versions: 1.1.6, 1.2.1
>            Reporter: Alex Parvulescu
>             Fix For: 1.3.0, 1.2.2
>
>
> It looks like in some cases a IllegalArgumentException will be thrown if the 
> _nextBatchSize_ passed to the _searchAfter_ method call is smaller than the 
> current searcher limit (_lastDoc.doc_).
> Stack trace for the failure:
> {code}
> java.lang.IllegalArgumentException: after.doc exceeds the number of documents 
> in the reader: after.doc=387045 limit=386661
>  at org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:442)
>  at org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:243)
>  at 
> org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndex$1.loadDocs(LuceneIndex.java:352)
>  at 
> org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndex$1.computeNext(LuceneIndex.java:292)
>  at 
> org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndex$1.computeNext(LuceneIndex.java:283)
>  at 
> com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
>  at 
> com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
>  at 
> org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndex$LucenePathCursor$1.hasNext(LuceneIndex.java:1055)
>  at com.google.common.collect.Iterators$7.computeNext(Iterators.java:645)
>  at 
> com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
>  at 
> com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$PathCursor.hasNext(Cursors.java:198)
>  at 
> org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndex$LucenePathCursor.hasNext(LuceneIndex.java:1076)
>  at 
> org.apache.jackrabbit.oak.plugins.index.aggregate.AggregationCursor.fetchNext(AggregationCursor.java:88)
>  at 
> org.apache.jackrabbit.oak.plugins.index.aggregate.AggregationCursor.hasNext(AggregationCursor.java:75)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.fetchNext(Cursors.java:389)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.hasNext(Cursors.java:381)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.fetchNext(Cursors.java:389)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.hasNext(Cursors.java:381)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.fetchNext(Cursors.java:389)
>  at 
> org.apache.jackrabbit.oak.spi.query.Cursors$IntersectionCursor.hasNext(Cursors.java:381)
>  at 
> org.apache.jackrabbit.oak.query.ast.SelectorImpl.next(SelectorImpl.java:401)
>  at 
> org.apache.jackrabbit.oak.query.QueryImpl$RowIterator.fetchNext(QueryImpl.java:664)
>  at 
> org.apache.jackrabbit.oak.query.QueryImpl$RowIterator.hasNext(QueryImpl.java:689)
>  at 
> org.apache.jackrabbit.oak.query.FilterIterators$SortIterator.init(FilterIterators.java:203)
>  at 
> org.apache.jackrabbit.oak.query.FilterIterators$SortIterator.hasNext(FilterIterators.java:237)
>  at 
> org.apache.jackrabbit.oak.jcr.query.QueryResultImpl$1.fetch(QueryResultImpl.java:108)
>  at 
> org.apache.jackrabbit.oak.jcr.query.QueryResultImpl$1.<init>(QueryResultImpl.java:104)
>  at 
> org.apache.jackrabbit.oak.jcr.query.QueryResultImpl.getRows(QueryResultImpl.java:91)
>  at org.apache.jackrabbit.commons.query.GQL.executeJcrQuery(GQL.java:440)
>  at org.apache.jackrabbit.commons.query.GQL.execute(GQL.java:434)
>  at org.apache.jackrabbit.commons.query.GQL.execute(GQL.java:327)
>  at org.apache.jackrabbit.commons.query.GQL.execute(GQL.java:310)
>  at org.apache.jackrabbit.commons.query.GQL.execute(GQL.java:296)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to