Stefan Egli created OAK-11806:
---------------------------------

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


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