Hi Alex,

I think you are right, there's an issue with the chaining of the
VisibleValidators. I'm still looking into it but the short answer is
this is directly related to the hierarchy level (so if a change is 5
levels deep, you'll see 5 validators chained there) and the short fix
is to fix calls creating new VisibleValidators [0] to unwrap if
needed, like here [1].

Could you open an issue and I'll post my findings there.

best,
alex


[0] 
https://github.com/apache/jackrabbit-oak/blob/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/VisibleValidator.java#L44
[1] 
https://github.com/apache/jackrabbit-oak/blob/trunk/oak-store-spi/src/main/java/org/apache/jackrabbit/oak/spi/commit/VisibleEditor.java#L38


On Sat, Jul 15, 2017 at 1:12 AM, Alexander Klimetschek
<aklim...@adobe.com.invalid> wrote:
> Hi,
>
> I came across the stacktrace below [2] in oak 1.4.15. The access denied is 
> not the problem, what I was wondering instead: why is VisibleValidator 
> chained 9 times?
>
> Code is at [1].
>
> This means NodeStateUtils.isHidden(name) is called 9 times instead of once, 
> which should be enough (it's always the same state looked at).
>
> While searching jira I found another stacktrace at [2] with 12 instances in 
> the chain.
>
> This might be a small optimization to make, especially if there are many 
> properties added, and if there is apparently another variable factor in how 
> many instances there are. I don't know where these are chained together.
>
> Cheers,
> Alex
>
> [1] 
> https://github.com/apache/jackrabbit-oak/blob/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/commit/VisibleValidator.java#L83
> [2] https://issues.apache.org/jira/browse/OAK-6358
> [3] Caused by: org.apache.jackrabbit.oak.api.CommitFailedException: 
> OakAccess0000: Access denied
>         at 
> org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.checkPermissions(PermissionValidator.java:242)
>         at 
> org.apache.jackrabbit.oak.security.authorization.permission.PermissionValidator.propertyAdded(PermissionValidator.java:112)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.VisibleValidator.propertyAdded(VisibleValidator.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.CompositeEditor.propertyAdded(CompositeEditor.java:83)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.propertyAdded(EditorDiff.java:82)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareProperties(SegmentNodeState.java:593)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:491)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:531)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compareBranch(MapRecord.java:561)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:466)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compareBranch(MapRecord.java:561)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:466)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord$2.childNodeChanged(MapRecord.java:399)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord$3.childNodeChanged(MapRecord.java:440)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:483)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:432)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:390)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:414)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.MapRecord.compare(MapRecord.java:414)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:584)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorDiff.process(EditorDiff.java:52)
>         at 
> org.apache.jackrabbit.oak.spi.commit.EditorHook.processCommit(EditorHook.java:54)
>         at 
> org.apache.jackrabbit.oak.spi.commit.CompositeHook.processCommit(CompositeHook.java:61)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore$Commit.prepare(SegmentNodeStore.java:502)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore$Commit.optimisticMerge(SegmentNodeStore.java:525)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore$Commit.execute(SegmentNodeStore.java:581)
>         at 
> org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore.merge(SegmentNodeStore.java:238)
>         at 
> org.apache.jackrabbit.oak.spi.state.ProxyNodeStore.merge(ProxyNodeStore.java:43)
>         at 
> org.apache.jackrabbit.oak.core.MutableRoot.commit(MutableRoot.java:247)
>         at 
> org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.commit(SessionDelegate.java:347)
>         at 
> org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.save(SessionDelegate.java:494)
>         ... 126 common frames omitted
>

Reply via email to