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 2017/05/02 10:03:26 UTC

[7/7] ignite git commit: ignite-5075 cache start

ignite-5075 cache start


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

Branch: refs/heads/ignite-5075-cacheStart
Commit: bf2360d5ffd645bbfb015123987fb949be48685d
Parents: e2cf06a
Author: sboikov <sb...@gridgain.com>
Authored: Tue May 2 10:37:40 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue May 2 13:00:05 2017 +0300

----------------------------------------------------------------------
 .../cache/CacheAffinitySharedManager.java       | 45 +++++----
 .../CacheClientReconnectDiscoveryData.java      | 34 ++++++-
 .../internal/processors/cache/CacheData.java    | 19 +++-
 .../cache/CacheJoinNodeDiscoveryData.java       | 39 +++++++-
 .../cache/CacheNodeCommonDiscoveryData.java     | 24 ++++-
 .../processors/cache/ClusterCachesInfo.java     | 13 ++-
 .../cache/DynamicCacheChangeBatch.java          |  4 +-
 .../cache/DynamicCacheChangeRequest.java        | 11 +++
 .../processors/cache/ExchangeActions.java       | 68 +++++++++++---
 .../processors/cache/GridCacheContext.java      | 27 +++---
 .../GridCachePartitionExchangeManager.java      | 20 ++--
 .../processors/cache/GridCacheProcessor.java    | 98 ++++++++++++--------
 .../dht/GridDhtPartitionTopologyImpl.java       | 10 +-
 .../GridDhtPartitionsExchangeFuture.java        |  4 +-
 .../cache/query/GridCacheQueryManager.java      |  3 +-
 .../ignite/spi/discovery/DiscoveryDataBag.java  | 22 ++---
 .../processors/cache/IgniteCacheStartTest.java  | 17 +++-
 .../CacheLateAffinityAssignmentTest.java        |  4 +-
 .../loadtests/hashmap/GridCacheTestContext.java |  3 +
 19 files changed, 329 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 6b99e22..48bc6da 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -319,30 +319,35 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         }
     }
 
