jackrabbit-oak-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tomek Rękawek (JIRA) <j...@apache.org>
Subject [jira] [Commented] (OAK-2761) Persistent cache: add data in a different thread
Date Mon, 01 Feb 2016 13:36:39 GMT

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

Tomek Rękawek commented on OAK-2761:
------------------------------------

The linked patch contains a draft of the solution:

https://github.com/trekawek/jackrabbit-oak/pull/5
https://github.com/trekawek/jackrabbit-oak/pull/5.diff

It uses two queues (as we have two maps in the {{NodeDocumentCache}}). The queue contains
atomic cache operation, like {{put}}, {{putIfAbsent}}, {{putIfNewer}}, {{replace}}, {{invalidate}}
or {{invalidateAll}}.

In order to avoid situation in which someone puts a document into cache and then gets the
older version (because the put operation is still in the queue), the {{get()}} method returns
{{null}} for all keys waiting to be processed.

If the queue is full, it'll be cleared. All documents which should have been affected by the
queue operations are invalidated to avoid outdated read as above.

Patch fails on some unit tests, I'll work on fixing these.

> Persistent cache: add data in a different thread
> ------------------------------------------------
>
>                 Key: OAK-2761
>                 URL: https://issues.apache.org/jira/browse/OAK-2761
>             Project: Jackrabbit Oak
>          Issue Type: Bug
>          Components: cache, core, mongomk
>            Reporter: Thomas Mueller
>            Assignee: Thomas Mueller
>              Labels: resilience
>             Fix For: 1.4, 1.3.15
>
>
> The persistent cache usually stores data in a background thread, but sometimes (if a
lot of data is added quickly) the foreground thread is blocked.
> Even worse, switching the cache file can happen in a foreground thread, with the following
stack trace.
> {noformat}
> "127.0.0.1 [1428931262206] POST /bin/replicate.json HTTP/1.1" prio=5 tid=0x00007fe5df819800
nid=0x9907 runnable [0x0000000113fc4000]
>    java.lang.Thread.State: RUNNABLE
>         ...
> 	at org.h2.mvstore.MVStoreTool.compact(MVStoreTool.java:404)
> 	at org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache$1.closeStore(PersistentCache.java:213)
> 	- locked <0x0000000782483050> (a org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache$1)
> 	at org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache.switchGenerationIfNeeded(PersistentCache.java:350)
> 	- locked <0x0000000782455710> (a org.apache.jackrabbit.oak.plugins.document.persistentCache.PersistentCache)
> 	at org.apache.jackrabbit.oak.plugins.document.persistentCache.NodeCache.write(NodeCache.java:85)
> 	at org.apache.jackrabbit.oak.plugins.document.persistentCache.NodeCache.put(NodeCache.java:130)
> 	at org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore.applyChanges(DocumentNodeStore.java:1060)
> 	at org.apache.jackrabbit.oak.plugins.document.Commit.applyToCache(Commit.java:599)
> 	at org.apache.jackrabbit.oak.plugins.document.CommitQueue.afterTrunkCommit(CommitQueue.java:127)
> 	- locked <0x0000000781890788> (a org.apache.jackrabbit.oak.plugins.document.CommitQueue)
> 	at org.apache.jackrabbit.oak.plugins.document.CommitQueue.done(CommitQueue.java:83)
> 	at org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore.done(DocumentNodeStore.java:637)
> {noformat}
> To avoid blocking the foreground thread, one solution is to store all data in a separate
thread. If there is too much data added, then some of the data is not stored. If possible,
the data that was not referenced a lot, and / or old revisions of documents (if new revisions
are available).



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

Mime
View raw message