Discussion:
[jira] Created: (JCS-73) concurrent cache access causes values loss
Alexander Kleymenov (JIRA)
2010-04-15 04:27:48 UTC
Permalink
concurrent cache access causes values loss
------------------------------------------

Key: JCS-73
URL: https://issues.apache.org/jira/browse/JCS-73
Project: JCS
Issue Type: Bug
Components: Indexed Disk Cache
Affects Versions: jcs-1.3
Reporter: Alexander Kleymenov
Assignee: Aaron Smuts


The following groovy code demonstrates the problem: several threads write to the cache and try to read previously written values. Sometimes values can 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 contact one of the administrators: https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
Aaron Smuts
2010-04-22 13:41:25 UTC
Permalink
The group functionality will be deprecated. It's already unofficially deprecated. Most of the auxiliaries don't support it. . . . But I look into it.

Aaron
Subject: [jira] Created: (JCS-73) concurrent cache access causes values loss
Date: Wednesday, April 14, 2010, 9:27 PM
concurrent cache access causes values
loss
------------------------------------------
             
   Key: JCS-73
             
   URL: https://issues.apache.org/jira/browse/JCS-73
         
   Project: JCS
          Issue Type: Bug
          Components: Indexed Disk
Cache
    Affects Versions: jcs-1.3
Alexander Kleymenov
            Assignee: Aaron
Smuts
The following groovy code demonstrates the problem: several
threads write to the cache and try to read previously
written values. Sometimes values can 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
                //
                def
n = 5
               
while (n-- > 0) {
               
    res = cache.getFromGroup(idx-1, group)
               
    if (res) {
               
        // the value finally appeared in
cache
               
${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}
{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 contact one of the
administrators: https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
       
---------------------------------------------------------------------
Loading...