Alexander Kleymenov (JIRA)
2010-04-15 04:27:48 UTC
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}
------------------------------------------
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
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