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