This is an automated email from the ASF dual-hosted git repository.
baedke pushed a commit to branch OAK-11845-2
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git
The following commit(s) were added to refs/heads/OAK-11845-2 by this push:
new e84e04dd9d OAK-11845: Avoid race conditions in
SecureNodeBuilder#getTreePermissions()
e84e04dd9d is described below
commit e84e04dd9ddff79673ae3f200ab5739c8d780b2e
Author: Manfred Baedke <[email protected]>
AuthorDate: Thu Aug 7 17:10:34 2025 +0200
OAK-11845: Avoid race conditions in SecureNodeBuilder#getTreePermissions()
Done.
---
.../jackrabbit/oak/core/SecureNodeBuilder.java | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 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..3a9d1c9161 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
@@ -88,6 +88,8 @@ class SecureNodeBuilder implements NodeBuilder {
*/
private TreePermission rootPermission = null; // initialized lazily
+ private volatile boolean reevaluatePermissions = true;
+
/**
* Create the {@code SecureNodeBuilder} for the root node.
*
@@ -156,10 +158,9 @@ class SecureNodeBuilder implements NodeBuilder {
return builder.isReplaced(name) && !isNew(name);
}
- public synchronized void baseChanged() {
+ public void baseChanged() {
Validate.checkState(parent == null);
- treePermission = null; // trigger re-evaluation
- rootPermission = null;
+ reevaluatePermissions = true;
}
@Override
@@ -349,9 +350,8 @@ class SecureNodeBuilder implements NodeBuilder {
* @return The permissions for this tree.
*/
@NotNull
- private synchronized TreePermission getTreePermission() {
- if (treePermission == null
- || rootPermission != rootBuilder.treePermission) {
+ private TreePermission getTreePermission() {
+ if (isPermissionEvaluationNeeded()) {
NodeState base = builder.getBaseState();
String msg = "see OAK-11790 and OAK-11843";
if (parent == null) {
@@ -364,10 +364,18 @@ class SecureNodeBuilder implements NodeBuilder {
treePermission =
Objects.requireNonNull(parentTreePermission.getChildPermission(name, base),
msg);
rootPermission = parent.rootPermission;
}
+ reevaluatePermissions = false;
}
return treePermission;
}
+ private boolean isPermissionEvaluationNeeded() {
+ if (rootPermission != rootBuilder.treePermission) {
+ reevaluatePermissions = true;
+ }
+ return reevaluatePermissions;
+ }
+
private static boolean isType(@Nullable PropertyState property, Type<?>
type) {
Type<?> t = (property == null) ? null : property.getType();
return t == type;