[ 
https://issues.apache.org/jira/browse/JCR-2357?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12768280#action_12768280
 ] 

Marcel Reutegger commented on JCR-2357:
---------------------------------------

> so it looks like the doc number is an identifier in the segment (?).

yes, that's correct. the document number is only unique within an index 
segment. in jackrabbit there may be (and usually are) multiple index segments.

> This one is happening in the SearchManager event consumer, which comes after 
> the FieldReferenceListener and RulesListener

does that mean your listeners are SynchronousEventListeners or regular 
EventListeners?


> Duplicate entries in the index
> ------------------------------
>
>                 Key: JCR-2357
>                 URL: https://issues.apache.org/jira/browse/JCR-2357
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: indexing
>    Affects Versions: 1.5.0, 1.6.0, 2.0-alpha9
>            Reporter: Benjamin Papez
>            Priority: Critical
>
> We are very frequently having problems with queries, because the results are 
> always duplicated. The reason for it has been identified to be in the 
> indexing, because when we get the problem, we now look at the index with 
> Luke, and we can see that documents with the same UUID are there twice. This 
> happens with Jackrabbit 1.5.0, 1.6.0 and also with 2.0-alpha10. 
> I am able to recreate the problem quite regular. We have some event 
> listeners, which themselves call the node.save or session.save method. I made 
> a breakpoint in NodeIndexer.createDoc() and stop when there is a specific 
> name in the fullpath property. I can see that two listeners we wrote ( 
> FieldReferenceListener and RulesListener) lead to the NodeIndexer.createDoc() 
> - below are the stacktraces (based on Jackrabbit 2.0-alpha10)
>  NodeIndexer.createDoc() line: 247 
>  SearchIndex.createDocument(NodeState, NamespaceMappings, IndexFormatVersion) 
> line: 1122 
>  SearchIndex.updateNodes(Iterator<NodeId>, Iterator<NodeState>) line: 635 
>  SearchManager.onEvent(EventIterator) line: 459 
>  EventConsumer.consumeEvents(EventStateCollection) line: 244 
>  ObservationDispatcher.dispatchEvents(EventStateCollection) line: 198 
>  EventStateCollection.dispatch() line: 455 
>  SharedItemStateManager$Update.end() line: 756 
>  SharedItemStateManager.update(ChangeLog, EventStateCollectionFactory) line: 
> 1102 
>  XAItemStateManager(LocalItemStateManager).update(ChangeLog) line: 351 
>  XAItemStateManager.update(ChangeLog) line: 354 
>  XAItemStateManager(LocalItemStateManager).update() line: 326 
>  SessionItemStateManager.update() line: 326 
>  NodeImpl(ItemImpl).save() line: 1098 
>  FieldReferenceListener.updateFullPath(Node) line: 193 
>  FieldReferenceListener.onEvent(EventIterator) line: 101 
>  EventConsumer.consumeEvents(EventStateCollection) line: 244 
>  ObservationDispatcher.dispatchEvents(EventStateCollection) line: 198 
>  EventStateCollection.dispatch() line: 455 
>  SharedItemStateManager$Update.end() line: 756 
>  SharedItemStateManager.update(ChangeLog, EventStateCollectionFactory) line: 
> 1102 
>  XAItemStateManager(LocalItemStateManager).update(ChangeLog) line: 351 
>  XAItemStateManager.update(ChangeLog) line: 354 
>  XAItemStateManager(LocalItemStateManager).update() line: 326 
>  SessionItemStateManager.update() line: 326 
>  NodeImpl(ItemImpl).save() line: 1098 
>  NodeIndexer.createDoc() line: 247 
>  SearchIndex.createDocument(NodeState, NamespaceMappings, IndexFormatVersion) 
> line: 1122 
>  SearchIndex.updateNodes(Iterator<NodeId>, Iterator<NodeState>) line: 635 
>  SearchManager.onEvent(EventIterator) line: 459 
>  EventConsumer.consumeEvents(EventStateCollection) line: 244 
>  ObservationDispatcher.dispatchEvents(EventStateCollection) line: 198 
>  EventStateCollection.dispatch() line: 455 
>  SharedItemStateManager$Update.end() line: 756 
>  SharedItemStateManager.update(ChangeLog, EventStateCollectionFactory) line: 
> 1102 
>  XAItemStateManager(LocalItemStateManager).update(ChangeLog) line: 351 
>  XAItemStateManager.update(ChangeLog) line: 354 
>  XAItemStateManager(LocalItemStateManager).update() line: 326 
>  SessionItemStateManager.update() line: 326 
>  NodeImpl(ItemImpl).save() line: 1098 
>  XASessionImpl(SessionImpl).save() line: 928 
>  RulesListener.onEvent(EventIterator) line: 376 
>  EventConsumer.consumeEvents(EventStateCollection) line: 244 
>  ObservationDispatcher.dispatchEvents(EventStateCollection) line: 198 
>  EventStateCollection.dispatch() line: 455 
>  SharedItemStateManager$Update.end() line: 756 
>  SharedItemStateManager.update(ChangeLog, EventStateCollectionFactory) line: 
> 1102 
>  XAItemStateManager(LocalItemStateManager).update(ChangeLog) line: 351 
>  XAItemStateManager.update(ChangeLog) line: 354 
>  XAItemStateManager(LocalItemStateManager).update() line: 326 
>  SessionItemStateManager.update() line: 326 
>  NodeImpl(ItemImpl).save() line: 1098 
> Now when continuing to debug after the second NodeIndexer.createDoc() I see 
> that the node with the watched UUID is also passed within the remove 
> collection into  SearchIndex.updateNodes(Iterator<NodeId>, 
> Iterator<NodeState>) , but when looking at the index with Luke before and 
> after finishing this SearchIndex.updateNodes, I see that the first document 
> with the UUID was NOT deleted and then we always have two documents with the 
> same UUID.
> Now it would be interesting, why the deletion failed. When debugging 
> DeleteNode.exceute and stopping at the watched UUID, I come down the 
> following methods:
> CommittableIndexReader(IndexReader).deleteDocuments(Term) line: 873   
> PersistentIndex(AbstractIndex).removeDocument(Term) line: 225 
> PersistentIndex.removeDocument(Term) line: 90 
> MultiIndex$DeleteNode.execute(MultiIndex) line: 1951  
> MultiIndex.executeAndLog(MultiIndex$Action) line: 1084        
> MultiIndex.update(Collection<NodeId>, Collection<Document>) line: 442 
> SearchIndex.updateNodes(Iterator<NodeId>, Iterator<NodeState>) line: 645      
> What I can see in IndexReader.deleteDocuments(Term) is that docs.next() 
> returns true, but docs.doc() then returns 0 as the doc-id, which I think is 
> the cause that the right doc-id is not deleted. 
> Any clues what goes wrong here or hints what else I could watch for on 
> debugging ?

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