You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Pavel Tupitsyn (JIRA)" <ji...@apache.org> on 2016/09/22 09:24:21 UTC

[jira] [Updated] (IGNITE-3955) IgniteCache.invokeAll returns empty result set in ATOMIC cache

     [ 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, (long)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, Long> cache = (IgniteCache<String, Long>)(IgniteCache)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<Long>> res =
                        cache.invokeAll(keys, new PlatformDotNetEntityFrameworkIncreaseVersionProcessor());

                    assertEquals(1, res.size());
                }
            }
        }, threadCnt, "testInvokeAllMultithreaded");

        assertEquals(cnt*threadCnt, (long)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, (long)cache.get("myKey"));
>     }
> {code}
> Run this test as part of GridCacheAtomicFullApiSelfTest.java.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)