[
http://jira.magnolia-cms.com/browse/MAGNOLIA-3167?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jan Haderka updated MAGNOLIA-3167:
----------------------------------
Attachment: cacheBlock.png
cacheBlockOnflush.png
Two most common scenarios (i could think of) under which cache can block. The
first one (multiple requests) is solved by synchronizing on whole cache, tho
the price for that is probably too high.
The second scenario is AFAIK currently not taken care of since flush policy
doesn't synchronize on cache so the lock can be introduced by {{flushAll}} or
{{flushByUuid}} calls. And more dangerously since {{Default}} cache policy does
synchronize on the cache one such blocking request blocks whole cache forever.
> cache: single blocking request can block all other requests to cached content
> ------------------------------------------------------------------------------
>
> Key: MAGNOLIA-3167
> URL: http://jira.magnolia-cms.com/browse/MAGNOLIA-3167
> Project: Magnolia
> Issue Type: Bug
> Components: cache
> Affects Versions: 3.6.8, 4.1.4, 4.2.3, 4.3.1
> Reporter: Philipp Bärfuss
> Assignee: Boris Kraft
> Fix For: 4.3.x
>
> Attachments: cacheBlock.png, cacheBlockOnflush.png
>
>
> the cache mechanism can block all requests:
> * cache.get() will block if an other request is caching the same key (this is
> a feature of the BlockingCache)
> ** mutex per key kept until cache.put() is called (either with an entry or
> null value)
> * this code is again in a synchronized block which synchronizes on the cache
> object itself
> ** this blocks all other request trying to enter the synchronization block
> The critical scenario which can prevent magnolia from responding any request
> (all threads blocked) is the following
> 1) first request to a resource which is slow or never returns (request to a
> service, poor database connection, ..)
> 2) second request to the same resource: --> thread is blocked at
> EhCacheWrapper.get(key):56, but also keeps the lock on the cache
> 3) all other caching requests are blocked (no matter which url) due to the
> synchronize block at Default.shouldCache(Cache, AggregationState,
> FlushPolicy):89
> Solution:
> * don't synchronize on the cache (why are we doing this???)
> * allow configuration of
> [BlockingCache.timeoutMillis|http://ehcache.org/apidocs/net/sf/ehcache/constructs/blocking/BlockingCache.html#timeoutMillis]
> ** throw an exception if a request waits for to long
> * uncomment finally block at doFilter(HttpServletRequest,
> HttpServletResponse, FilterChain), this is a safety net and should log a
> FATAL ERROR message
> ** only relevant if the result is a store request
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.magnolia-cms.com/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
----------------------------------------------------------------
For list details see
http://www.magnolia-cms.com/home/community/mailing-lists.html
To unsubscribe, E-mail to: <[email protected]>
----------------------------------------------------------------