[
https://issues.apache.org/jira/browse/IGNITE-3955?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Pavel Tupitsyn updated IGNITE-3955:
-----------------------------------
Description:
When entry processor is invoked from multiple threads, result set is sometimes
empty.
This happens with ATOMIC cache, but not with TRANSACTIONAL.
To reproduce, paste the following into GridCacheAbstractFullApiSelfTest.java:
{code}
public void testInvokeAllMultithreaded() throws Exception {
final IgniteCache<String, Integer> cache = jcache();
final int threadCnt = 4;
final int cnt = 90000;
final Set<String> keys = Collections.singleton("myKey");
GridTestUtils.runMultiThreaded(new Runnable() {
@Override public void run() {
for (int i = 0; i < cnt; i++) {
final Map<String, EntryProcessorResult<Integer>> res =
cache.invokeAll(keys, new CacheEntryProcessor<String,
Integer, Integer>() {
@Override
public Integer process(MutableEntry<String,
Integer> entry,
Object... objects) throws
EntryProcessorException {
Integer val = entry.getValue();
if (val == null)
val = 0;
val++;
entry.setValue(val);
return val;
}
});
assertEquals(1, res.size());
}
}
}, threadCnt, "testInvokeAllMultithreaded");
assertEquals(cnt*threadCnt, (int)cache.get("myKey"));
}
{code}
Run this test as part of GridCacheAtomicFullApiSelfTest.java.
was:
When entry processor is invoked from multiple threads, result set is sometimes
empty.
This happens with ATOMIC cache, but not with TRANSACTIONAL.
To reproduce, paste the following into GridCacheAbstractFullApiSelfTest.java:
{code}
public void testInvokeAllMultithreaded() throws Exception {
final IgniteCache<String, Integer> cache = jcache();
final int threadCnt = 4;
final int cnt = 90000;
final Set<String> keys = Collections.singleton("myKey");
GridTestUtils.runMultiThreaded(new Runnable() {
@Override public void run() {
for (int i = 0; i < cnt; i++) {
final Map<String, EntryProcessorResult<Integer>> res =
cache.invokeAll(keys, new CacheEntryProcessor<String,
Integer, Integer>() {
@Override
public Integer process(MutableEntry<String,
Integer> entry,
Object... objects) throws
EntryProcessorException {
Integer val = entry.getValue();
if (val == null)
val = 0;
val++;
entry.setValue(val);
return val;
}
});
assertEquals(1, res.size());
}
}
}, threadCnt, "testInvokeAllMultithreaded");
assertEquals(cnt*threadCnt, cache.get("myKey"));
}
{code}
Run this test as part of GridCacheAtomicFullApiSelfTest.java.
> IgniteCache.invokeAll returns empty result set in ATOMIC cache
> --------------------------------------------------------------
>
> Key: IGNITE-3955
> URL: https://issues.apache.org/jira/browse/IGNITE-3955
> Project: Ignite
> Issue Type: Bug
> Components: cache
> Affects Versions: 1.7
> Reporter: Pavel Tupitsyn
> Fix For: 1.8
>
>
> When entry processor is invoked from multiple threads, result set is
> sometimes empty.
> This happens with ATOMIC cache, but not with TRANSACTIONAL.
> To reproduce, paste the following into GridCacheAbstractFullApiSelfTest.java:
> {code}
> public void testInvokeAllMultithreaded() throws Exception {
> final IgniteCache<String, Integer> cache = jcache();
> final int threadCnt = 4;
> final int cnt = 90000;
> final Set<String> keys = Collections.singleton("myKey");
> GridTestUtils.runMultiThreaded(new Runnable() {
> @Override public void run() {
> for (int i = 0; i < cnt; i++) {
> final Map<String, EntryProcessorResult<Integer>> res =
> cache.invokeAll(keys, new CacheEntryProcessor<String,
> Integer, Integer>() {
> @Override
> public Integer process(MutableEntry<String,
> Integer> entry,
> Object... objects) throws
> EntryProcessorException {
> Integer val = entry.getValue();
> if (val == null)
> val = 0;
> val++;
> entry.setValue(val);
> return val;
> }
> });
> assertEquals(1, res.size());
> }
> }
> }, threadCnt, "testInvokeAllMultithreaded");
> assertEquals(cnt*threadCnt, (int)cache.get("myKey"));
> }
> {code}
> Run this test as part of GridCacheAtomicFullApiSelfTest.java.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)