[ 
https://issues.apache.org/jira/browse/JCR-1213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12541821
 ] 

Ard Schrijvers commented on JCR-1213:
-------------------------------------

"return id.getDocumentNumber(this) needs to be replaced by return 
id.getDocumentNumber(subReaders[i]); and something similar in 
CachingMultiReader."

The above does solve the problem.
In SearchIndex it is more complicated than this. In SearchIndex

public int getParent(int n) throws IOException {
            int i = readerIndex(n);
            DocId id = subReaders[i].getParentDocId(n - starts[i]);
            id = id.applyOffset(starts[i]);
            return id.getDocumentNumber(subReaders[i]);
            //return id.getDocumentNumber(this);
        }

replacing the last line by the subReaders[i] is not enough, because I missed 
the part that  subReaders[i]  returns a CachingMultiReader, keeping the problem 
of a cache which will be cleared to often (when a single index changes). This 
is also logical, because I did not understand how a parent document number 
could be found if the parent would be in a different lucene index. 

So, in the id.getDocumentNumber(subReaders[i]) I think I need to check in which 
indexReader the parent is found, and use this indexReader instance for the 
WeakReference. I'll try to implement this.




> UUIDDocId cache does not work properly because of weakReferences in 
> combination with new instance for combined indexreader 
> ---------------------------------------------------------------------------------------------------------------------------
>
>                 Key: JCR-1213
>                 URL: https://issues.apache.org/jira/browse/JCR-1213
>             Project: Jackrabbit
>          Issue Type: Improvement
>          Components: query
>    Affects Versions: 1.3.3
>            Reporter: Ard Schrijvers
>             Fix For: 1.4
>
>
> Queries that use ChildAxisQuery or DescendantSelfAxisQuery make use of 
> getParent() functions to know wether the parents are correct and if the 
> result is allowed. The getParent() is called recursively for every hit, and 
> can become very expensive. Hence, in DocId.UUIDDocId, the parents are cached. 
> Currently,  docId.UUIDDocId's are cached by having a WeakRefence to the 
> CombinedIndexReader, but, this CombinedIndexReader is recreated all the time, 
> implying that a gc() is allowed to remove the 'expensive' cache.
> A much better solution is to not have a weakReference to the 
> CombinedIndexReader, but to a reference of each indexreader segment. This 
> means, that in getParent(int n) in SearchIndex the return 
> return id.getDocumentNumber(this) needs to be replaced by return 
> id.getDocumentNumber(subReaders[i]); and something similar in 
> CachingMultiReader. 
> That is all. Obviously, when a node/property is added/removed/changed, some 
> parts of the cached DocId.UUIDDocId will be invalid, but mainly small indexes 
> are updated frequently, which obviously are less expensive to recompute.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to