This is an automated email from the ASF dual-hosted git repository.

reschke pushed a commit to branch OAK-11845-chatty
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 7534ce22fd055d67fc2f442534768df99e488a0e
Author: Julian Reschke <[email protected]>
AuthorDate: Thu Aug 7 16:20:33 2025 +0100

    OAK-11845-chatty
---
 .../jackrabbit/oak/core/SecureNodeBuilder.java     | 23 +++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
index 1490b11460..1f5cee1f59 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeBuilder.java
@@ -156,7 +156,12 @@ class SecureNodeBuilder implements NodeBuilder {
         return builder.isReplaced(name) && !isNew(name);
     }
 
-    public synchronized void baseChanged() {
+    public void baseChanged() {
+        if (threadOfGetTreePermission != null && Thread.currentThread() != 
threadOfGetTreePermission) {
+            throw new RuntimeException("baseChanged() called from thread " +
+                    Thread.currentThread() + " while getTreePermission is 
executed by " +
+                    threadOfGetTreePermission);
+        }
         Validate.checkState(parent == null);
         treePermission = null; // trigger re-evaluation
         rootPermission = null;
@@ -343,13 +348,25 @@ class SecureNodeBuilder implements NodeBuilder {
         return builder.createBlob(stream);
     }
 
+    private volatile Thread threadOfGetTreePermission = null;
+
+    @NotNull
+    private TreePermission getTreePermission() {
+        threadOfGetTreePermission = Thread.currentThread();
+        try {
+            return internalGetTreePermission();
+        } finally {
+            threadOfGetTreePermission = null;
+        }
+    }
+
     /**
      * Permissions of this tree.
      *
      * @return The permissions for this tree.
      */
     @NotNull
-    private synchronized TreePermission getTreePermission() {
+    private TreePermission internalGetTreePermission() {
         if (treePermission == null
                 || rootPermission != rootBuilder.treePermission) {
             NodeState base = builder.getBaseState();
@@ -360,7 +377,7 @@ class SecureNodeBuilder implements NodeBuilder {
                 treePermission = 
requireNonNull(provider.getTreePermission(baseTree, TreePermission.EMPTY), msg);
                 rootPermission = treePermission;
             } else {
-                TreePermission parentTreePermission = 
Objects.requireNonNull(parent.getTreePermission(), msg);
+                TreePermission parentTreePermission = 
Objects.requireNonNull(parent.internalGetTreePermission(), msg);
                 treePermission = 
Objects.requireNonNull(parentTreePermission.getChildPermission(name, base), 
msg);
                 rootPermission = parent.rootPermission;
             }

Reply via email to