ignite-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Pavel Pereslegin (JIRA)" <j...@apache.org>
Subject [jira] [Created] (IGNITE-8092) Put operation may hang if cache was destroyed asynchronously.
Date Sun, 01 Apr 2018 16:32:00 GMT
Pavel Pereslegin created IGNITE-8092:
----------------------------------------

             Summary: Put operation may hang if cache was destroyed asynchronously.
                 Key: IGNITE-8092
                 URL: https://issues.apache.org/jira/browse/IGNITE-8092
             Project: Ignite
          Issue Type: Bug
          Components: cache
    Affects Versions: 2.4
            Reporter: Pavel Pereslegin


If there is more than one cache in the cache group then put operation on cache may hang if
it was destroyed asynchronously.
For now this applies to all cache modes (PARTITIONED/REPLICATED/LOCAL) and to all atomicity
modes (ATOMIC/TRANSACTIONAL).

This problem can not be reproduced if there is only one cache in the cache group.

Reproducer:
{code:java}
public class DestroyCacheTest extends GridCommonAbstractTest {

    private CacheConfiguration<Integer, Boolean> ccfg(String name, String grp) {
        return new CacheConfiguration<Integer, Boolean>(name).setCacheMode(CacheMode.PARTITIONED)
            .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL)
            .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
            .setGroupName(grp);
    }

    public void testDestroyAsync() throws Exception {
        String grpName = "testGroup";

        try (IgniteEx node = startGrid(0)) {
            node.createCache(ccfg("cache2", grpName));

            for (int n = 0; n < 100; n++) {
                IgniteCache<Integer, Boolean> cache1 = node.createCache(ccfg("cache1",
grpName));

                AtomicInteger cntr = new AtomicInteger();

                GridTestUtils.runMultiThreadedAsync(() -> {
                    try {
                        int key;

                        while ((key = cntr.getAndIncrement()) < 10_000) {
                            if (key == 1000)
                                cache1.destroy();

                            cache1.putIfAbsent(key, true);
                        }
                    }
                    catch (Exception ignore) {
                        log.warning(ignore.getMessage());
                    }

                    return null;
                }, 6, "put-thread").get();
            }
        }
    }
}
{code}

p.s. for ATOMIC cache additional cache status check in GridCacheGateway#onStopped busy wait
resolve this problem.




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message