[
https://issues.apache.org/jira/browse/JCR-1213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12545786
]
Marcel Reutegger commented on JCR-1213:
---------------------------------------
Ard, thank you very much for the patch. I'm about to create a performance test,
which basically does the following:
- create lots of nodes ;)
- run queries that use DescendantSelfAxisQuery and/or ChildAxisQuery
- at the same time randomly modify content
I reviewed you patch and I also don't like the dependency to SingleTermDocs in
UUIDDocId.
I've created a patch as well, but took a somewhat different approach. Instead
of using a weak reference to the index reader, I used the creation tick in the
CachingIndexReader. The creation tick uniquely identifies an index segment as
well as the version of the segment. E.g. if a document is added a new
CachingIndexReader is created for that segment with a new creation tick. The
same will probably also work for the DocNumberCache, which currently uses
strong references. I'd like to change that as well, but that's a bit off topic
and and different issue.
I will run the above test with 1) the current code base, 2) your patch and 3)
my patch.
I'll let you know about the results....
> 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-mreutegg.patch, JCR-1213.patch
>
>
> 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.