[ 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.