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/11 14:42:35 UTC

[6/7] ignite git commit: Merge remote-tracking branch 'remotes/origin/ignite-5075-cacheStart' into ignite-5075

Merge remote-tracking branch 'remotes/origin/ignite-5075-cacheStart' into ignite-5075

# Conflicts:
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentRequest.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAffinityAssignmentResponse.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
#	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java


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

Branch: refs/heads/ignite-5075
Commit: 4afeba7573b7ad58b0f25a1b7c6511232c30295e
Parents: b5c8670
Author: sboikov <sb...@gridgain.com>
Authored: Thu May 11 17:09:49 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu May 11 17:19:24 2017 +0300

----------------------------------------------------------------------
 .../cache/CacheAffinitySharedManager.java       | 34 ++++----------------
 .../processors/cache/CacheGroupData.java        | 23 ++++++-------
 .../processors/cache/CacheGroupDescriptor.java  | 23 ++++++-------
 .../cache/CacheGroupInfrastructure.java         | 13 ++------
 .../processors/cache/ClusterCachesInfo.java     | 18 +++++------
 .../processors/cache/ExchangeActions.java       | 11 +++++++
 .../processors/cache/GridCacheIoManager.java    |  3 +-
 .../processors/cache/GridCacheProcessor.java    |  1 -
 .../dht/GridDhtAssignmentFetchFuture.java       |  6 ++--
 .../dht/GridDhtPartitionTopologyImpl.java       |  2 +-
 .../GridDhtPartitionsExchangeFuture.java        | 22 +++++++------
 .../dht/preloader/GridDhtPreloader.java         |  3 --
 .../processors/cache/IgniteCacheGroupsTest.java |  2 ++
 13 files changed, 69 insertions(+), 92 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 0443ba4..dc31ae9 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
@@ -118,16 +118,6 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
     }
 
     /**
-     * @param cacheId Cache ID.
-     * @return Cache start topology version.
-     */
-    public AffinityTopologyVersion localStartVersion(int cacheId) {
-        DynamicCacheDescriptor desc = registeredCaches.get(cacheId);
-
-        return desc != null ? desc.localStartVersion() : null;
-    }
-
-    /**
      * Callback invoked from discovery thread when discovery message is received.
      *
      * @param type Event type.
@@ -403,21 +393,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         }
 
         for (CacheGroupInfrastructure grp : cctx.cache().cacheGroups()) {
-            if (grp.affinity().lastVersion().equals(AffinityTopologyVersion.NONE)) {
-                if (grp.groupStartVersion().equals(fut.topologyVersion())) {
-                    GridAffinityAssignmentCache aff = grp.affinity();
-
-                    List<List<ClusterNode>> assignment = aff.calculate(fut.topologyVersion(),
-                        fut.discoveryEvent(), fut.discoCache());
-
-                    aff.initialize(fut.topologyVersion(), assignment);
-                }
-                else {
-                    assert grp.localStartVersion().equals(fut.topologyVersion());
-
-                    initAffinity(registeredGrps.get(grp.groupId()), grp.affinity(), fut, lateAffAssign);
-                }
-            }
+            if (grp.affinity().lastVersion().equals(AffinityTopologyVersion.NONE))
+                initAffinity(registeredGrps.get(grp.groupId()), grp.affinity(), fut, lateAffAssign);
         }
 
         if (crd) {
@@ -881,7 +858,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
 
         assert grpDesc != null : aff.groupName();
 
-        return grpDesc.startTopologyVersion().equals(fut.topologyVersion()) ||
+        return fut.cacheGroupStarting(aff.groupId()) ||
+            cctx.localNodeId().equals(grpDesc.receivedFrom()) ||
             !fut.exchangeId().nodeId().equals(cctx.localNodeId()) ||
             (affNodes.size() == 1 && affNodes.contains(cctx.localNode()));
     }
@@ -974,7 +952,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
             if (grp.isLocal())
                 continue;
 
-            if (grp.groupStartVersion().equals(fut.topologyVersion())) {
+            if (canCalculateAffinity(grp.affinity(), fut)) {
                 List<List<ClusterNode>> assignment = grp.affinity().calculate(fut.topologyVersion(),
                     fut.discoveryEvent(),
                     fut.discoCache());
@@ -998,7 +976,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         for (int i = 0; i < fetchFuts.size(); i++) {
             GridDhtAssignmentFetchFuture fetchFut = fetchFuts.get(i);
 
-            Integer grpId = fetchFut.cacheId();
+            Integer grpId = fetchFut.groupId();
 
             fetchAffinity(fut, cctx.cache().cacheGroup(grpId).affinity(), fetchFut);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
index 0123262..ea2c256 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupData.java
@@ -19,9 +19,8 @@ package org.apache.ignite.internal.processors.cache;
 
 import java.io.Serializable;
 import java.util.Map;
-import java.util.Set;
+import java.util.UUID;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
@@ -40,13 +39,13 @@ public class CacheGroupData implements Serializable {
     private final int grpId;
 
     /** */
