Skip to content

Locking contention on com.cognitect.transit.impl.Cache #38

@wilkerlucio

Description

@wilkerlucio

Hello,

During a performance tuning task, we notice a high locking time on com.cognitect.transit.impl.Cache during service startup.

cleanshot_2024-06-26_at_09 56 52_2x

I tracked it down to this code snippet:

synchronized (handlerCache) {
writeHandlerMap = handlerCache.get(customHandlers);
if (writeHandlerMap == null) {
writeHandlerMap = new WriteHandlerMap(customHandlers);
handlerCache.put(customHandlers, writeHandlerMap);
}
}

Without changing the library itself, I wrapped our write handlers here with a WriteHandlerMap class to avoid that block, getting into this code path instead:

if (customHandlers instanceof WriteHandlerMap)
return new WriteHandlerMap(customHandlers);

Doing so significantly improved our locking times; in comparable scenarios, it dropped from 53 minutes of locking time on com.cognitect.transit.impl.Cache to 1 minute and 30 seconds.

I think if we can improve this locking block, maybe replacing it with a ConcurrentHashMap or something else that avoids global locking, we may be able to improve transit performance in high concurrency scenarios.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions