ignite-1400 Concurrent cache/node stop
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/91dd7c1c Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/91dd7c1c Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/91dd7c1c Branch: refs/heads/ignite-1282 Commit: 91dd7c1cadfd70da8223a2755c2daf915ed69183 Parents: f977613 Author: sboikov <sboi...@gridgain.com> Authored: Tue Sep 15 14:26:33 2015 +0300 Committer: sboikov <sboi...@gridgain.com> Committed: Tue Sep 15 14:26:33 2015 +0300 ---------------------------------------------------------------------- .../processors/cache/GridCacheProcessor.java | 19 +++- .../cache/IgniteCacheCreateRestartSelfTest.java | 106 +++++++++++++++++++ .../testsuites/IgniteCacheRestartTestSuite.java | 3 + 3 files changed, 126 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/91dd7c1c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 59bb5f7..4317f70 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -936,6 +936,12 @@ public class GridCacheProcessor extends GridProcessorAdapter { @Override public void onKernalStop(boolean cancel) { cacheStartedLatch.countDown(); + GridCachePartitionExchangeManager<Object, Object> exch = context().exchange(); + + // Stop exchange manager first so that we call onKernalStop on all caches. + // No new caches should be added after this point. + exch.onKernalStop(cancel); + for (String cacheName : stopSeq) { GridCacheAdapter<?, ?> cache = caches.remove(maskNull(cacheName)); @@ -962,7 +968,8 @@ public class GridCacheProcessor extends GridProcessorAdapter { it.hasPrevious();) { GridCacheSharedManager<?, ?> mgr = it.previous(); - mgr.onKernalStop(cancel); + if (mgr != exch) + mgr.onKernalStop(cancel); } } @@ -2379,7 +2386,7 @@ public class GridCacheProcessor extends GridProcessorAdapter { if (ctx.localNodeId().equals(req.initiatingNodeId())) { fut = (DynamicCacheStartFuture)pendingFuts.get(maskNull(req.cacheName())); - if (!req.deploymentId().equals(fut.deploymentId())) + if (fut != null && !req.deploymentId().equals(fut.deploymentId())) fut = null; } @@ -3101,6 +3108,14 @@ public class GridCacheProcessor extends GridProcessorAdapter { */ public void cancelUserOperations() { sharedCtx.mvcc().cancelClientFutures(); + + Exception err = new IgniteCheckedException("Operation has been cancelled (node is stopping)."); + + for (IgniteInternalFuture fut : pendingFuts.values()) + ((GridFutureAdapter)fut).onDone(err); + + for (IgniteInternalFuture fut : pendingTemplateFuts.values()) + ((GridFutureAdapter)fut).onDone(err); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/91dd7c1c/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCreateRestartSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCreateRestartSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCreateRestartSelfTest.java new file mode 100644 index 0000000..0a2d778 --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheCreateRestartSelfTest.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.processors.cache; + +import java.util.concurrent.Callable; +import java.util.concurrent.ThreadLocalRandom; +import javax.cache.CacheException; +import org.apache.ignite.Ignite; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; +import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +/** + * + */ +public class IgniteCacheCreateRestartSelfTest extends GridCommonAbstractTest { + /** Cache name. */ + private static final String CACHE_NAME = "partitioned"; + + /** IP finder. */ + private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true); + + /** */ + private static final int NODES = 4; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(gridName); + + cfg.setPeerClassLoadingEnabled(false); + + ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + } + + /** {@inheritDoc} */ + @Override protected long getTestTimeout() { + return 5 * 60_000; + } + + /** + * @throws Exception If failed. + */ + public void testStopOriginatingNode() throws Exception { + startGrids(NODES); + + ThreadLocalRandom rnd = ThreadLocalRandom.current(); + + for (int i = 0; i < 50; i++) { + int node = rnd.nextInt(0, NODES); + + final Ignite ignite = ignite(node); + + info("Running iteration on the node [idx=" + node + ", nodeId=" + ignite.cluster().localNode().id() + ']'); + + IgniteInternalFuture<?> fut = GridTestUtils.runAsync(new Callable<Void>() { + @Override public Void call() throws Exception { + Thread.currentThread().setName("create-thread"); + + try { + ignite.createCache(new CacheConfiguration<>(CACHE_NAME)); + } + catch (CacheException | IllegalStateException e) { + log.info("Expected error: " + e); + } + + return null; + } + }); + + ignite.close(); + + fut.get(); + + Ignite ignite0 = startGrid(node); + + ignite0.destroyCache(CACHE_NAME); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/91dd7c1c/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheRestartTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheRestartTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheRestartTestSuite.java index 34ef79b..a6bd785 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheRestartTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheRestartTestSuite.java @@ -18,6 +18,7 @@ package org.apache.ignite.testsuites; import junit.framework.TestSuite; +import org.apache.ignite.internal.processors.cache.IgniteCacheCreateRestartSelfTest; import org.apache.ignite.internal.processors.cache.distributed.dht.GridCachePartitionedNearDisabledOptimisticTxNodeRestartTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedNodeRestartTest; import org.apache.ignite.internal.processors.cache.distributed.near.GridCachePartitionedOptimisticTxNodeRestartTest; @@ -39,6 +40,8 @@ public class IgniteCacheRestartTestSuite extends TestSuite { suite.addTestSuite(GridCacheReplicatedNodeRestartSelfTest.class); suite.addTestSuite(GridCachePartitionedNearDisabledOptimisticTxNodeRestartTest.class); + suite.addTestSuite(IgniteCacheCreateRestartSelfTest.class); + return suite; } } \ No newline at end of file