[ 
https://issues.apache.org/jira/browse/OAK-11806?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18005119#comment-18005119
 ] 

Stefan Egli commented on OAK-11806:
-----------------------------------

Created [a suggestion for a 
fix|https://github.com/apache/jackrabbit-oak/blob/a30a80eec33fb42fd9466f66349e1b09765d198b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/bundlor/BundlorUtils.java#L63-L66]
 in [draft-PR#2391|https://github.com/apache/jackrabbit-oak/pull/2391]

> bundled child can mix up properties with similarly named sibling
> ----------------------------------------------------------------
>
>                 Key: OAK-11806
>                 URL: https://issues.apache.org/jira/browse/OAK-11806
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: documentmk
>            Reporter: Stefan Egli
>            Priority: Major
>
> In DocumentNodeStore, consider a bundled document that has a structure like 
> so:
> {noformat}
>  'child/:doc-self-path': { 'r123456789a-0-1': '"child"' },
>  'child/jcr:primaryType': { 'r123456789a-0-1': '"nam:nt:unstructured"' },
>  'child/propertyA': { 'r123456789a-0-1': '"child-value"' },
> ..
>  'child2/:doc-self-path': { 'r12345678b1-0-2': '"child2"' },
>  'child2/jcr:primaryType': { 'r12345678b1-0-2': '"nam:nt:unstructured"' },
>  'child2/propertyA': { 'r12345678b1-0-2': '"child2-value"' },
> ..
>  'child11/:doc-self-path': { 'r12345678c3-0-3': '"child11"' },
>  'child11/jcr:primaryType': { 'r12345678c3-0-3': '"nam:nt:unstructured"' },
>  'child11/propertyA': { 'r12345678c3-0-3': '"child11-value"' },
> ..
> {noformat}
> In such a bundling case resolving the document into NodeStates (eg via 
> {{getChildNodeEntries}} or anything similar for that matter) goes via 
> * 
> [bundlingContext.getProperties()|https://github.com/apache/jackrabbit-oak/blob/9ef53aabcf54d5d6a3879f1d88b3f05d61875b9f/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java#L130]
>  
> * which then [calls 
> BundlorUtils.getMatchingProperties()|https://github.com/apache/jackrabbit-oak/blob/9ef53aabcf54d5d6a3879f1d88b3f05d61875b9f/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeState.java#L802].
>  
> * In BundlorUtils, it goes through all properties existing on the bundled 
> documents (that is : all bundled properties of all bundled children) - in 
> more or less undefined order.
> ** as part of that it check if a given property [starts 
> with|https://github.com/apache/jackrabbit-oak/blob/7b252c2702cb0b9494e0dc3e23c00b5e1313fed2/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/bundlor/BundlorUtils.java#L55]
>  the {{matchedPath}}. 
> ** that matchedPath in case of doing this for "child" is .. "child".
> ** so if it resolves "child" it will match any property that starts with ... 
> "child"
> ** which will unfortunately also include properties from "child2" or 
> "child11" etc.
> ** the result is that it will more or less randomly contain properties of 
> siblings that start with the same name
> In other words: resolving properties of bundled child A "randomly" includes 
> properties of siblings that also start with A.
> The "randomness" is given by the fact that HashMap (which is what is passed 
> to getMatchingProperties) does not guarantee a stable iteration order. In 
> particular two JVM incarnations iterating over the same Map might likely not 
> see the same order. This leads to the mixed-up properties being seemingly 
> random - as it depends on the order in which the map is iterated over.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to