commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Alexander Kleymenov (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (JCS-73) concurrent cache access causes values loss
Date Mon, 12 Nov 2012 11:53:12 GMT

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

Alexander Kleymenov commented on JCS-73:
----------------------------------------

Thomas, thank you for fixing this!
I used JCS as simple key-value storage. Hence such a config.
There were no other solutions allowing to quickly throw out all keys from same group. And
JCS gave good performance.
But then I hit this issue and had to implement solution by myself (EHCache for key-value,
H2 DB to keep key groups).
                
> concurrent cache access causes values loss
> ------------------------------------------
>
>                 Key: JCS-73
>                 URL: https://issues.apache.org/jira/browse/JCS-73
>             Project: Commons JCS
>          Issue Type: Bug
>          Components: Indexed Disk Cache
>    Affects Versions: jcs-1.3
>            Reporter: Alexander Kleymenov
>            Assignee: Thomas Vandahl
>             Fix For: jcs-2.0.0
>
>         Attachments: patch.txt, repro.zip
>
>
> The following groovy code demonstrates the problem: several threads write to the cache
and try to read previously written values. Sometimes just written values can't be retrieved.
In this case, subsequent tries can get the value, but not always.
> {code}
> cache = org.apache.jcs.JCS.getInstance("cache")
> group = "group"
> worker = {
>     def name = Thread.currentThread().name
>     10000.times { idx ->
>         if (idx) {
>             // get previously stored value
>             def res = cache.getFromGroup(idx-1, group)
>             if (!res) {
>                 // null value got inspite of the fact it was placed in cache!
>                 println "ERROR: for ${idx} in " + name
>                 // try to get the value again:
>                 def n = 5
>                 while (n-- > 0) {
>                     res = cache.getFromGroup(idx-1, group)
>                     if (res) {
>                         // the value finally appeared in cache
>                         println "ERROR FIXED for ${idx}: ${res} " + name
>                         break
>                     }
>                     println "ERROR STILL PERSISTS for ${idx} in " + name
>                     Thread.sleep(1000)
>                 }
>             }
>         }
>         // put value in the cache
>         cache.putInGroup(idx, group, [value:[a:1, b:2, c:3], aux:[1:'a', 2:'b', 3:'c',
t:name]])
>         if (!(idx % 10000)) {
>             println name+" "+idx
>         }
>     }
> }
> Thread.start worker
> Thread.start worker
> Thread.start worker
> Thread.start worker
> Thread.start worker
> Thread.start worker
> Thread.start worker
> Thread.start worker
> {code}
> Cache configuration:
> {code}
> jcs.default=CACHE
> jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
> jcs.default.cacheattributes.MaxObjects=-1
> jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
> jcs.default.cacheattributes.DiskUsagePatternName=UPDATE
> jcs.default.cacheattributes.UseMemoryShrinker=true
> jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds=10
> jcs.default.cacheattributes.ShrinkerIntervalSeconds=10
> jcs.default.elementattributes=org.apache.jcs.engine.ElementAttributes
> jcs.default.elementattributes.IsRemote=false
> jcs.default.elementattributes.IsLateral=false
> jcs.default.elementattributes.IsSpool=true
> jcs.default.elementattributes.IsEternal=true
> jcs.auxiliary.CACHE=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
> jcs.auxiliary.CACHE.attributes=org.apache.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
> jcs.auxiliary.CACHE.attributes.DiskPath=./cache
> jcs.auxiliary.CACHE.attributes.MaxPurgatorySize=-1
> jcs.auxiliary.CACHE.attributes.MaxKeySize=-1
> jcs.auxiliary.CACHE.attributes.MaxRecycleBinSize=500
> jcs.auxiliary.CACHE.attributes.ShutdownSpoolTimeLimit=60
> jcs.auxiliary.CACHE.attributes.OptimizeAtRemoveCount=30000
> jcs.auxiliary.CACHE.attributes.OptimizeOnShutdown=true
> jcs.auxiliary.CACHE.attributes.EventQueueType=SINGLE
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message