[
https://issues.apache.org/jira/browse/JCR-3290?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13250949#comment-13250949
]
Unico Hommes commented on JCR-3290:
-----------------------------------
Replaced the patch with the proposed fix with a slightly improved one that
doesn't change the semantics of the MergerContext#added method
> Concurrent add and move can cause inconsistency
> -----------------------------------------------
>
> Key: JCR-3290
> URL: https://issues.apache.org/jira/browse/JCR-3290
> Project: Jackrabbit Content Repository
> Issue Type: Bug
> Affects Versions: 2.2.11, 2.4
> Reporter: Unico Hommes
> Priority: Critical
> Fix For: 2.2.12, 2.4.2
>
> Attachments: AddMoveTest.patch, SISMMerger.patch
>
>
> The scenario is as follows:
> We start out with the following repository structure:
> /folder1/node1
> /folder2
> Session s1 modifies /folder1 (for instance set a property or add a node, it
> doesn't matter, as long as it creates a transient item state for /folder1)
> Session s2 moves /folder1/node1 to /folder2/node1
> Session s2 does a save
> Session s1 modifies /folder2/node1 (for instance set a property or add a
> node, it doesn't matter, as long as it creates a transient item state for
> node2)
> Session s1 does a save
> The repository is now inconsistent: /folder1 has a child node entry for node1
> whereas node1 has parent id for /folder2
> The problem is in the NodeStateMerger.merge method. When on s1.save a merge
> is attempted on the child node entries of /folder1 the transient state has a
> child node entry for node1 (which was actually moved to /folder2). This
> expected. The merger decides to add this node if one of two conditions is
> true: the child node entry is either in the added set of the change log or it
> is in the modified set of the change log (the latter because the child node
> will be in the modified set if it was moved to this node). The latter
> condition is the problem. Because node1 was modified it is indeed in the
> modified set and thus added.
> However it has a different parent id (the parent id of the folder it was
> moved to). That means that /folder1 is saved with a child node entry for
> node1.
> Attached is a test case that shows that the above scenario leads to an
> inconsistency.
> Also attached is a proposal for a fix. The fix checks whether the child node
> entry to be added actually has the state that is currently being merged as
> its parent and only adds it when it does.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira