[ 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)