You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/06/05 20:02:00 UTC

[49/50] incubator-ignite git commit: ignite-929

ignite-929


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/9fd491eb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/9fd491eb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/9fd491eb

Branch: refs/heads/ignite-929
Commit: 9fd491eb4b2fd76634168c8da22beb661a36e677
Parents: 921057f
Author: avinogradov <av...@gridgain.com>
Authored: Fri Jun 5 20:59:28 2015 +0300
Committer: avinogradov <av...@gridgain.com>
Committed: Fri Jun 5 20:59:28 2015 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheProcessor.java    |  12 +-
 .../processors/cache/IgniteCacheProxy.java      |   3 -
 .../cache/CacheStopAndDestroySelfTest.java      | 571 ++++++++++++++-----
 3 files changed, 422 insertions(+), 164 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9fd491eb/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 b7a3db7..f8f6de5 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
@@ -1993,7 +1993,7 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 return F.first(initiateCacheChanges(F.asList(t)));
             }
 
-            return null; // No-op.
+            return new GridFinishedFuture<>(); // No-op.
         }
     }
 
@@ -2157,17 +2157,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                     stopGateway(req);
 
                     prepareCacheStop(req);
-
-                    if (desc != null)
-                        registeredCaches.remove(maskNull(req.cacheName()), desc);
                 }
+                // Renew deployment id to have no race condition with start after stop request.
+                desc.deploymentId(IgniteUuid.randomUuid());
 
                 ctx.discovery().onClientCacheClose(req.cacheName(), req.initiatingNodeId());
 