+    /**
+     * @param exchActions Cache change requests to execte on exchange.
+     */
     private void updateCachesInfo(ExchangeActions exchActions) {
         for (DynamicCacheChangeRequest req : exchActions.stopRequests()) {
             Integer cacheId = CU.cacheId(req.cacheName());
 
             DynamicCacheDescriptor desc = registeredCaches.remove(cacheId);
 
-            assert desc != null : cacheId;
+            assert desc != null : req.cacheName();
         }
 
-        for (ExchangeActions.ActionData action : exchActions.newCachesStartRequests()) {
+        for (ExchangeActions.ActionData action : exchActions.newAndClientCachesStartRequests()) {
             DynamicCacheChangeRequest req = action.request();
 
-            Integer cacheId = CU.cacheId(req.cacheName());
+            if (!req.clientStartOnly()) {
+                Integer cacheId = CU.cacheId(req.cacheName());
 
-            DynamicCacheDescriptor desc = new DynamicCacheDescriptor(cctx.kernalContext(),
-                req.startCacheConfiguration(),
-                req.cacheType(),
-                false,
-                req.deploymentId(),
-                req.schema());
+                DynamicCacheDescriptor desc = new DynamicCacheDescriptor(cctx.kernalContext(),
+                    req.startCacheConfiguration(),
+                    req.cacheType(),
+                    false,
+                    req.deploymentId(),
+                    req.schema());
 
-            DynamicCacheDescriptor old = registeredCaches.put(cacheId, desc);
+                DynamicCacheDescriptor old = registeredCaches.put(cacheId, desc);
 
-            assert old == null : old;
+                assert old == null : old;
+            }
         }
     }
 
@@ -411,7 +416,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                     if (clientCacheStarted)
                         initAffinity(cacheCtx.affinity().affinityCache(), fut, lateAffAssign);
                     else if (!req.clientStartOnly()) {
-                        assert fut.topologyVersion().equals(cacheCtx.startTopologyVersion());
+                        assert fut.topologyVersion().equals(cacheCtx.cacheStartTopologyVersion());
 
                         GridAffinityAssignmentCache aff = cacheCtx.affinity().affinityCache();
 
@@ -600,7 +605,11 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
 
                 assert affTopVer.topologyVersion() > 0 : affTopVer;
 
-                IgniteUuid deploymentId = registeredCaches.get(aff.cacheId()).deploymentId();
+                DynamicCacheDescriptor desc = registeredCaches.get(aff.cacheId());
+
+                assert desc != null : aff.cacheName();
+
+                IgniteUuid deploymentId = desc.deploymentId();
 
                 if (!deploymentId.equals(deploymentIds.get(aff.cacheId()))) {
                     aff.clientEventTopologyChange(exchFut.discoveryEvent(), topVer);
@@ -804,12 +813,10 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
      */
     public void initStartedCaches(boolean crd,
         final GridDhtPartitionsExchangeFuture fut,
-        @Nullable Collection<DynamicCacheDescriptor> descs) throws IgniteCheckedException {
-        if (descs != null) {
-            for (DynamicCacheDescriptor desc : descs) {
-                if (!registeredCaches.containsKey(desc.cacheId()))
-                    registeredCaches.put(desc.cacheId(), desc);
-            }
+        Collection<DynamicCacheDescriptor> descs) throws IgniteCheckedException {
+        for (DynamicCacheDescriptor desc : descs) {
+            if (!registeredCaches.containsKey(desc.cacheId()))
+                registeredCaches.put(desc.cacheId(), desc);
         }
 
         if (crd && lateAffAssign) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
index b791e35..172547d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClientReconnectDiscoveryData.java
@@ -18,13 +18,14 @@
 package org.apache.ignite.internal.processors.cache;
 
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 
 import java.io.Serializable;
 import java.util.Map;
 
 /**
- *
+ * Discovery data sent from client reconnecting to cluster.
  */
 public class CacheClientReconnectDiscoveryData implements Serializable {
     /** */
@@ -60,9 +61,16 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
         /** */
         private final boolean nearCache;
 
-        /** */
+        /** Flags added for future usage. */
         private final byte flags;
 
+        /**
+         * @param ccfg Cache configuration.
+         * @param cacheType Cache type.
+         * @param deploymentId Cache deployment ID.
+         * @param nearCache Near cache flag.
+         * @param flags Flags (for future usage).
+         */
         public CacheInfo(CacheConfiguration ccfg,
             CacheType cacheType,
             IgniteUuid deploymentId,
@@ -79,20 +87,42 @@ public class CacheClientReconnectDiscoveryData implements Serializable {
             this.flags = flags;
         }
 
+        /**
+         * @return Cache configuraiton.
+         */
         CacheConfiguration config() {
             return ccfg;
         }
 
+        /**
+         * @return Cache type.
+         */
         CacheType cacheType() {
             return cacheType;
         }
 
+        /**
+         * @return Cache deployment ID.
+         */
         IgniteUuid deploymentId() {
             return deploymentId;
         }
 
+        /**
+         * @return Near cache flag.
+         */
         boolean nearCache() {
             return nearCache;
         }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(CacheInfo.class, this);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(CacheClientReconnectDiscoveryData.class, this);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
index b38e03f..43422da 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheData.java
@@ -56,6 +56,21 @@ public class CacheData implements Serializable {
     /** */
     private final boolean template;
 
+    /** Flags added for future usage. */
+    private final byte flags;
+
+    /**
+     * @param cacheCfg Cache configuration.
+     * @param cacheId Cache ID.
+     * @param cacheType Cache ID.
+     * @param startTopVer Topology version when cache was started.
+     * @param deploymentId Cache deployment ID.
+     * @param schema Query schema.
+     * @param rcvdFrom Node ID cache was started from.
+     * @param staticCfg {@code True} if cache was statically configured.
+     * @param template {@code True} if this is cache template.
+     * @param flags Flags (added for future usage).
+     */
     CacheData(CacheConfiguration cacheCfg,
         int cacheId,
         CacheType cacheType,
@@ -64,7 +79,8 @@ public class CacheData implements Serializable {
         QuerySchema schema,
         UUID rcvdFrom,
         boolean staticCfg,
-        boolean template) {
+        boolean template,
+        byte flags) {
         assert cacheCfg != null;
         assert rcvdFrom != null : cacheCfg.getName();
         assert startTopVer != null : cacheCfg.getName();
@@ -80,6 +96,7 @@ public class CacheData implements Serializable {
         this.rcvdFrom = rcvdFrom;
         this.staticCfg = staticCfg;
         this.template = template;
+        this.flags = flags;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
index e04e739..94e5736 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheJoinNodeDiscoveryData.java
@@ -20,6 +20,8 @@ package org.apache.ignite.internal.processors.cache;
 import java.io.Serializable;
 import java.util.Map;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
 
 /**
@@ -27,12 +29,15 @@ import org.apache.ignite.lang.IgniteUuid;
  */
 class CacheJoinNodeDiscoveryData implements Serializable {
     /** */
+    @GridToStringInclude
     private final Map<String, CacheInfo> caches;
 
     /** */
+    @GridToStringInclude
     private final Map<String, CacheInfo> templates;
 
     /** */
+    @GridToStringInclude
     private final IgniteUuid cacheDeploymentId;
 
     /**
@@ -49,14 +54,23 @@ class CacheJoinNodeDiscoveryData implements Serializable {
         this.templates = templates;
     }
 
+    /**
+     * @return Deployment ID assigned on joining node.
+     */
     IgniteUuid cacheDeploymentId() {
         return cacheDeploymentId;
     }
 
+    /**
+     * @return Templates configured on joining node.
+     */
     Map<String, CacheInfo> templates() {
         return templates;
     }
 
+    /**
+     * @return Caches configured on joining node.
+     */
     Map<String, CacheInfo> caches() {
         return caches;
     }
@@ -66,26 +80,49 @@ class CacheJoinNodeDiscoveryData implements Serializable {
      */
     static class CacheInfo implements Serializable {
         /** */
+        @GridToStringInclude
         private final CacheConfiguration ccfg;
 
         /** */
+        @GridToStringInclude
         private final CacheType cacheType;
 
-        /** */
+        /** Flags added for future usage. */
         private final byte flags;
 
+        /**
+         * @param ccfg Cache configuration.
+         * @param cacheType Cache type.
+         * @param flags Flags (for future usage).
+         */
         CacheInfo(CacheConfiguration ccfg, CacheType cacheType, byte flags) {
             this.ccfg = ccfg;
             this.cacheType = cacheType;
             this.flags = flags;
         }
 
+        /**
+         * @return Cache configuration.
+         */
         CacheConfiguration config() {
             return ccfg;
         }
 
+        /**
+         * @return Cache type.
+         */
         CacheType cacheType() {
             return cacheType;
         }
+
+        /** {@inheritDoc} */
+        @Override public String toString() {
+            return S.toString(CacheInfo.class, this);
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(CacheJoinNodeDiscoveryData.class, this);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
index a2a7b30..0109b3b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheNodeCommonDiscoveryData.java
@@ -20,24 +20,28 @@ package org.apache.ignite.internal.processors.cache;
 import java.io.Serializable;
 import java.util.Map;
 import java.util.UUID;
+import org.apache.ignite.internal.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
 
 /**
  * Cache information sent in discovery data to joining node.
  */
 class CacheNodeCommonDiscoveryData implements Serializable {
     /** */
+    @GridToStringInclude
     private final Map<String, CacheData> caches;
 
     /** */
+    @GridToStringInclude
     private final Map<String, CacheData> templates;
 
     /** */
     private final Map<String, Map<UUID, Boolean>> clientNodesMap;
 
     /**
-     * @param caches
-     * @param templates
-     * @param clientNodesMap
+     * @param caches Started caches.
+     * @param templates Configured templates.
+     * @param clientNodesMap Information about cache client nodes.
      */
     CacheNodeCommonDiscoveryData(Map<String, CacheData> caches,
         Map<String, CacheData> templates,
@@ -47,15 +51,29 @@ class CacheNodeCommonDiscoveryData implements Serializable {
         this.clientNodesMap = clientNodesMap;
     }
 
+    /**
+     * @return Started caches.
+     */
     Map<String, CacheData> caches() {
         return caches;
     }
 
+    /**
+     * @return Configured templates.
+     */
     Map<String, CacheData> templates() {
         return templates;
     }
 
+    /**
+     * @return Information about cache client nodes.
+     */
     Map<String, Map<UUID, Boolean>> clientNodesMap() {
         return clientNodesMap;
     }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(CacheNodeCommonDiscoveryData.class, this);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
index 6cc09a0..645881f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ClusterCachesInfo.java
@@ -378,15 +378,12 @@ class ClusterCachesInfo {
 
         List<DynamicCacheDescriptor> started = null;
 
-        if (!ctx.clientNode() && !ctx.isDaemon()) {
+        if (!ctx.isDaemon()) {
             for (DynamicCacheDescriptor desc : registeredCaches.values()) {
                 if (desc.staticallyConfigured()) {
                     assert desc.receivedFrom() != null : desc;
 
-                    IgnitePredicate<ClusterNode> filter = desc.cacheConfiguration().getNodeFilter();
-
-                    if (joinedNodeId.equals(desc.receivedFrom()) &&
-                        CU.affinityNode(ctx.discovery().localNode(), filter)) {
+                    if (joinedNodeId.equals(desc.receivedFrom())) {
                         if (started == null)
                             started = new ArrayList<>();
 
@@ -486,7 +483,8 @@ class ClusterCachesInfo {
                 desc.schema(),
                 desc.receivedFrom(),
                 desc.staticallyConfigured(),
-                false);
+                false,
+                (byte)0);
 
             caches.put(desc.cacheName(), cacheData);
         }
@@ -502,7 +500,8 @@ class ClusterCachesInfo {
                 desc.schema(),
                 desc.receivedFrom(),
                 desc.staticallyConfigured(),
-                true);
+                true,
+                (byte)0);
 
             templates.put(desc.cacheName(), cacheData);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
index e27d5af..3c65326 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeBatch.java
@@ -32,7 +32,7 @@ public class DynamicCacheChangeBatch implements DiscoveryCustomMessage {
     /** */
     private static final long serialVersionUID = 0L;
 
-    /** Custom message ID. */
+    /** Discovery custom message ID. */
     private IgniteUuid id = IgniteUuid.randomUuid();
 
     /** Change requests. */
@@ -91,7 +91,7 @@ public class DynamicCacheChangeBatch implements DiscoveryCustomMessage {
      * @param exchangeActions Cache updates to be executed on exchange.
      */
     void exchangeActions(ExchangeActions exchangeActions) {
-        assert !exchangeActions.empty() : exchangeActions;
+        assert exchangeActions != null && !exchangeActions.empty() : exchangeActions;
 
         this.exchangeActions = exchangeActions;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
index e4c95a7..8fa763c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/DynamicCacheChangeRequest.java
@@ -136,6 +136,11 @@ public class DynamicCacheChangeRequest implements Serializable {
         return req;
     }
 
+    /**
+     * @param ctx Context.
+     * @param cacheName Cache name.
+     * @return Request to close client cache.
+     */
     static DynamicCacheChangeRequest closeRequest(GridKernalContext ctx, String cacheName) {
         DynamicCacheChangeRequest req = new DynamicCacheChangeRequest(UUID.randomUUID(), cacheName, ctx.localNodeId());
 
@@ -144,6 +149,12 @@ public class DynamicCacheChangeRequest implements Serializable {
         return req;
     }
 
+    /**
+     * @param ctx Context.
+     * @param cacheName Cache name.
+     * @param destroy Destroy flag.
+     * @return Cache stop request.
+     */
     static DynamicCacheChangeRequest stopRequest(GridKernalContext ctx, String cacheName, boolean destroy) {
         DynamicCacheChangeRequest req = new DynamicCacheChangeRequest(UUID.randomUUID(), cacheName, ctx.localNodeId());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
index 6de02b8..9be4b6a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/ExchangeActions.java
@@ -31,7 +31,7 @@ import java.util.List;
 import org.jetbrains.annotations.Nullable;
 
 /**
- *
+ * Cache change requests to execute on request.
  */
 public class ExchangeActions {
     /** */
@@ -52,6 +52,9 @@ public class ExchangeActions {
     /** */
     private ClusterState newState;
 
+    /**
+     * @return {@code True} if server nodes should not participate in exchange.
+     */
     public boolean clientOnlyExchange() {
         return F.isEmpty(cachesToStart) &&
             F.isEmpty(cachesToStop) &&
@@ -99,13 +102,6 @@ public class ExchangeActions {
     }
 
     /**
-     * @return Start cache requests.
-     */
-    Collection<ActionData> newCachesStartRequests() {
-        return cachesToStart != null ? cachesToStart.values() : Collections.<ActionData>emptyList();
-    }
-
-    /**
      * @return Stop cache requests.
      */
     public List<DynamicCacheChangeRequest> stopRequests() {
@@ -132,6 +128,10 @@ public class ExchangeActions {
         completeRequestFutures(cachesToResetLostParts, ctx);
     }
 
+    /**
+     * @param map Actions map.
+     * @param ctx Context.
+     */
     private void completeRequestFutures(Map<String, ActionData> map, GridCacheSharedContext ctx) {
         if (map != null) {
             for (ActionData req : map.values())
@@ -147,7 +147,7 @@ public class ExchangeActions {
     }
 
     /**
-     * @return
+     * @return Caches to reset lost partitions for.
      */
     public Set<String> cachesToResetLostPartitions() {
         Set<String> caches = null;
@@ -157,7 +157,11 @@ public class ExchangeActions {
 
         return caches != null ? caches : Collections.<String>emptySet();
     }
-    
+
+    /**
+     * @param cacheId Cache ID.
+     * @return {@code True} if cache stop was requested.
+     */
     public boolean cacheStopped(int cacheId) {
         if (cachesToStop != null) {
             for (ActionData cache : cachesToStop.values()) {
@@ -169,6 +173,10 @@ public class ExchangeActions {
         return false;
     }
 
+    /**
+     * @param cacheId Cache ID.
+     * @return {@code True} if cache start was requested.
+     */
     public boolean cacheStarted(int cacheId) {
         if (cachesToStart != null) {
             for (ActionData cache : cachesToStart.values()) {
@@ -202,7 +210,15 @@ public class ExchangeActions {
         return newState;
     }
 
-    private Map<String, ActionData> add(Map<String, ActionData> map, DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
+    /**
+     * @param map Actions map.
+     * @param req Request.
+     * @param desc Cache descriptor.
+     * @return Actions map.
+     */
+    private Map<String, ActionData> add(Map<String, ActionData> map,
+        DynamicCacheChangeRequest req,
+        DynamicCacheDescriptor desc) {
         assert req != null;
         assert desc != null;
 
@@ -216,30 +232,50 @@ public class ExchangeActions {
         return map;
     }
 
+    /**
+     * @param req Request.
+     * @param desc Cache descriptor.
+     */
     void addCacheToStart(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
         assert req.start() : req;
 
         cachesToStart = add(cachesToStart, req, desc);
     }
 
+    /**
+     * @param req Request.
+     * @param desc Cache descriptor.
+     */
     void addClientCacheToStart(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
         assert req.start() : req;
 
         clientCachesToStart = add(clientCachesToStart, req, desc);
     }
 
+    /**
+     * @param req Request.
+     * @param desc Cache descriptor.
+     */
     void addCacheToStop(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
         assert req.stop() : req;
 
         cachesToStop = add(cachesToStop, req, desc);
     }
 
+    /**
+     * @param req Request.
+     * @param desc Cache descriptor.
+     */
     void addCacheToClose(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
         assert req.close() : req;
 
         cachesToClose = add(cachesToClose, req, desc);
     }
 
+    /**
+     * @param req Request.
+     * @param desc Cache descriptor.
+     */
     void addCacheToResetLostPartitions(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
         assert req.resetLostPartitions() : req;
 
@@ -267,6 +303,10 @@ public class ExchangeActions {
         /** */
         private DynamicCacheDescriptor desc;
 
+        /**
+         * @param req Request.
+         * @param desc Cache descriptor.
+         */
         ActionData(DynamicCacheChangeRequest req, DynamicCacheDescriptor desc) {
             assert req != null;
             assert desc != null;
@@ -275,10 +315,16 @@ public class ExchangeActions {
             this.desc = desc;
         }
 
+        /**
+         * @return Request.
+         */
         public DynamicCacheChangeRequest request() {
             return req;
         }
 
+        /**
+         * @return Cache descriptor.
+         */
         public DynamicCacheDescriptor descriptor() {
             return desc;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 72adeaf..6cb8907 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -235,7 +235,7 @@ public class GridCacheContext<K, V> implements Externalizable {
     private CountDownLatch startLatch = new CountDownLatch(1);
 
     /** Topology version when cache was started on local node. */
-    private AffinityTopologyVersion startTopVer;
+    private AffinityTopologyVersion locStartTopVer;
 
     /** Global cache start topology version. */
     private AffinityTopologyVersion cacheStartTopVer;
@@ -292,6 +292,8 @@ public class GridCacheContext<K, V> implements Externalizable {
         GridCacheSharedContext sharedCtx,
         CacheConfiguration cacheCfg,
         CacheType cacheType,
+        AffinityTopologyVersion cacheStartTopVer,
+        AffinityTopologyVersion locStartTopVer,
         boolean affNode,
         boolean updatesAllowed,
         MemoryPolicy memPlc,
@@ -319,6 +321,8 @@ public class GridCacheContext<K, V> implements Externalizable {
         assert ctx != null;
         assert sharedCtx != null;
         assert cacheCfg != null;
+        assert cacheStartTopVer != null : cacheCfg.getName();
+        assert locStartTopVer != null : cacheCfg.getName();
 
         assert evtMgr != null;
         assert storeMgr != null;
@@ -336,6 +340,8 @@ public class GridCacheContext<K, V> implements Externalizable {
         this.sharedCtx = sharedCtx;
         this.cacheCfg = cacheCfg;
         this.cacheType = cacheType;
+        this.locStartTopVer = locStartTopVer;
+        this.cacheStartTopVer = cacheStartTopVer;
         this.affNode = affNode;
         this.updatesAllowed = updatesAllowed;
         this.depEnabled = ctx.deploy().enabled() && !cacheObjects().isBinaryEnabled(cacheCfg);
@@ -448,24 +454,21 @@ public class GridCacheContext<K, V> implements Externalizable {
     }
 
     /**
-     * @return Start topology version.
+     * @return Topology version when cache was started on local node.
      */
     public AffinityTopologyVersion startTopologyVersion() {
-        return startTopVer;
-    }
+        assert locStartTopVer != null : name();
 
-    /**
-     * @param startTopVer Start topology version.
-     */
-    public void startTopologyVersion(AffinityTopologyVersion startTopVer) {
-        this.startTopVer = startTopVer;
+        return locStartTopVer;
     }
 
     /**
-     * @param cacheStartTopVer Global cache start topology version.
+     * @return Cache start topology version.
      */
-    public void cacheStartTopologyVersion(AffinityTopologyVersion cacheStartTopVer) {
-        this.cacheStartTopVer = cacheStartTopVer;
+    public AffinityTopologyVersion cacheStartTopologyVersion() {
+        assert cacheStartTopVer != null : name();
+
+        return cacheStartTopVer;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index c2b0e27..8f52ae6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -363,10 +363,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         assert startTime > 0;
 
         // Generate dummy discovery event for local node joining.
-        T2<DiscoveryEvent, DiscoCache> localJoin = cctx.discovery().localJoin();
+        T2<DiscoveryEvent, DiscoCache> locJoin = cctx.discovery().localJoin();
 
-        DiscoveryEvent discoEvt = localJoin.get1();
-        DiscoCache discoCache = localJoin.get2();
+        DiscoveryEvent discoEvt = locJoin.get1();
+        DiscoCache discoCache = locJoin.get2();
 
         GridDhtPartitionExchangeId exchId = initialExchangeId();
 
@@ -466,8 +466,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                 }
             }
 
+            AffinityTopologyVersion nodeStartVer = new AffinityTopologyVersion(discoEvt.topologyVersion(), 0);
+
             for (GridCacheContext cacheCtx : cctx.cacheContexts()) {
-                if (cacheCtx.startTopologyVersion() == null)
+                if (nodeStartVer.equals(cacheCtx.startTopologyVersion()))
                     cacheCtx.preloader().onInitialExchangeComplete(null);
             }
 
@@ -893,9 +895,9 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                     boolean ready;
 
                     if (exchId != null) {
-                        AffinityTopologyVersion startTopVer = cacheCtx.startTopologyVersion();
+                        AffinityTopologyVersion startTopVer = cacheCtx.cacheStartTopologyVersion();
 
-                        ready = startTopVer == null || startTopVer.compareTo(exchId.topologyVersion()) <= 0;
+                        ready = startTopVer.compareTo(exchId.topologyVersion()) <= 0;
                     }
                     else
                         ready = cacheCtx.started();
@@ -1298,10 +1300,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
 
                     GridCacheContext<K, V> cacheCtx = cctx.cacheContext(cacheId);
 
-                    if (cacheCtx != null && cacheCtx.startTopologyVersion() != null &&
-                        entry.getValue() != null &&
-                        entry.getValue().topologyVersion() != null && // Backward compatibility.
-                        cacheCtx.startTopologyVersion().compareTo(entry.getValue().topologyVersion()) > 0)
+                    if (cacheCtx != null &&
+                        cacheCtx.cacheStartTopologyVersion().compareTo(entry.getValue().topologyVersion()) > 0)
                         continue;
 
                     GridDhtPartitionTopology top = null;

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/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 0951676..b4e4b14 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
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.processors.cache;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -26,7 +25,6 @@ import java.util.Deque;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
@@ -60,13 +58,6 @@ import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.configuration.TransactionConfiguration;
 import org.apache.ignite.events.EventType;
 import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.processors.query.QuerySchema;
-import org.apache.ignite.internal.processors.query.QueryUtils;
-import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage;
-import org.apache.ignite.internal.processors.query.schema.SchemaExchangeWorkerTask;
-import org.apache.ignite.internal.processors.query.schema.SchemaNodeLeaveExchangeWorkerTask;
-import org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage;
-import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
 import org.apache.ignite.internal.IgniteComponentType;
 import org.apache.ignite.internal.IgniteInternalFuture;
@@ -109,7 +100,14 @@ import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager;
 import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
 import org.apache.ignite.internal.processors.plugin.CachePluginManager;
+import org.apache.ignite.internal.processors.query.QuerySchema;
+import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.internal.processors.query.schema.SchemaExchangeWorkerTask;
+import org.apache.ignite.internal.processors.query.schema.SchemaNodeLeaveExchangeWorkerTask;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaAbstractDiscoveryMessage;
+import org.apache.ignite.internal.processors.query.schema.message.SchemaProposeDiscoveryMessage;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutObject;
+import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.util.F0;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -842,7 +840,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
         ctx.service().onUtilityCacheStarted();
 
-        AffinityTopologyVersion startTopVer = new AffinityTopologyVersion(locNode.order(), 0);
+        AffinityTopologyVersion startTopVer =
+            new AffinityTopologyVersion(ctx.discovery().localJoinEvent().topologyVersion(), 0);
 
         for (GridCacheAdapter cache : caches.values()) {
             CacheConfiguration cfg = cache.configuration();
@@ -1336,6 +1335,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
     private GridCacheContext createCache(CacheConfiguration<?, ?> cfg,
         @Nullable CachePluginManager pluginMgr,
         CacheType cacheType,
+        AffinityTopologyVersion cacheStartTopVer,
+        AffinityTopologyVersion locStartTopVer,
         CacheObjectContext cacheObjCtx,
         boolean updatesAllowed)
         throws IgniteCheckedException {
@@ -1410,6 +1411,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             sharedCtx,
             cfg,
             cacheType,
+            cacheStartTopVer,
+            locStartTopVer,
             affNode,
             updatesAllowed,
             memPlc,
@@ -1541,6 +1544,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
                 sharedCtx,
                 cfg,
                 cacheType,
+                cacheStartTopVer,
+                locStartTopVer,
                 affNode,
                 true,
                 memPlc,
@@ -1733,23 +1738,34 @@ public class GridCacheProcessor extends GridProcessorAdapter {
     /**
      * @param exchTopVer Current exchange version.
      * @throws IgniteCheckedException If failed.
+     * @return Collection of started caches.
      */
-    public void startCachesOnLocalJoin(AffinityTopologyVersion exchTopVer) throws IgniteCheckedException {
+    public List<DynamicCacheDescriptor> startCachesOnLocalJoin(AffinityTopologyVersion exchTopVer) throws IgniteCheckedException {
         List<T2<DynamicCacheDescriptor, NearCacheConfiguration>> caches = cachesInfo.cachesToStartOnLocalJoin();
 
-        for (T2<DynamicCacheDescriptor, NearCacheConfiguration> t : caches) {
-            DynamicCacheDescriptor desc = t.get1();
-
-            prepareCacheStart(
-                desc.cacheConfiguration(),
-                t.get2(),
-                desc.cacheType(),
-                desc.deploymentId(),
-                desc.startTopologyVersion(),
-                exchTopVer,
-                desc.schema()
-            );
+        if (!F.isEmpty(caches)) {
+            List<DynamicCacheDescriptor> started = new ArrayList<>(caches.size());
+
+            for (T2<DynamicCacheDescriptor, NearCacheConfiguration> t : caches) {
+                DynamicCacheDescriptor desc = t.get1();
+
+                prepareCacheStart(
+                    desc.cacheConfiguration(),
+                    t.get2(),
+                    desc.cacheType(),
+                    desc.deploymentId(),
+                    desc.startTopologyVersion(),
+                    exchTopVer,
+                    desc.schema()
+                );
+
+                started.add(desc);
+            }
+
+            return started;
         }
+        else
+            return Collections.emptyList();
     }
 
     /**
@@ -1766,19 +1782,23 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
         if (started != null) {
             for (DynamicCacheDescriptor desc : started) {
-                prepareCacheStart(
-                    desc.cacheConfiguration(),
-                    null,
-                    desc.cacheType(),
-                    desc.deploymentId(),
-                    desc.startTopologyVersion(),
-                    exchTopVer,
-                    desc.schema()
-                );
+                IgnitePredicate<ClusterNode> filter = desc.cacheConfiguration().getNodeFilter();
+
+                if (CU.affinityNode(ctx.discovery().localNode(), filter)) {
+                    prepareCacheStart(
+                        desc.cacheConfiguration(),
+                        null,
+                        desc.cacheType(),
+                        desc.deploymentId(),
+                        desc.startTopologyVersion(),
+                        exchTopVer,
+                        desc.schema()
+                    );
+                }
             }
         }
 
-        return started;
+        return started != null ? started : Collections.<DynamicCacheDescriptor>emptyList();
     }
 
     /**
@@ -1809,11 +1829,13 @@ public class GridCacheProcessor extends GridProcessorAdapter {
 
         CacheObjectContext cacheObjCtx = ctx.cacheObjects().contextForCache(ccfg);
 
-        GridCacheContext cacheCtx = createCache(ccfg, null, cacheType, cacheObjCtx, true);
-
-        cacheCtx.startTopologyVersion(exchTopVer);
-
-        cacheCtx.cacheStartTopologyVersion(cacheStartTopVer);
+        GridCacheContext cacheCtx = createCache(ccfg,
+            null,
+            cacheType,
+            cacheStartTopVer,
+            exchTopVer,
+            cacheObjCtx,
+            true);
 
         cacheCtx.dynamicDeploymentId(deploymentId);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 38cbb8c..5b3dfc6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -393,7 +393,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
         int num = cctx.affinity().partitions();
 
         if (cctx.rebalanceEnabled()) {
-            boolean added = exchFut.isCacheAdded(cctx.cacheId(), exchId.topologyVersion());
+            boolean added = exchId.topologyVersion().equals(cctx.cacheStartTopologyVersion());
 
             boolean first = (loc.equals(oldest) && loc.id().equals(exchId.nodeId()) && exchId.isJoined()) || added;
 
@@ -1156,10 +1156,8 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                     // If for some nodes current partition has a newer map,
                     // then we keep the newer value.
                     if (newPart != null &&
-                        (newPart.updateSequence() < part.updateSequence() || (
-                            cctx.startTopologyVersion() != null &&
-                                newPart.topologyVersion() != null && // Backward compatibility.
-                                cctx.startTopologyVersion().compareTo(newPart.topologyVersion()) > 0))
+                        (newPart.updateSequence() < part.updateSequence() ||
+                        (cctx.cacheStartTopologyVersion().compareTo(newPart.topologyVersion()) > 0))
                         ) {
                         if (log.isDebugEnabled())
                             log.debug("Overriding partition map in full update map [exchId=" + exchId + ", curPart=" +
@@ -1169,7 +1167,7 @@ class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                     }
                 }
 
-                //remove entry if node left
+                // Remove entry if node left.
                 for (Iterator<UUID> it = partMap.keySet().iterator(); it.hasNext(); ) {
                     UUID nodeId = it.next();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index 320480c..bcfd8e0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -634,8 +634,7 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
             GridDhtPartitionTopology top = cacheCtx.topology();
 
             if (crd) {
-                boolean updateTop = !cacheCtx.isLocal() &&
-                    exchId.topologyVersion().equals(cacheCtx.startTopologyVersion());
+                boolean updateTop = exchId.topologyVersion().equals(cacheCtx.startTopologyVersion());
 
                 if (updateTop && clientTop != null)
                     top.update(exchId, clientTop.partitionMap(true), clientTop.updateCounters(false));
@@ -737,7 +736,6 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
     private void clientOnlyExchange() throws IgniteCheckedException {
         clientOnlyExchange = true;
 
-        //todo checl invoke on client
         if (crd != null) {
             if (crd.isLocal()) {
                 for (GridCacheContext cacheCtx : cctx.cacheContexts()) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index 0f7b0df..fcf534c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -272,8 +272,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
 
         qryTopVer = cctx.startTopologyVersion();
 
-        if (qryTopVer == null)
-            qryTopVer = new AffinityTopologyVersion(cctx.localNode().order(), 0);
+        assert qryTopVer != null : cctx.name();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java
index 1ca4ac7..3737d69 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/DiscoveryDataBag.java
@@ -188,14 +188,15 @@ public class DiscoveryDataBag {
     }
 
     /**
-     *
+     * @return ID on joining node.
      */
     public UUID joiningNodeId() {
         return joiningNodeId;
     }
 
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
+     * @return Discovery data for given component.
      */
     public GridDiscoveryData gridDiscoveryData(int cmpId) {
         if (gridData == null)
@@ -207,7 +208,8 @@ public class DiscoveryDataBag {
     }
 
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
+     * @return Joining node discovery data.
      */
     public JoiningNodeDiscoveryData newJoinerDiscoveryData(int cmpId) {
         if (newJoinerData == null)
@@ -218,12 +220,8 @@ public class DiscoveryDataBag {
         return newJoinerData;
     }
 
-    void collectJoiningNodeData(DiscoveryDataBag dataBag) {
-
-    }
-
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
      * @param data Data.
      */
     public void addJoiningNodeData(Integer cmpId, Serializable data) {
@@ -231,7 +229,7 @@ public class DiscoveryDataBag {
     }
 
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
      * @param data Data.
      */
     public void addGridCommonData(Integer cmpId, Serializable data) {
@@ -239,7 +237,7 @@ public class DiscoveryDataBag {
     }
 
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
      * @param data Data.
      */
     public void addNodeSpecificData(Integer cmpId, Serializable data) {
@@ -250,7 +248,8 @@ public class DiscoveryDataBag {
     }
 
     /**
-     * @param cmpId component ID.
+     * @param cmpId Component ID.
+     * @return {@code True} if common data collected for given component.
      */
     public boolean commonDataCollectedFor(Integer cmpId) {
         assert cmnDataInitializedCmps != null;
@@ -299,5 +298,4 @@ public class DiscoveryDataBag {
     @Nullable public Map<Integer, Serializable> localNodeSpecificData() {
         return nodeSpecificData.get(DEFAULT_KEY);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
index da34424..21b8d0f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheStartTest.java
@@ -85,6 +85,12 @@ public class IgniteCacheStartTest extends GridCommonAbstractTest {
         checkCache(0, "c1", true);
         checkCache(1, "c1", true);
         checkCache(2, "c1", false);
+
+        ignite(2).destroyCache("c1");
+
+        checkCache(0, "c1", false);
+        checkCache(1, "c1", false);
+        checkCache(2, "c1", false);
     }
 
     /**
@@ -144,6 +150,11 @@ public class IgniteCacheStartTest extends GridCommonAbstractTest {
         checkCache(3, "c1", true);
         checkCache(4, "c1", true);
         checkCache(5, "c1", false);
+
+        ignite(5).destroyCache("c1");
+
+        for (int i = 0; i < 5; i++)
+            checkCache(i, "c1", false);
     }
 
     /**
@@ -151,11 +162,7 @@ public class IgniteCacheStartTest extends GridCommonAbstractTest {
      * @return Cache configuration.
      */
     private CacheConfiguration cacheConfiguration(String cacheName) {
-        CacheConfiguration ccfg = new CacheConfiguration();
-
-        ccfg.setName(cacheName);
-
-        return ccfg;
+        return new CacheConfiguration(cacheName);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
index fed388a..bc435e2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
@@ -2165,7 +2165,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
         Map<String, List<List<ClusterNode>>> aff = new HashMap<>();
 
         for (Ignite node : nodes) {
-            log.info("Check node: " + node.name());
+            log.info("Check affinity [node=" + node.name() + ", topVer=" + topVer + ", expIdeal=" + expIdeal + ']');
 
             IgniteKernal node0 = (IgniteKernal)node;
 
@@ -2175,7 +2175,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
                 fut.get();
 
             for (GridCacheContext cctx : node0.context().cache().context().cacheContexts()) {
-                if (cctx.startTopologyVersion() != null && cctx.startTopologyVersion().compareTo(topVer) > 0)
+                if (cctx.startTopologyVersion().compareTo(topVer) > 0)
                     continue;
 
                 List<List<ClusterNode>> aff1 = aff.get(cctx.name());

http://git-wip-us.apache.org/repos/asf/ignite/blob/bf2360d5/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
index 0f4aa87..6149586 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/hashmap/GridCacheTestContext.java
@@ -20,6 +20,7 @@ package org.apache.ignite.loadtests.hashmap;
 import java.util.IdentityHashMap;
 import org.apache.ignite.cache.store.CacheStore;
 import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheAffinitySharedManager;
 import org.apache.ignite.internal.processors.cache.CacheOsConflictResolutionManager;
 import org.apache.ignite.internal.processors.cache.CacheType;
@@ -78,6 +79,8 @@ public class GridCacheTestContext<K, V> extends GridCacheContext<K, V> {
             ),
             defaultCacheConfiguration(),
             CacheType.USER,
+            AffinityTopologyVersion.ZERO,
+            AffinityTopologyVersion.ZERO,
             true,
             true,
             null,