You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-issues@jackrabbit.apache.org by "Marcel Reutegger (JIRA)" <ji...@apache.org> on 2016/05/11 14:47:12 UTC

[jira] [Commented] (OAK-4361) Reduce performance impact of observation ACFilter

    [ https://issues.apache.org/jira/browse/OAK-4361?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15280250#comment-15280250 ] 

Marcel Reutegger commented on OAK-4361:
---------------------------------------

Added more parameters to {{ConcurrentCreateNodesTest}} to tweak the test behaviour.

Using listeners from admin sessions is fast (but not realistic). The number of listeners is set to 50 and the everyone principal has 100 access control entries in the permission store.

{noformat}
> java -Xmx1g -DworkerCount=1 -DlistenerCount=50 -DlistenerPath=/nothing-here -DaclCount=100 -jar target/oak-run-1.6-SNAPSHOT.jar benchmark ConcurrentCreateNodesTest Oak-Tar
Apache Jackrabbit Oak 1.6-SNAPSHOT
# ConcurrentCreateNodesTest        C     min     10%     50%     90%     max       N
Oak-Tar                            1      23      25      30      39      51    1931
{noformat}

The same test with a non-admin session:

{noformat}
> java -Xmx1g -DnonAdminListener=true -DworkerCount=1 -DlistenerCount=50 -DlistenerPath=/nothing-here -DaclCount=100 -jar target/oak-run-1.6-SNAPSHOT.jar benchmark ConcurrentCreateNodesTest Oak-Tar
Apache Jackrabbit Oak 1.6-SNAPSHOT
# ConcurrentCreateNodesTest        C     min     10%     50%     90%     max       N
Oak-Tar                            1      81     182     208     252     437     277
{noformat}

There is a significant drop in writes per second, from roughly 2000 to 200 on my machine. The CPU is mostly busy with initialising the ACFilter for change processing:

{noformat}
"oak-executor-0" #18 daemon prio=1 os_prio=31 tid=0x00007fb768640800 nid=0x6703 runnable [0x0000000124c28000]
   java.lang.Thread.State: RUNNABLE
	at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.getRecordIdV11(SegmentNodeState.java:168)
	at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.getProperty(SegmentNodeState.java:140)
	at org.apache.jackrabbit.oak.spi.state.ReadOnlyBuilder.getProperty(ReadOnlyBuilder.java:137)
	at org.apache.jackrabbit.oak.plugins.tree.impl.AbstractTree.getProperty(AbstractTree.java:249)
	at org.apache.jackrabbit.oak.util.TreeUtil.getBoolean(TreeUtil.java:129)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionStoreImpl.createPermissionEntry(PermissionStoreImpl.java:182)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionStoreImpl.loadPermissionEntries(PermissionStoreImpl.java:154)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionStoreImpl.load(PermissionStoreImpl.java:115)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryCache.getEntries(PermissionEntryCache.java:48)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryCache.load(PermissionEntryCache.java:63)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryProviderImpl.init(PermissionEntryProviderImpl.java:109)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionEntryProviderImpl.<init>(PermissionEntryProviderImpl.java:72)
	at org.apache.jackrabbit.oak.security.authorization.permission.CompiledPermissionImpl.<init>(CompiledPermissionImpl.java:112)
	at org.apache.jackrabbit.oak.security.authorization.permission.CompiledPermissionImpl.create(CompiledPermissionImpl.java:126)
	at org.apache.jackrabbit.oak.security.authorization.permission.PermissionProviderImpl.<init>(PermissionProviderImpl.java:71)
	at org.apache.jackrabbit.oak.security.authorization.AuthorizationConfigurationImpl.getPermissionProvider(AuthorizationConfigurationImpl.java:185)
	at org.apache.jackrabbit.oak.security.authorization.composite.CompositeAuthorizationConfiguration.getPermissionProvider(CompositeAuthorizationConfiguration.java:135)
	at org.apache.jackrabbit.oak.jcr.observation.ObservationManagerImpl$1.create(ObservationManagerImpl.java:122)
	at org.apache.jackrabbit.oak.plugins.observation.filter.FilterBuilder$ACCondition.createFilter(FilterBuilder.java:457)
	at org.apache.jackrabbit.oak.plugins.observation.filter.FilterBuilder$AllCondition.createFilter(FilterBuilder.java:590)
	at org.apache.jackrabbit.oak.plugins.observation.filter.FilterBuilder$1.getFilter(FilterBuilder.java:386)
	at org.apache.jackrabbit.oak.jcr.observation.ChangeProcessor.contentChanged(ChangeProcessor.java:310)
	at org.apache.jackrabbit.oak.spi.commit.BackgroundObserver$1$1.call(BackgroundObserver.java:131)
	at org.apache.jackrabbit.oak.spi.commit.BackgroundObserver$1$1.call(BackgroundObserver.java:125)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
{noformat}

> Reduce performance impact of observation ACFilter
> -------------------------------------------------
>
>                 Key: OAK-4361
>                 URL: https://issues.apache.org/jira/browse/OAK-4361
>             Project: Jackrabbit Oak
>          Issue Type: Improvement
>          Components: core, security
>            Reporter: Marcel Reutegger
>            Assignee: Marcel Reutegger
>             Fix For: 1.6
>
>
> Observation events are filtered with {{ACFilter}} to enforce access controls. The performance impact of this filter is rather significant for a moderate number of listeners and access control entries, even when changes are done in a subtree the listener is not registered for.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)