-    private final IgniteUuid deploymentId;
+    private final UUID rcvdFrom;
 
     /** */
-    private final CacheConfiguration cacheCfg;
+    private final IgniteUuid deploymentId;
 
     /** */
-    private final AffinityTopologyVersion startTopVer;
+    private final CacheConfiguration cacheCfg;
 
     /** */
     @GridToStringInclude
@@ -55,28 +54,30 @@ public class CacheGroupData implements Serializable {
     /**
      * @param cacheCfg Cache configuration.
      * @param grpId
-     * @param startTopVer
      */
     public CacheGroupData(CacheConfiguration cacheCfg,
         String grpName,
         int grpId,
+        UUID rcvdFrom,
         IgniteUuid deploymentId,
-        AffinityTopologyVersion startTopVer,
         Map<String, Integer> caches) {
         assert cacheCfg != null;
         assert grpName != null;
         assert grpId != 0;
         assert deploymentId != null;
-        assert startTopVer != null;
 
         this.cacheCfg = cacheCfg;
         this.grpName = grpName;
         this.grpId = grpId;
+        this.rcvdFrom = rcvdFrom;
         this.deploymentId = deploymentId;
-        this.startTopVer = startTopVer;
         this.caches = caches;
     }
 
+    public UUID receivedFrom() {
+        return rcvdFrom;
+    }
+
     public String groupName() {
         return grpName;
     }
@@ -93,10 +94,6 @@ public class CacheGroupData implements Serializable {
         return cacheCfg;
     }
 
-    public AffinityTopologyVersion startTopologyVersion() {
-        return startTopVer;
-    }
-
     Map<String, Integer> caches() {
         return caches;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
index da55871..c418002 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupDescriptor.java
@@ -19,13 +19,11 @@ package org.apache.ignite.internal.processors.cache;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
+import java.util.UUID;
 import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.lang.IgniteUuid;
-import org.jetbrains.annotations.Nullable;
 
 /**
  *
@@ -44,31 +42,34 @@ public class CacheGroupDescriptor {
     private final CacheConfiguration cacheCfg;
 
     /** */
-    private final AffinityTopologyVersion startTopVer;
-
-    /** */
     @GridToStringInclude
     private Map<String, Integer> caches;
 
+    /** */
+    private final UUID rcvdFrom;
+
     CacheGroupDescriptor(String grpName,
         int grpId,
+        UUID rcvdFrom,
         IgniteUuid deploymentId,
         CacheConfiguration cacheCfg,
-        AffinityTopologyVersion startTopVer,
         Map<String, Integer> caches) {
         assert cacheCfg != null;
         assert grpName != null;
         assert grpId != 0;
-        assert startTopVer != null;
 
         this.grpName = grpName;
         this.grpId = grpId;
+        this.rcvdFrom = rcvdFrom;
         this.deploymentId = deploymentId;
         this.cacheCfg = cacheCfg;
-        this.startTopVer = startTopVer;
         this.caches = caches;
     }
 
+    public UUID receivedFrom() {
+        return rcvdFrom;
+    }
+
     public IgniteUuid deploymentId() {
         return deploymentId;
     }
@@ -113,10 +114,6 @@ public class CacheGroupDescriptor {
         return cacheCfg;
     }
 
-    public AffinityTopologyVersion startTopologyVersion() {
-        return startTopVer;
-    }
-
     Map<String, Integer> caches() {
         return caches;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupInfrastructure.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupInfrastructure.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupInfrastructure.java
index e1e3e93..2a4e918 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupInfrastructure.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheGroupInfrastructure.java
@@ -70,9 +70,6 @@ public class CacheGroupInfrastructure {
     private GridDhtPartitionTopologyImpl top;
 
     /** */
-    private final AffinityTopologyVersion grpStartVer;
-
-    /** */
     private final AffinityTopologyVersion locStartVer;
 
     /** */
@@ -122,7 +119,6 @@ public class CacheGroupInfrastructure {
         CacheObjectContext cacheObjCtx,
         FreeList freeList,
         ReuseList reuseList,
-        AffinityTopologyVersion grpStartVer,
         AffinityTopologyVersion locStartVer) {
         assert grpId != 0 : "Invalid group ID [cache=" + ccfg.getName() + ", grpName=" + ccfg.getGroupName() + ']';
         assert ccfg != null;
@@ -136,7 +132,6 @@ public class CacheGroupInfrastructure {
         this.cacheObjCtx = cacheObjCtx;
         this.freeList = freeList;
         this.reuseList = reuseList;
-        this.grpStartVer = grpStartVer;
         this.locStartVer = locStartVer;
 
         ioPlc = cacheType.ioPolicy();
@@ -257,10 +252,6 @@ public class CacheGroupInfrastructure {
         return false;
     }
 
-    public AffinityTopologyVersion groupStartVersion() {
-        return grpStartVer;
-    }
-
     public AffinityTopologyVersion localStartVersion() {
         return locStartVer;
     }
@@ -383,7 +374,9 @@ public class CacheGroupInfrastructure {
 
         AffinityAssignment assignment = aff.cachedAffinity(topVer);
 
-        GridDhtAffinityAssignmentResponse res = new GridDhtAffinityAssignmentResponse(grpId,
+        GridDhtAffinityAssignmentResponse res = new GridDhtAffinityAssignmentResponse(
+            req.futureId(),
+            grpId,
             topVer,
             assignment.assignment());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 7800a45..8b23e5b 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
@@ -290,8 +290,8 @@ class ClusterCachesInfo {
                         CacheGroupDescriptor grpDesc = registerCacheGroup(exchangeActions,
                             ccfg,
                             cacheId,
-                            req.deploymentId(),
-                            topVer.nextMinorVersion());
+                            req.initiatingNodeId(),
+                            req.deploymentId());
 
                         DynamicCacheDescriptor startDesc = new DynamicCacheDescriptor(ctx,
                             ccfg,
@@ -651,8 +651,8 @@ class ClusterCachesInfo {
             CacheGroupData grpData = new CacheGroupData(grpDesc.config(),
                 grpDesc.groupName(),
                 grpDesc.groupId(),
+                grpDesc.receivedFrom(),
                 grpDesc.deploymentId(),
-                grpDesc.startTopologyVersion(),
                 grpDesc.caches());
 
             cacheGrps.put(grpDesc.groupName(), grpData);
@@ -699,9 +699,9 @@ class ClusterCachesInfo {
         for (CacheGroupData grpData : cachesData.cacheGroups().values()) {
             CacheGroupDescriptor grpDesc = new CacheGroupDescriptor(grpData.groupName(),
                 grpData.groupId(),
+                grpData.receivedFrom(),
                 grpData.deploymentId(),
                 grpData.config(),
-                grpData.startTopologyVersion(),
                 grpData.caches());
 
             CacheGroupDescriptor old = registeredCacheGrps.put(grpDesc.groupName(), grpDesc);
@@ -857,8 +857,8 @@ class ClusterCachesInfo {
                 CacheGroupDescriptor grpDesc = registerCacheGroup(null,
                     cfg,
                     cacheId,
-                    joinData.cacheDeploymentId(),
-                    topVer);
+                    nodeId,
+                    joinData.cacheDeploymentId());
 
                 DynamicCacheDescriptor desc = new DynamicCacheDescriptor(ctx,
                     cfg,
@@ -897,8 +897,8 @@ class ClusterCachesInfo {
         ExchangeActions exchActions,
         CacheConfiguration startedCacheCfg,
         Integer cacheId,
-        IgniteUuid deploymentId,
-        AffinityTopologyVersion topVer) {
+        UUID rcvdFrom,
+        IgniteUuid deploymentId) {
         if (startedCacheCfg.getGroupName() != null) {
             CacheGroupDescriptor desc = registeredCacheGrps.get(startedCacheCfg.getGroupName());
 
@@ -919,9 +919,9 @@ class ClusterCachesInfo {
         CacheGroupDescriptor grpDesc = new CacheGroupDescriptor(
             grpName,
             grpId,
+            rcvdFrom,
             deploymentId,
             startedCacheCfg,
-            topVer,
             caches);
 
         CacheGroupDescriptor old = registeredCacheGrps.put(grpName, grpDesc);

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 8c9833f..977f544 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
@@ -296,6 +296,17 @@ public class ExchangeActions {
         return cacheGrpsToStart != null ? cacheGrpsToStart : Collections.<CacheGroupDescriptor>emptyList();
     }
 
+    public boolean cacheGroupStarting(int grpId) {
+        if (cacheGrpsToStart != null) {
+            for (CacheGroupDescriptor grpToStop : cacheGrpsToStart) {
+                if (grpToStop.groupId() == grpId)
+                    return true;
+            }
+        }
+
+        return false;
+    }
+
     void addCacheGroupToStop(CacheGroupDescriptor grpDesc) {
         if (cacheGrpsToStop == null)
             cacheGrpsToStop = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
index 02d1086..fb2ac3d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
@@ -146,7 +146,8 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
                 if (cacheMsg instanceof GridDhtAffinityAssignmentRequest) {
                     assert cacheMsg.topologyVersion() != null : cacheMsg;
 
-                    AffinityTopologyVersion waitVer = cctx.affinity().localStartVersion(cacheMsg.cacheId());
+                    // TODO IGNITE-5075.
+                    AffinityTopologyVersion waitVer = null;//cctx.affinity().localStartVersion(((GridDhtAffinityAssignmentRequest) cacheMsg).groupId());
 
                     if (waitVer == null)
                         waitVer = new AffinityTopologyVersion(cctx.localNode().order());

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 a72f21c..63b29b8 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
@@ -1922,7 +1922,6 @@ public class GridCacheProcessor extends GridProcessorAdapter {
             cacheObjCtx,
             freeList,
             reuseList,
-            desc.startTopologyVersion(),
             exchTopVer);
 
         grp.start();

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
index c008ef3..a06ff78 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtAssignmentFetchFuture.java
@@ -113,10 +113,10 @@ public class GridDhtAssignmentFetchFuture extends GridFutureAdapter<GridDhtAffin
     }
 
     /**
-     * @return Cache ID.
+     * @return Cache group ID.
      */
-    public int cacheId() {
-        return cacheId;
+    public int groupId() {
+        return grpId;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 8ea9e46..c75f05c 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
@@ -414,7 +414,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
                         boolean owned = locPart.own();
 
-                        assert owned : "Failed to own partition for oldest node [grp" + grp.name() +
+                        assert owned : "Failed to own partition for oldest node [grp=" + grp.name() +
                             ", part=" + locPart + ']';
 
                         if (log.isDebugEnabled())

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/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 c7457c3..d15f069 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
@@ -394,13 +394,16 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
         return cacheCtx != null && F.eq(cacheCtx.startTopologyVersion(), topVer);
     }
 
+    public boolean cacheGroupStarting(int grpId) {
+        return exchActions != null && exchActions.cacheGroupStarting(grpId);
+    }
+
     /**
      * @param cacheId Cache ID.
      * @return {@code True} if non-client cache was added during this exchange.
      */
     public boolean cacheStarted(int cacheId) {
         return exchActions != null && exchActions.cacheStarted(cacheId);
-
     }
 
     /**
@@ -943,20 +946,19 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
     private void warnNoAffinityNodes() {
         List<String> cachesWithoutNodes = null;
 
-        for (DynamicCacheDescriptor cacheDesc : cctx.cache().cacheDescriptors()) {
-            if (cacheDesc.startTopologyVersion().compareTo(topologyVersion()) <= 0 &&
-                discoCache.cacheGroupAffinityNodes(cacheDesc.groupDescriptor().groupId()).isEmpty()) {
+        for (GridCacheContext ctx : cctx.cacheContexts()) {
+            if (discoCache.cacheGroupAffinityNodes(ctx.groupId()).isEmpty()) {
                 if (cachesWithoutNodes == null)
                     cachesWithoutNodes = new ArrayList<>();
 
-                cachesWithoutNodes.add(cacheDesc.cacheName());
+                cachesWithoutNodes.add(ctx.name());
 
                 // Fire event even if there is no client cache started.
-                if (cctx.gridEvents().isRecordable(EventType.EVT_CACHE_NODES_LEFT)) {
+                if (ctx.gridEvents().isRecordable(EventType.EVT_CACHE_NODES_LEFT)) {
                     Event evt = new CacheEvent(
-                        cacheDesc.cacheName(),
-                        cctx.localNode(),
-                        cctx.localNode(),
+                        ctx.name(),
+                        ctx.localNode(),
+                        ctx.localNode(),
                         "All server nodes have left the cluster.",
                         EventType.EVT_CACHE_NODES_LEFT,
                         0,
@@ -973,7 +975,7 @@ public class GridDhtPartitionsExchangeFuture extends GridFutureAdapter<AffinityT
                         null
                     );
 
-                    cctx.gridEvents().record(evt);
+                    ctx.gridEvents().record(evt);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
index ec6e4af..3d62c2f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
@@ -44,8 +44,6 @@ import org.apache.ignite.internal.processors.cache.GridCacheEntryInfo;
 import org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException;
 import org.apache.ignite.internal.processors.cache.GridCachePreloaderAdapter;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentRequest;
-import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtAffinityAssignmentResponse;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtFuture;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
@@ -66,7 +64,6 @@ import org.apache.ignite.lang.IgniteBiInClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
-import org.jsr166.ConcurrentLinkedDeque8;
 
 import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_DATA_LOST;
 import static org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_UNLOADED;

http://git-wip-us.apache.org/repos/asf/ignite/blob/4afeba75/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
index ba01844..ff20803 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheGroupsTest.java
@@ -44,6 +44,8 @@ public class IgniteCacheGroupsTest extends GridCommonAbstractTest {
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
 
+        //cfg.setLateAffinityAssignment(false);
+
         return cfg;
     }