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

Christoph Kiehl updated JCR-1213:
---------------------------------

    Attachment:  JCR-1213-ckiehl.txt

I like Marcels idea to use the creation tick to identity the base index reader 
without caring about the index reader hierarchy. This patch is a modified 
version of Marcels patch moving the logic out of UUIDDocId to 
CachingMultiReader which removes the necessity to expose OffsetIndexReaders. 
UUIDDocId doesn't even know about offsets anymore. I'm not sure though if 
creating those MultiIndexReaderDoc objects is to expensive performance and 
memory wise although I got similar performance numbers using Marcels test.
This code could easily be used for DocNumberCache as well as Marcel stated 
which is a big plus I think.
Ok then, beat me for just modifying your code ;) I really appreciate your work 
on this issue.

> 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
>
>         Attachments:  JCR-1213-ckiehl.txt, JCR-1213-mreutegg.patch, 
> JCR-1213.patch, JCR1213Test.java
>
>
> 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