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 "angela (JIRA)" <ji...@apache.org> on 2015/11/11 11:31:11 UTC
[jira] [Created] (OAK-3616) Reconsider Synchronization with
ContentSessionImpl.checkLive
angela created OAK-3616:
---------------------------
Summary: Reconsider Synchronization with ContentSessionImpl.checkLive
Key: OAK-3616
URL: https://issues.apache.org/jira/browse/OAK-3616
Project: Jackrabbit Oak
Issue Type: Improvement
Components: core
Reporter: angela
Priority: Minor
while running permission related benchmarks directly on Oak (without the extra oak-jcr layer), i found a considerable difference between
- concurrent read with a single content session
- concurrent read with different content sessions
according to the built-in profiler information the former seemed to be limited by the synchronized {{ContentSessionImpl.checkLive}} call:
{code}
# CugOakTest C min 10% 50% 90% max N
Import deep tree: 8432
All paths: 123545
Oak-Tar 1 15 18 22 25 31 229
Oak-Tar 2 19 25 29 33 38 344
Oak-Tar 4 26 33 39 45 51 513
Oak-Tar 8 70 86 94 102 110 431
Oak-Tar 10 65 105 119 131 143 427
Oak-Tar 15 92 152 169 186 210 449
Oak-Tar 20 148 212 229 250 265 440
Oak-Tar 50 283 485 549 602 666 480
Profiler: top 20 stack trace(s) of 50647 ms:
15517/45026 (34%):
at org.apache.jackrabbit.oak.core.ContentSessionImpl.checkLive(ContentSessionImpl.java:85)
at org.apache.jackrabbit.oak.core.MutableRoot.checkLive(MutableRoot.java:172)
at org.apache.jackrabbit.oak.core.MutableTree.beforeRead(MutableTree.java:333)
at org.apache.jackrabbit.oak.core.MutableTree.hasProperty(MutableTree.java:133)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation$NodeLocation.getChild(TreeLocation.java:166)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation.create(TreeLocation.java:62)
at org.apache.jackrabbit.oak.benchmark.CugOakTest.runTest(CugOakTest.java:95)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:347)
at org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest.execute(ReadDeepTreeTest.java:35)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:356)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.access$000(AbstractTest.java:45)
at org.apache.jackrabbit.oak.benchmark.AbstractTest$Executor.run(AbstractTest.java:277)
12279/45026 (27%):
at org.apache.jackrabbit.oak.core.ContentSessionImpl.checkLive(ContentSessionImpl.java:85)
at org.apache.jackrabbit.oak.core.MutableRoot.checkLive(MutableRoot.java:172)
at org.apache.jackrabbit.oak.core.MutableTree.beforeRead(MutableTree.java:333)
at org.apache.jackrabbit.oak.core.MutableTree.getChild(MutableTree.java:160)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation$NodeLocation.getChild(TreeLocation.java:169)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation.create(TreeLocation.java:62)
at org.apache.jackrabbit.oak.benchmark.CugOakTest.runTest(CugOakTest.java:95)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:347)
at org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest.execute(ReadDeepTreeTest.java:35)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:356)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.access$000(AbstractTest.java:45)
at org.apache.jackrabbit.oak.benchmark.AbstractTest$Executor.run(AbstractTest.java:277)
3119/45026 (6%):
at org.apache.jackrabbit.oak.core.ContentSessionImpl.checkLive(ContentSessionImpl.java:85)
at org.apache.jackrabbit.oak.core.MutableRoot.checkLive(MutableRoot.java:172)
at org.apache.jackrabbit.oak.core.MutableTree.beforeRead(MutableTree.java:333)
at org.apache.jackrabbit.oak.core.MutableTree.hasProperty(MutableTree.java:133)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation$PropertyLocation.exists(TreeLocation.java:222)
at org.apache.jackrabbit.oak.benchmark.CugOakTest.runTest(CugOakTest.java:96)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:347)
at org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest.execute(ReadDeepTreeTest.java:35)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:356)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.access$000(AbstractTest.java:45)
at org.apache.jackrabbit.oak.benchmark.AbstractTest$Executor.run(AbstractTest.java:277)
1694/45026 (3%):
at org.apache.jackrabbit.oak.core.ContentSessionImpl.checkLive(ContentSessionImpl.java:85)
at org.apache.jackrabbit.oak.core.MutableRoot.checkLive(MutableRoot.java:172)
at org.apache.jackrabbit.oak.core.MutableRoot.getTree(MutableRoot.java:216)
at org.apache.jackrabbit.oak.core.MutableRoot.getTree(MutableRoot.java:66)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation.create(TreeLocation.java:60)
at org.apache.jackrabbit.oak.benchmark.CugOakTest.runTest(CugOakTest.java:95)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:347)
at org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest.execute(ReadDeepTreeTest.java:35)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:356)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.access$000(AbstractTest.java:45)
at org.apache.jackrabbit.oak.benchmark.AbstractTest$Executor.run(AbstractTest.java:277)
1356/45026 (3%):
at org.apache.jackrabbit.oak.core.ContentSessionImpl.checkLive(ContentSessionImpl.java:85)
at org.apache.jackrabbit.oak.core.MutableRoot.checkLive(MutableRoot.java:172)
at org.apache.jackrabbit.oak.core.MutableTree.beforeRead(MutableTree.java:333)
at org.apache.jackrabbit.oak.core.MutableTree.getProperty(MutableTree.java:127)
at org.apache.jackrabbit.oak.plugins.tree.TreeLocation$PropertyLocation.getProperty(TreeLocation.java:233)
at org.apache.jackrabbit.oak.benchmark.CugOakTest.runTest(CugOakTest.java:97)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:347)
at org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest.execute(ReadDeepTreeTest.java:35)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.execute(AbstractTest.java:356)
at org.apache.jackrabbit.oak.benchmark.AbstractTest.access$000(AbstractTest.java:45)
at org.apache.jackrabbit.oak.benchmark.AbstractTest$Executor.run(AbstractTest.java:277)
summary:
79%: org.apache.jackrabbit.oak.core
8%: org.apache.jackrabbit.oak.plugins.segment
5%: org.apache.jackrabbit.oak.plugins.memory
{code}
after discussing this with [~mduerig], i tmp made the {{live}} field {{volatile}} and removed the synchronization. as a result the concurrent random read with a single session seemed to be improved (in fact showing more or less the identical figures than when executing the test with concurrent reads of different sessions:
{code}
# CugOakTest , C, min, 10%, 50%, 90%, max, N
Oak-Tar , 1, 11, 17, 21, 26, 30, 234
Oak-Tar , 2, 17, 25, 29, 34, 37, 345
Oak-Tar , 4, 34, 39, 43, 47, 51, 465
Oak-Tar , 8, 28, 37, 47, 65, 96, 813
Oak-Tar , 10, 29, 41, 55, 76, 135, 873
Oak-Tar , 15, 27, 48, 80, 127, 220, 894
Oak-Tar , 20, 26, 54, 103, 178, 337, 910
Oak-Tar , 50, 26, 82, 230, 444, 1237, 953
summary:
35%: org.apache.jackrabbit.oak.plugins.segment
13%: org.apache.jackrabbit.oak.plugins.memory
12%: org.apache.jackrabbit.oak.security.authorization.permission
{code}
Should be consider removing the synchronized statement? I am not sure how important concurrent reads with the same content sessions are, but nevertheless i was a bit surprised by the numbers.
[~mduerig], what do you think?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)