[ 
https://issues.apache.org/jira/browse/IGNITE-8640?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16596106#comment-16596106
 ] 

Denis Garus commented on IGNITE-8640:
-------------------------------------

[~vozerov], [~NIzhikov]

I've considered adding of cache validation before sending a discovery message.
There isn't any problem with cache store instantiation.
If CacheConfiguration#storeFactory can't return null, then, I think, it will be 
enough check, that CacheConfiguration#storeFactory isn't null,
because of the validate method has only checks, that cfgStore isn't null.
There is another problem, the validation method changes the cache config 
parameter! It's, obviously, wrong.
After some refactorings, we could add a cache validation before creating 
DynamicCacheStartFuture. It may be considered an improvement.

In that ticket, I've fixed the bug related to improper a checked exception 
handling that can appear in process of cache creation.
Tests for IGNITE-1094 uses only RTE for imitation failed cache creation, but it 
isn't enough. So I expanded unit tests using a checked exception too.

> If first createCache fail - Ignite is freezing on next createCache
> ------------------------------------------------------------------
>
>                 Key: IGNITE-8640
>                 URL: https://issues.apache.org/jira/browse/IGNITE-8640
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: 2.6
>            Reporter: Nikolay Izhikov
>            Assignee: Denis Garus
>            Priority: Critical
>             Fix For: 2.7
>
>
> If first {{createCache}} operation fails on some condition inside 
> {{GridCacheProcessor#validate}} then second {{createCache}} will freeze 
> forever.
> Reproducer:
> {code:java}
> package org.apache.ignite.internal.processors.cache;
> import org.apache.ignite.IgniteCache;
> import org.apache.ignite.IgniteCheckedException;
> import org.apache.ignite.cache.eviction.fifo.FifoEvictionPolicy;
> import org.apache.ignite.configuration.CacheConfiguration;
> import org.apache.ignite.internal.IgniteEx;
> import org.apache.ignite.testframework.GridTestUtils;
> import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
> public class CreateCacheFreezeTest extends GridCommonAbstractTest {
>     public void testCreateEncryptedNotPersistedCacheFail() throws Exception {
>         IgniteEx ignite = startGrid(0);
>         
>         GridTestUtils.assertThrowsWithCause(() -> {
>             CacheConfiguration<Long, String> cc = new 
> CacheConfiguration<>("failed");
>             cc.setEvictionPolicy(new FifoEvictionPolicy());
>             cc.setOnheapCacheEnabled(false);
>             ignite.createCache(cc);
>             return 0;
>         }, IgniteCheckedException.class);
>         IgniteCache<Long, String> cache = ignite.createCache(new 
> CacheConfiguration<>("default"));
>         assertNotNull(cache);
>     }
> }
> {code}
> Log message:
> {noformat}
> [2018-05-29 
> 16:38:11,958][ERROR][exchange-worker-#38%cache.CreateCacheFreezeTest0%][GridDhtPartitionsExchangeFuture]
>  Failed to reinitialize local partitions (preloading will be stopped): 
> GridDhtPartitionExchangeId [topVer=AffinityTopologyVersion [topVer=1, 
> minorTopVer=1], discoEvt=DiscoveryCustomEvent 
> [customMsg=DynamicCacheChangeBatch 
> [id=67cce1ca361-993dd9c2-f4fe-443b-af43-27e06424e1b0, 
> reqs=[DynamicCacheChangeRequest [cacheName=failed, hasCfg=true, 
> nodeId=a525b74c-aec5-4c62-855a-ff96ef300000, clientStartOnly=false, 
> stop=false, destroy=false, disabledAfterStartfalse]], 
> exchangeActions=ExchangeActions [startCaches=[failed], stopCaches=null, 
> startGrps=[failed], stopGrps=[], resetParts=null, stateChangeRequest=null], 
> startCaches=false], affTopVer=AffinityTopologyVersion [topVer=1, 
> minorTopVer=1], super=DiscoveryEvent [evtNode=TcpDiscoveryNode 
> [id=a525b74c-aec5-4c62-855a-ff96ef300000, addrs=[127.0.0.1], 
> sockAddrs=[/127.0.0.1:47500], discPort=47500, order=1, intOrder=1, 
> lastExchangeTime=1527601090538, loc=true, ver=2.5.0#19700101-sha1:00000000, 
> isClient=false], topVer=1, nodeId8=a525b74c, msg=null, 
> type=DISCOVERY_CUSTOM_EVT, tstamp=1527601091938]], nodeId=a525b74c, 
> evt=DISCOVERY_CUSTOM_EVT]
> java.lang.AssertionError: stopping=false, groupName=null, caches=[]
>       at 
> org.apache.ignite.internal.processors.cache.CacheGroupContext.singleCacheContext(CacheGroupContext.java:375)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition.<init>(GridDhtLocalPartition.java:197)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.getOrCreatePartition(GridDhtPartitionTopologyImpl.java:828)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.initPartitions(GridDhtPartitionTopologyImpl.java:369)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopologyImpl.beforeExchange(GridDhtPartitionTopologyImpl.java:544)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.distributedExchange(GridDhtPartitionsExchangeFuture.java:1190)
>       at 
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.init(GridDhtPartitionsExchangeFuture.java:722)
>       at 
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body0(GridCachePartitionExchangeManager.java:2452)
>       at 
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$ExchangeWorker.body(GridCachePartitionExchangeManager.java:2332)
>       at 
> org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
>       at java.lang.Thread.run(Thread.java:748)
> {noformat}



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

Reply via email to