-                DynamicCacheStartFuture changeFut = (DynamicCacheStartFuture)pendingFuts.get(maskNull(req.cacheName()));
-
-                if (changeFut != null && changeFut.deploymentId().equals(req.deploymentId()))
-                    changeFut.onDone();
+                completeStartFuture(req);
             }
             else {
                 if (desc == null) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9fd491eb/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
index 6ba8eae..d7cc472 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
@@ -1360,9 +1360,6 @@ public class IgniteCacheProxy<K, V> extends AsyncSupportAdapter<IgniteCache<K, V
 
         try {
             fut = ctx.kernalContext().cache().dynamicCloseCache(ctx.name());
-
-            if (fut == null)
-                return;
         }
         finally {
             onLeave();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/9fd491eb/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
index 9465e5d..d3487ce 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheStopAndDestroySelfTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import org.apache.ignite.*;
 import org.apache.ignite.cache.*;
 import org.apache.ignite.cluster.*;
 import org.apache.ignite.configuration.*;
@@ -46,28 +47,16 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
     protected static String KEY_VAL = "1";
 
     /** cache name 1. */
-    protected static String CACHE_NAME_DESTROY_DHT = "cache_d";
+    protected static String CACHE_NAME_DHT = "cache";
 
     /** cache name 2. */
-    protected static String CACHE_NAME_CLOSE_DHT = "cache_c";
+    protected static String CACHE_NAME_CLIENT = "cache_client";
 
-    /** cache name 3. */
-    protected static String CACHE_NAME_DESTROY_CLIENT = "cache_d_client";
+    /** near cache name. */
+    protected static String CACHE_NAME_NEAR = "cache_near";
 
-    /** cache name 4. */
-    protected static String CACHE_NAME_CLOSE_CLIENT = "cache_c_client";
-
-    /** near cache name 1. */
-    protected static String CACHE_NAME_DESTROY_NEAR = "cache_d_near";
-
-    /** near cache name 2. */
-    protected static String CACHE_NAME_CLOSE_NEAR = "cache_c_near";
-
-    /** local cache name 1. */
-    protected static String CACHE_NAME_DESTROY_LOC = "cache_d_local";
-
-    /** local cache name 2. */
-    protected static String CACHE_NAME_CLOSE_LOC = "cache_c_local";
+    /** local cache name. */
+    protected static String CACHE_NAME_LOC = "cache_local";
 
     /**
      * @return Grids count to start.
@@ -121,95 +110,86 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
     }
 
     /**
-     * Test.
+     * @return dht config
+     */
+    private CacheConfiguration getDhtConfig() {
+        CacheConfiguration cfg = defaultCacheConfiguration();
+        cfg.setName(CACHE_NAME_DHT);
+        cfg.setCacheMode(CacheMode.PARTITIONED);
+        return cfg;
+    }
+
+    /**
+     * @return client config
+     */
+    private CacheConfiguration getClientConfig() {
+        CacheConfiguration cfg = defaultCacheConfiguration();
+        cfg.setName(CACHE_NAME_CLIENT);
+        cfg.setCacheMode(CacheMode.PARTITIONED);
+        return cfg;
+    }
+
+    /**
+     * @return near config
+     */
+    private CacheConfiguration getNearConfig() {
+        CacheConfiguration cfg = defaultCacheConfiguration();
+        cfg.setName(CACHE_NAME_NEAR);
+        cfg.setCacheMode(CacheMode.PARTITIONED);
+        cfg.setNearConfiguration(new NearCacheConfiguration());
+        return cfg;
+    }
+
+    /**
+     * @return local config
+     */
+    private CacheConfiguration getLocalConfig() {
+        CacheConfiguration cfg = defaultCacheConfiguration();
+        cfg.setName(CACHE_NAME_LOC);
+        cfg.setCacheMode(CacheMode.LOCAL);
+        return cfg;
+    }
+
+    /**
+     * Test Double Destroy.
      *
      * @throws Exception If failed.
      */
-    public void testCacheStopAndDestroy() throws Exception {
-        startGridsMultiThreaded(gridCount());
+    public void testDhtDoubleDestroy() throws Exception {
+        dhtDestroy();
+        dhtDestroy();
+    }
 
-        //GridDhtTxPrepareRequest requests to Client node will be counted.
-        CountingTxRequestsToClientNodeTcpCommunicationSpi.nodeFilter = grid(2).context().localNodeId();
+    /**
+     * Test DHT Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    private void dhtDestroy() throws Exception {
+        grid(0).getOrCreateCache(getDhtConfig());
+
+        assert grid(0).cache(CACHE_NAME_DHT).get(KEY_VAL) == null;
 
-        CacheConfiguration cCfgD = defaultCacheConfiguration();
-        cCfgD.setName(CACHE_NAME_DESTROY_DHT);
-        cCfgD.setCacheMode(CacheMode.PARTITIONED);
-
-        CacheConfiguration cCfgC = defaultCacheConfiguration();
-        cCfgC.setName(CACHE_NAME_CLOSE_DHT);
-        cCfgC.setCacheMode(CacheMode.PARTITIONED);
-
-        CacheConfiguration cCfgDClient = defaultCacheConfiguration();
-        cCfgDClient.setName(CACHE_NAME_DESTROY_CLIENT);
-        cCfgDClient.setCacheMode(CacheMode.PARTITIONED);
-
-        CacheConfiguration cCfgCClient = defaultCacheConfiguration();
-        cCfgCClient.setName(CACHE_NAME_CLOSE_CLIENT);
-        cCfgCClient.setCacheMode(CacheMode.PARTITIONED);
-
-        CacheConfiguration cCfgDNear = defaultCacheConfiguration();
-        cCfgDNear.setName(CACHE_NAME_DESTROY_NEAR);
-        cCfgDNear.setCacheMode(CacheMode.PARTITIONED);
-        cCfgDNear.setNearConfiguration(new NearCacheConfiguration());
-
-        CacheConfiguration cCfgCNear = defaultCacheConfiguration();
-        cCfgCNear.setName(CACHE_NAME_CLOSE_NEAR);
-        cCfgCNear.setCacheMode(CacheMode.PARTITIONED);
-        cCfgCNear.setNearConfiguration(new NearCacheConfiguration());
-
-        CacheConfiguration cCfgDLoc = defaultCacheConfiguration();
-        cCfgDLoc.setName(CACHE_NAME_DESTROY_LOC);
-        cCfgDLoc.setCacheMode(CacheMode.LOCAL);
-
-        CacheConfiguration cCfgCLoc = defaultCacheConfiguration();
-        cCfgCLoc.setName(CACHE_NAME_CLOSE_LOC);
-        cCfgCLoc.setCacheMode(CacheMode.LOCAL);
-
-        grid(0).getOrCreateCache(cCfgD);
-        grid(0).getOrCreateCache(cCfgC);
-        grid(0).getOrCreateCache(cCfgDClient);
-        grid(0).getOrCreateCache(cCfgCClient);
-        grid(0).getOrCreateCache(cCfgDNear);
-        grid(0).getOrCreateCache(cCfgCNear);
-        grid(0).getOrCreateCache(cCfgDLoc);
-        grid(0).getOrCreateCache(cCfgCLoc);
-
-        grid(0).cache(CACHE_NAME_DESTROY_DHT).put(KEY_VAL, KEY_VAL);
-        grid(0).cache(CACHE_NAME_CLOSE_DHT).put(KEY_VAL, KEY_VAL);
-        grid(0).cache(CACHE_NAME_DESTROY_CLIENT).put(KEY_VAL, KEY_VAL);
-        grid(0).cache(CACHE_NAME_CLOSE_CLIENT).put(KEY_VAL, KEY_VAL);
-        grid(0).cache(CACHE_NAME_DESTROY_LOC).put(KEY_VAL, KEY_VAL + 0);
-        grid(0).cache(CACHE_NAME_CLOSE_LOC).put(KEY_VAL, KEY_VAL + 0);
-        grid(1).cache(CACHE_NAME_DESTROY_LOC).put(KEY_VAL, KEY_VAL + 1);
-        grid(1).cache(CACHE_NAME_CLOSE_LOC).put(KEY_VAL, KEY_VAL + 1);
-
-        assert grid(0).cache(CACHE_NAME_DESTROY_DHT).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(0).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(0).cache(CACHE_NAME_DESTROY_CLIENT).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(0).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(0).cache(CACHE_NAME_DESTROY_LOC).get(KEY_VAL).equals(KEY_VAL + 0);
-        assert grid(0).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL).equals(KEY_VAL + 0);
-        assert grid(1).cache(CACHE_NAME_DESTROY_LOC).get(KEY_VAL).equals(KEY_VAL + 1);
-        assert grid(1).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL).equals(KEY_VAL + 1);
-
-        //Destroy:
+        grid(0).cache(CACHE_NAME_DHT).put(KEY_VAL, KEY_VAL);
+
+        assert grid(0).cache(CACHE_NAME_DHT).get(KEY_VAL).equals(KEY_VAL);
 
         //DHT Destroy. Cache should be removed from each node.
 
-        grid(0).cache(CACHE_NAME_DESTROY_DHT).destroy();
+        grid(0).cache(CACHE_NAME_DHT).destroy();
 
         try {
-            grid(0).cache(CACHE_NAME_DESTROY_DHT).get(KEY_VAL);
+            grid(0).cache(CACHE_NAME_DHT).get(KEY_VAL);
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored0) {
             try {
-                grid(1).cache(CACHE_NAME_DESTROY_DHT).get(KEY_VAL);
+                grid(1).cache(CACHE_NAME_DHT).get(KEY_VAL);
                 assert false;
             }
             catch (IllegalArgumentException | IllegalStateException ignored1) {
                 try {
-                    grid(2).cache(CACHE_NAME_DESTROY_DHT).get(KEY_VAL);
+                    grid(2).cache(CACHE_NAME_DHT).get(KEY_VAL);
                     assert false;
                 }
                 catch (IllegalArgumentException | IllegalStateException ignored2) {
@@ -217,23 +197,48 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
                 }
             }
         }
+    }
+
+    /**
+     * Test Double Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientDoubleDestroy() throws Exception {
+        clientDestroy();
+        clientDestroy();
+    }
+
+    /**
+     * Test Client Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    private void clientDestroy() throws Exception {
+        grid(0).getOrCreateCache(getClientConfig());
+
+        assert grid(0).cache(CACHE_NAME_CLIENT).get(KEY_VAL) == null;
+
+        grid(0).cache(CACHE_NAME_CLIENT).put(KEY_VAL, KEY_VAL);
+
+        assert grid(0).cache(CACHE_NAME_CLIENT).get(KEY_VAL).equals(KEY_VAL);
 
         //DHT Destroy from client node. Cache should be removed from each node.
 
-        grid(2).cache(CACHE_NAME_DESTROY_CLIENT).destroy();// Client node.
+        grid(2).cache(CACHE_NAME_CLIENT).destroy();// Client node.
 
         try {
-            grid(0).cache(CACHE_NAME_DESTROY_CLIENT).get(KEY_VAL);
+            grid(0).cache(CACHE_NAME_CLIENT).get(KEY_VAL);
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored0) {
             try {
-                grid(1).cache(CACHE_NAME_DESTROY_CLIENT).get(KEY_VAL);
+                grid(1).cache(CACHE_NAME_CLIENT).get(KEY_VAL);
                 assert false;
             }
             catch (IllegalArgumentException | IllegalStateException ignored1) {
                 try {
-                    grid(2).cache(CACHE_NAME_DESTROY_CLIENT).get(KEY_VAL);
+                    grid(2).cache(CACHE_NAME_CLIENT).get(KEY_VAL);
                     assert false;
                 }
                 catch (IllegalArgumentException | IllegalStateException ignored2) {
@@ -241,23 +246,52 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
                 }
             }
         }
+    }
+
+    /**
+     * Test Double Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNearDoubleDestroy() throws Exception {
+        nearDestroy();
+        nearDestroy();
+    }
+
+    /**
+     * Test Near Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    private void nearDestroy() throws Exception {
+        grid(0).getOrCreateCache(getNearConfig());
+
+        grid(2).getOrCreateNearCache(CACHE_NAME_NEAR, new NearCacheConfiguration());
+
+        assert grid(0).cache(CACHE_NAME_NEAR).get(KEY_VAL) == null;
+        assert grid(2).cache(CACHE_NAME_NEAR).get(KEY_VAL) == null;
+
+        grid(2).cache(CACHE_NAME_NEAR).put(KEY_VAL, KEY_VAL);
+        grid(0).cache(CACHE_NAME_NEAR).put(KEY_VAL, "near-test");
+
+        assert grid(2).cache(CACHE_NAME_NEAR).localPeek(KEY_VAL).equals("near-test");
 
         //Local destroy. Cache should be removed from each node.
 
-        grid(0).cache(CACHE_NAME_DESTROY_LOC).destroy();
+        grid(2).cache(CACHE_NAME_NEAR).destroy();
 
         try {
-            grid(0).cache(CACHE_NAME_DESTROY_LOC).get(KEY_VAL);
+            grid(0).cache(CACHE_NAME_NEAR).get(KEY_VAL);
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored0) {
             try {
-                grid(1).cache(CACHE_NAME_DESTROY_LOC).get(KEY_VAL);
+                grid(1).cache(CACHE_NAME_NEAR).get(KEY_VAL);
                 assert false;
             }
             catch (IllegalArgumentException | IllegalStateException ignored1) {
                 try {
-                    grid(2).cache(CACHE_NAME_DESTROY_LOC).get(KEY_VAL);
+                    grid(2).cache(CACHE_NAME_NEAR).get(KEY_VAL);
                     assert false;
                 }
                 catch (IllegalArgumentException | IllegalStateException ignored2) {
@@ -265,33 +299,51 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
                 }
             }
         }
+    }
+
+    /**
+     * Test Double Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNearLocalDestroy() throws Exception {
+        localDestroy();
+        localDestroy();
+    }
+
+    /**
+     * Test Local Destroy.
+     *
+     * @throws Exception If failed.
+     */
+    private void localDestroy() throws Exception {
+        grid(0).getOrCreateCache(getLocalConfig());
 
-        //Near destroy. Cache should be removed from each node.
+        assert grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL) == null;
+        assert grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL) == null;
 
-        grid(0).createNearCache(CACHE_NAME_DESTROY_NEAR, new NearCacheConfiguration());
-        grid(1).createNearCache(CACHE_NAME_DESTROY_NEAR, new NearCacheConfiguration());
-        grid(2).createNearCache(CACHE_NAME_DESTROY_NEAR, new NearCacheConfiguration());
+        grid(0).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + 0);
+        grid(1).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + 1);
 
