Joerg Hoh created OAK-12290:
-------------------------------

             Summary: Lock Contention in SegmentCache
                 Key: OAK-12290
                 URL: https://issues.apache.org/jira/browse/OAK-12290
             Project: Jackrabbit Oak
          Issue Type: Improvement
          Components: segment-tar
    Affects Versions: 2.2.0
            Reporter: Joerg Hoh


I investigated a performance bottleneck on an environment running with Oak 
2.2.0, and I have come across a series of instances where freshly introduced 
CaffeineCache is involved.

I see a massive series of calls like this:

{noformat}
   java.lang.Thread.State: RUNNABLE
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.afterRead(BoundedLocalCache.java:1286)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.getIfPresent(BoundedLocalCache.java:2206)
        at 
com.github.benmanes.caffeine.cache.LocalManualCache.getIfPresent(LocalManualCache.java:56)
        at 
org.apache.jackrabbit.oak.cache.impl.caffeine.CaffeineCacheAdapter.getIfPresent(CaffeineCacheAdapter.java:43)
        at 
org.apache.jackrabbit.oak.segment.SegmentCache$NonEmptyCache.recordHit(SegmentCache.java:247)
        at 
org.apache.jackrabbit.oak.segment.file.AbstractFileStore$2$$Lambda/0x0000000800caa900.accept(Unknown
 Source)
        at 
org.apache.jackrabbit.oak.segment.SegmentId.getSegment(SegmentId.java:164)
        at org.apache.jackrabbit.oak.segment.Record.getSegment(Record.java:71)
        at 
org.apache.jackrabbit.oak.segment.MapRecord.getEntry(MapRecord.java:182)
        at 
org.apache.jackrabbit.oak.segment.SegmentNodeState.getChildNode(SegmentNodeState.java:450)
        at 
org.apache.jackrabbit.oak.plugins.memory.MemoryNodeBuilder.<init>(MemoryNodeBuilder.java:141)
{noformat}

and

{noformat}
   java.lang.Thread.State: RUNNABLE
        at com.github.benmanes.caffeine.cache.Node.inWindow(Node.java:162)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.onAccess(BoundedLocalCache.java:1782)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache$$Lambda/0x0000000800a4c290.accept(Unknown
 Source)
        at 
com.github.benmanes.caffeine.cache.BoundedBuffer$RingBuffer.drainTo(BoundedBuffer.java:101)
        at 
com.github.benmanes.caffeine.cache.StripedBuffer.drainTo(StripedBuffer.java:228)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.drainReadBuffer(BoundedLocalCache.java:1769)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.maintenance(BoundedLocalCache.java:1711)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.performCleanUp(BoundedLocalCache.java:1660)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache$PerformCleanupTask.run(BoundedLocalCache.java:3886)
        at 
org.apache.jackrabbit.oak.cache.api.CacheBuilder$$Lambda/0x0000000800a115c8.execute(Unknown
 Source)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.scheduleDrainBuffers(BoundedLocalCache.java:1633)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.afterRead(BoundedLocalCache.java:1288)
        at 
com.github.benmanes.caffeine.cache.BoundedLocalCache.getIfPresent(BoundedLocalCache.java:2206)
        at 
com.github.benmanes.caffeine.cache.LocalManualCache.getIfPresent(LocalManualCache.java:56)
        at 
org.apache.jackrabbit.oak.cache.impl.caffeine.CaffeineCacheAdapter.getIfPresent(CaffeineCacheAdapter.java:43)
        at 
org.apache.jackrabbit.oak.segment.SegmentCache$NonEmptyCache.recordHit(SegmentCache.java:247)
        at 
org.apache.jackrabbit.oak.segment.file.AbstractFileStore$2$$Lambda/0x0000000800caa900.accept(Unknown
 Source)
        at 
org.apache.jackrabbit.oak.segment.SegmentId.getSegment(SegmentId.java:164)
        at org.apache.jackrabbit.oak.segment.Record.getSegment(Record.java:71)
{noformat}

{noformat:title=SegmentCache.java}
        @Override
        public void recordHit(@NotNull SegmentId id) {
            stats.hitCount.incrementAndGet();
            if (id.isDataSegmentId() && 
FT_OAK_12214_PROPAGATE_L1_HITS_TO_L2_ENABLED.get()) {
                cache.getIfPresent(id);
            }
        }
{noformat}

I think that the FT {{FT_OAK_12214_PROPAGATE_L1_HITS_TO_L2_ENABLED}} is 
responsible for that, and it creates unnecessary latency (see OAK-12214); while 
I think that the idea is good, there should be a different way to increment the 
counter.






--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to