-        grid(0).cache(CACHE_NAME_DESTROY_NEAR).put(KEY_VAL, KEY_VAL);
+        assert grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + 0);
+        assert grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + 1);
 
-        assert grid(0).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(1).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL).equals(KEY_VAL);
-        assert grid(2).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL).equals(KEY_VAL);
+        //Local destroy. Cache should be removed from each node.
 
-        grid(0).cache(CACHE_NAME_DESTROY_NEAR).destroy();
+        grid(0).cache(CACHE_NAME_LOC).destroy();
 
         try {
-            grid(0).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL);
+            grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL);
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored0) {
             try {
-                grid(1).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL);
+                grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL);
                 assert false;
             }
             catch (IllegalArgumentException | IllegalStateException ignored1) {
                 try {
-                    grid(2).cache(CACHE_NAME_DESTROY_NEAR).get(KEY_VAL);
+                    grid(2).cache(CACHE_NAME_LOC).get(KEY_VAL);
                     assert false;
                 }
                 catch (IllegalArgumentException | IllegalStateException ignored2) {
@@ -299,75 +351,195 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
                 }
             }
         }
+    }
+
+    /**
+     * Test Dht close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDhtClose() throws Exception {
+        IgniteCache<String, String> dhtCache0 = grid(0).getOrCreateCache(getDhtConfig());
+
+        assert dhtCache0.get(KEY_VAL) == null;
 
-        //Close:
+        dhtCache0.put(KEY_VAL, KEY_VAL);
+
+        assert dhtCache0.get(KEY_VAL).equals(KEY_VAL);
 
         //DHT Close. No-op.
 
-        grid(0).cache(CACHE_NAME_CLOSE_DHT).close();
+        IgniteCache<String, String> dhtCache1 = grid(1).cache(CACHE_NAME_DHT);
+        IgniteCache<String, String> dhtCache2 = grid(2).cache(CACHE_NAME_DHT);
+
+        dhtCache0.close();
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL);// Not affected.
-        assert grid(1).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL);// Not affected.
-        assert grid(2).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL);// Not affected.
+        assert dhtCache0.get(KEY_VAL).equals(KEY_VAL);// Not affected.
+        assert dhtCache1.get(KEY_VAL).equals(KEY_VAL);// Not affected.
+        assert dhtCache2.get(KEY_VAL).equals(KEY_VAL);// Not affected.
 
         //DHT Creation after closed.
 
-        grid(0).getOrCreateCache(cCfgC);
+        dhtCache0 = grid(0).cache(CACHE_NAME_DHT);
+
+        dhtCache0.put(KEY_VAL, KEY_VAL + "recreated");
+
+        assert dhtCache0.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert dhtCache0.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert dhtCache0.get(KEY_VAL).equals(KEY_VAL + "recreated");
+    }
+
+    /**
+     * Test Dht close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testDhtCloseWithTry() throws Exception {
+        String curVal = null;
+
+        for (int i = 0; i < 3; i++) {
+            try (IgniteCache<String, String> cache0 = grid(0).getOrCreateCache(getDhtConfig())) {
+                IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_DHT);
+                IgniteCache<String, String> cache2 = grid(2).cache(CACHE_NAME_DHT);
 
-        grid(0).cache(CACHE_NAME_CLOSE_DHT).put(KEY_VAL, KEY_VAL + "recreated");
+                assert cache0.get(KEY_VAL) == null || cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL) == null || cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL) == null || cache2.get(KEY_VAL).equals(curVal);
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(1).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(2).cache(CACHE_NAME_CLOSE_DHT).get(KEY_VAL).equals(KEY_VAL + "recreated");
+                curVal = KEY_VAL + curVal;
+
+                cache0.put(KEY_VAL, curVal);
+
+                assert cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL).equals(curVal);
+            }
+        }
+    }
+
+    /**
+     * Test Client close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientClose() throws Exception {
+        IgniteCache<String, String> cache0 = grid(0).getOrCreateCache(getClientConfig());
+
+        assert cache0.get(KEY_VAL) == null;
+
+        cache0.put(KEY_VAL, KEY_VAL);
+
+        assert cache0.get(KEY_VAL).equals(KEY_VAL);
 
         //DHT Close from client node. Should affect only client node.
 
-        grid(2).cache(CACHE_NAME_CLOSE_CLIENT).close();// Client node.
+        IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_CLIENT);
+        IgniteCache<String, String> cache2 = grid(2).cache(CACHE_NAME_CLIENT);
+
+        assert cache2.get(KEY_VAL).equals(KEY_VAL);
+
+        cache2.close();// Client node.
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL);// Not affected.
-        assert grid(1).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL);// Not affected.
+        assert cache0.get(KEY_VAL).equals(KEY_VAL);// Not affected.
+        assert cache1.get(KEY_VAL).equals(KEY_VAL);// Not affected.
 
         try {
-            grid(2).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL);// Affected.
+            cache2.get(KEY_VAL);// Affected.
             assert false;
         }
-        catch (IllegalArgumentException | IllegalStateException ignored) {
+        catch (IllegalStateException ignored) {
             // No-op
         }
 
         //DHT Creation from client node after closed.
+        cache2 = grid(2).cache(CACHE_NAME_CLIENT);
+
+        assert cache2.get(KEY_VAL).equals(KEY_VAL);
+
+        cache0.put(KEY_VAL, KEY_VAL + "recreated");
+
+        assert cache0.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert cache1.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert cache2.get(KEY_VAL).equals(KEY_VAL + "recreated");
+    }
+
+    /**
+     * Test Client close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testClientCloseWithTry() throws Exception {
+        String curVal = null;
+
+        for (int i = 0; i < 3; i++) {
+            try (IgniteCache<String, String> cache2 = grid(2).getOrCreateCache(getClientConfig())) {
+                IgniteCache<String, String> cache0 = grid(0).cache(CACHE_NAME_CLIENT);
+                IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_CLIENT);
 
-        grid(2).getOrCreateCache(cCfgCClient);
+                assert cache0.get(KEY_VAL) == null || cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL) == null || cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL) == null || cache2.get(KEY_VAL).equals(curVal);
 
-        grid(0).cache(CACHE_NAME_CLOSE_CLIENT).put(KEY_VAL, KEY_VAL + "recreated");
+                curVal = KEY_VAL + curVal;
+
+                cache2.put(KEY_VAL, curVal);
+
+                assert cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL).equals(curVal);
+            }
+        }
+    }
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(1).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(2).cache(CACHE_NAME_CLOSE_CLIENT).get(KEY_VAL).equals(KEY_VAL + "recreated");
+    /**
+     * Test Near close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNearClose() throws Exception {
+        IgniteCache<String, String> cache0 = grid(0).getOrCreateCache(getNearConfig());
+
+        //GridDhtTxPrepareRequest requests to Client node will be counted.
+        CountingTxRequestsToClientNodeTcpCommunicationSpi.nodeFilter = grid(2).context().localNodeId();
 
         //Near Close from client node.
 
-        grid(2).createNearCache(CACHE_NAME_CLOSE_NEAR, new NearCacheConfiguration());
+        IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_NEAR);
+        IgniteCache<String, String> cache2 = grid(2).createNearCache(CACHE_NAME_NEAR, new NearCacheConfiguration());
+
+        assert cache2.get(KEY_VAL) == null;
 
         //Subscribing to events.
-        grid(2).cache(CACHE_NAME_CLOSE_NEAR).put(KEY_VAL, KEY_VAL);
+        cache2.put(KEY_VAL, KEY_VAL);
+
+        CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt.set(0);
+
+        cache0.put(KEY_VAL, "near-test");
+
+        U.sleep(1000);
+
+        //Ensure near cache was automatically updated.
+        assert CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt.get() != 0;
+
+        assert cache2.localPeek(KEY_VAL).equals("near-test");
 
-        grid(2).cache(CACHE_NAME_CLOSE_NEAR).close();
+        cache2.close();
 
         CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt.set(0);
 
         //Should not produce messages to client node.
-        grid(0).cache(CACHE_NAME_CLOSE_NEAR).put(KEY_VAL, KEY_VAL + 0);
+        cache0.put(KEY_VAL, KEY_VAL + 0);
 
         U.sleep(1000);
 
+        //Ensure near cache was NOT automatically updated.
         assert CountingTxRequestsToClientNodeTcpCommunicationSpi.cnt.get() == 0;
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_NEAR).get(KEY_VAL).equals(KEY_VAL + 0);// Not affected.
-        assert grid(1).cache(CACHE_NAME_CLOSE_NEAR).get(KEY_VAL).equals(KEY_VAL + 0);// Not affected.
+        assert cache0.get(KEY_VAL).equals(KEY_VAL + 0);// Not affected.
+        assert cache1.get(KEY_VAL).equals(KEY_VAL + 0);// Not affected.
 
         try {
-            grid(2).cache(CACHE_NAME_CLOSE_NEAR).get(KEY_VAL);// Affected.
+            cache2.get(KEY_VAL);// Affected.
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored) {
@@ -376,31 +548,87 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
 
         //Near Creation from client node after closed.
 
-        grid(2).getOrCreateNearCache(CACHE_NAME_CLOSE_NEAR, new NearCacheConfiguration());
+        cache2 = grid(2).createNearCache(CACHE_NAME_NEAR, new NearCacheConfiguration());
 
-        grid(2).cache(CACHE_NAME_CLOSE_NEAR).put(KEY_VAL, KEY_VAL);
-        grid(0).cache(CACHE_NAME_CLOSE_NEAR).put(KEY_VAL, KEY_VAL + "recreated");
+        //Subscribing to events.
+        cache2.put(KEY_VAL, KEY_VAL);
+
+        assert cache2.localPeek(KEY_VAL).equals(KEY_VAL);
+
+        cache0.put(KEY_VAL, KEY_VAL + "recreated");
+
+        assert cache0.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert cache1.get(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert cache2.localPeek(KEY_VAL).equals(KEY_VAL + "recreated");
+    }
+
+    /**
+     * Test Near close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testNearCloseWithTry() throws Exception {
+        String curVal = null;
+
+        grid(0).getOrCreateCache(getNearConfig());
+
+        for (int i = 0; i < 3; i++) {
+            try (IgniteCache<String, String> cache2 = grid(2).getOrCreateNearCache(CACHE_NAME_NEAR, new NearCacheConfiguration())) {
+                IgniteCache<String, String> cache0 = grid(0).cache(CACHE_NAME_NEAR);
+                IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_NEAR);
+
+                assert cache2.localPeek(KEY_VAL) == null;
+
+                assert cache0.get(KEY_VAL) == null || cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL) == null || cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL) == null || cache2.get(KEY_VAL).equals(curVal);
+
+                curVal = KEY_VAL + curVal;
+
+                cache2.put(KEY_VAL, curVal);
+
+                assert cache2.localPeek(KEY_VAL).equals(curVal);
+
+                assert cache0.get(KEY_VAL).equals(curVal);
+                assert cache1.get(KEY_VAL).equals(curVal);
+                assert cache2.get(KEY_VAL).equals(curVal);
+            }
+        }
+    }
+
+    /**
+     * Test Local close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testLocalClose() throws Exception {
+        grid(0).getOrCreateCache(getLocalConfig());
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_NEAR).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(1).cache(CACHE_NAME_CLOSE_NEAR).get(KEY_VAL).equals(KEY_VAL + "recreated");
-        assert grid(2).cache(CACHE_NAME_CLOSE_NEAR).localPeek(KEY_VAL).equals(KEY_VAL + "recreated");
+        assert grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL) == null;
+        assert grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL) == null;
+
+        grid(0).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + 0);
+        grid(1).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + 1);
+
+        assert grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + 0);
+        assert grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + 1);
 
         //Local close. Same as Local destroy.
 
-        grid(1).cache(CACHE_NAME_CLOSE_LOC).close();
+        grid(1).cache(CACHE_NAME_LOC).close();
 
         try {
-            grid(0).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL);
+            grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL);
             assert false;
         }
         catch (IllegalArgumentException | IllegalStateException ignored0) {
             try {
-                grid(1).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL);
+                grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL);
                 assert false;
             }
             catch (IllegalArgumentException | IllegalStateException ignored1) {
                 try {
-                    grid(2).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL);
+                    grid(2).cache(CACHE_NAME_LOC).get(KEY_VAL);
                     assert false;
                 }
                 catch (IllegalArgumentException | IllegalStateException ignored2) {
@@ -411,15 +639,52 @@ public class CacheStopAndDestroySelfTest extends GridCommonAbstractTest {
 
         //Local creation after closed.
 
-        grid(0).getOrCreateCache(cCfgCLoc);
+        grid(0).getOrCreateCache(getLocalConfig());
+
+        grid(0).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + "recreated0");
+        grid(1).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + "recreated1");
+        grid(2).cache(CACHE_NAME_LOC).put(KEY_VAL, KEY_VAL + "recreated2");
 
-        grid(0).cache(CACHE_NAME_CLOSE_LOC).put(KEY_VAL, KEY_VAL + "recreated0");
-        grid(1).cache(CACHE_NAME_CLOSE_LOC).put(KEY_VAL, KEY_VAL + "recreated1");
-        grid(2).cache(CACHE_NAME_CLOSE_LOC).put(KEY_VAL, KEY_VAL + "recreated2");
+        assert grid(0).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated0");
+        assert grid(1).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated1");
+        assert grid(2).cache(CACHE_NAME_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated2");
+    }
+
+    /**
+     * Test Local close.
+     *
+     * @throws Exception If failed.
+     */
+    public void testLocalCloseWithTry() throws Exception {
+        String curVal = null;
 
-        assert grid(0).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated0");
-        assert grid(1).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated1");
-        assert grid(2).cache(CACHE_NAME_CLOSE_LOC).get(KEY_VAL).equals(KEY_VAL + "recreated2");
+        for (int i = 0; i < 3; i++) {
+            try (IgniteCache<String, String> cache2 = grid(2).getOrCreateCache(getLocalConfig())) {
+                IgniteCache<String, String> cache0 = grid(0).cache(CACHE_NAME_LOC);
+                IgniteCache<String, String> cache1 = grid(1).cache(CACHE_NAME_LOC);
+
+                assert cache0.get(KEY_VAL) == null;
+                assert cache1.get(KEY_VAL) == null;
+                assert cache2.get(KEY_VAL) == null;
+
+                curVal = KEY_VAL + curVal;
+
+                cache0.put(KEY_VAL, curVal + 1);
+                cache1.put(KEY_VAL, curVal + 2);
+                cache2.put(KEY_VAL, curVal + 3);
+
+                assert cache0.get(KEY_VAL).equals(curVal + 1);
+                assert cache1.get(KEY_VAL).equals(curVal + 2);
+                assert cache2.get(KEY_VAL).equals(curVal + 3);
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        startGridsMultiThreaded(gridCount());
     }
 
     /** {@inheritDoc} */