You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2018/08/29 16:50:45 UTC

[05/50] [abbrv] ignite git commit: IGNITE-9188 Fixed unvalid partition eviction if rebalance was cancelled by a topology event - Fixes #4578.

IGNITE-9188 Fixed unvalid partition eviction if rebalance was cancelled by a topology event - Fixes #4578.


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

Branch: refs/heads/ignite-9273
Commit: aa112a3255e5bcdc652ff2ca42e03deffb765dff
Parents: dde936a
Author: Aleksei Scherbakov <al...@gmail.com>
Authored: Wed Aug 22 17:33:39 2018 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Aug 22 17:35:22 2018 +0300

----------------------------------------------------------------------
 .../cache/CacheAffinitySharedManager.java       |  17 +-
 .../GridCachePartitionExchangeManager.java      |   2 +-
 .../GridDhtPartitionsExchangeFuture.java        |   5 +-
 .../CacheDataLossOnPartitionMoveTest.java       | 296 +++++++++++++++++++
 .../CacheRentingStateRepairTest.java            |   5 -
 .../junits/common/GridCommonAbstractTest.java   |  20 ++
 .../testsuites/IgniteCacheTestSuite7.java       |   2 +
 7 files changed, 333 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/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 41f7c63..0b448e1 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
@@ -2250,10 +2250,19 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                     if (!owners.isEmpty() && !owners.contains(curPrimary))
                         curPrimary = owners.get(0);
 
-                    if (curPrimary != null && newPrimary != null && !curPrimary.equals(newPrimary)) {
-                        if (aliveNodes.contains(curPrimary)) {
-                            GridDhtPartitionState state = top.partitionState(newPrimary.id(), p);
+                    // If new assignment is empty preserve current ownership for alive nodes.
+                    if (curPrimary != null && newPrimary == null) {
+                        newNodes0 = new ArrayList<>(curNodes.size());
+
+                        for (ClusterNode node : curNodes) {
+                            if (aliveNodes.contains(node))
+                                newNodes0.add(node);
+                        }
+                    }
+                    else if (curPrimary != null && !curPrimary.equals(newPrimary)) {
+                        GridDhtPartitionState state = top.partitionState(newPrimary.id(), p);
 
+                        if (aliveNodes.contains(curPrimary)) {
                             if (state != GridDhtPartitionState.OWNING) {
                                 newNodes0 = latePrimaryAssignment(grpHolder.affinity(),
                                     p,
@@ -2263,8 +2272,6 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                             }
                         }
                         else {
-                            GridDhtPartitionState state = top.partitionState(newPrimary.id(), p);
-
                             if (state != GridDhtPartitionState.OWNING) {
                                 for (int i = 1; i < curNodes.size(); i++) {
                                     ClusterNode curNode = curNodes.get(i);

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/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 d5eeaeb..9d88152 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
@@ -310,7 +310,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
      * @param cache Discovery data cache.
      */
     private void processEventInactive(DiscoveryEvent evt, DiscoCache cache) {
-        // Clean local join caches context.
+        // Clear local join caches context.
         cctx.cache().localJoinCachesContext();
 
         if (log.isDebugEnabled())

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/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 fbd3264..516dfb9 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
@@ -505,7 +505,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
         assert exchId.equals(this.exchId);
 
         this.exchId.discoveryEvent(discoEvt);
-        this.firstDiscoEvt= discoEvt;
+        this.firstDiscoEvt = discoEvt;
         this.firstEvtDiscoCache = discoCache;
 
         evtLatch.countDown();
@@ -3840,9 +3840,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
 
                             crd0 = crd;
 
-                            if (crd0 == null) {
+                            if (crd0 == null)
                                 finishState = new FinishState(null, initialVersion(), null);
-                            }
                         }
 
                         if (crd0 == null) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDataLossOnPartitionMoveTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDataLossOnPartitionMoveTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDataLossOnPartitionMoveTest.java
new file mode 100644
index 0000000..2a99271
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheDataLossOnPartitionMoveTest.java
@@ -0,0 +1,296 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.affinity.AffinityFunctionContext;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.WALMode;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.processors.cache.GridCacheUtils;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionDemandMessage;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.testframework.GridTestNode;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.EVICTED;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.OWNING;
+
+/**
+ *
+ */
+public class CacheDataLossOnPartitionMoveTest extends GridCommonAbstractTest {
+    /** */
+    public static final long MB = 1024 * 1024L;
+
+    /** */
+    public static final String GRP_ATTR = "grp";
+
+    /** */
+    public static final int GRIDS_CNT = 2;
+
+    /** */
+    public static final String EVEN_GRP = "event";
+
+    /** */
+    public static final String ODD_GRP = "odd";
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        cfg.setConsistentId(igniteInstanceName);
+
+        cfg.setCommunicationSpi(new TestRecordingCommunicationSpi());
+
+        cfg.setPeerClassLoadingEnabled(true);
+
+        Map<String, Object> attrs = new HashMap<>();
+
+        attrs.put(GRP_ATTR, grp(getTestIgniteInstanceIndex(igniteInstanceName)));
+
+        cfg.setUserAttributes(attrs);
+
+        DataStorageConfiguration memCfg = new DataStorageConfiguration()
+            .setDefaultDataRegionConfiguration(
+                new DataRegionConfiguration().setPersistenceEnabled(true).setInitialSize(50 * MB).setMaxSize(50 * MB))
+            .setWalMode(WALMode.LOG_ONLY);
+
+        cfg.setDataStorageConfiguration(memCfg);
+
+        cfg.setCacheConfiguration(configuration(DEFAULT_CACHE_NAME));
+
+        return cfg;
+    }
+
+    /**
+     * @param name Name.
+     */
+    private CacheConfiguration configuration(String name) {
+        return new CacheConfiguration(name).
+            setCacheMode(CacheMode.PARTITIONED).
+            setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL).
+            setBackups(1).
+            setRebalanceBatchSize(1).
+            setAffinity(new TestAffinityFunction().setPartitions(32));
+    }
+
+    /**
+     * @param idx Index.
+     */
+    private String grp(int idx) {
+        return idx < GRIDS_CNT / 2 ? EVEN_GRP : ODD_GRP;
+    }
+
+    /**
+     * @throws Exception if failed.
+     */
+    public void testDataLossOnPartitionMove() throws Exception {
+        try {
+            Ignite ignite = startGridsMultiThreaded(GRIDS_CNT / 2, false);
+
+            ignite.cluster().active(true);
+
+            List<Integer> toCp = movingKeysAfterJoin(ignite, DEFAULT_CACHE_NAME, 1,
+                node -> ((GridTestNode)node).setAttribute(GRP_ATTR, ODD_GRP));
+
+            int blockPartId = ignite.affinity(DEFAULT_CACHE_NAME).partition(toCp.get(0));
+
+            awaitPartitionMapExchange();
+
+            int c = 0;
+
+            for (int i = 0; i < 1000; i++) {
+                if (ignite.affinity(DEFAULT_CACHE_NAME).partition(i) == blockPartId) {
+                    ignite.cache(DEFAULT_CACHE_NAME).put(i, i);
+
+                    c++;
+                }
+            }
+
+            assertEquals(c, ignite.cache(DEFAULT_CACHE_NAME).size());
+
+            startGridsMultiThreaded(GRIDS_CNT / 2, GRIDS_CNT / 2);
+
+            // Prevent rebalancing to new nodes.
+            for (Ignite ig0 : G.allGrids()) {
+                TestRecordingCommunicationSpi.spi(ig0).blockMessages((node, message) -> {
+                    if (message instanceof GridDhtPartitionDemandMessage) {
+                        assertTrue(node.order() <= GRIDS_CNT / 2);
+
+                        GridDhtPartitionDemandMessage msg = (GridDhtPartitionDemandMessage)message;
+
+                        return msg.groupId() == CU.cacheId(DEFAULT_CACHE_NAME);
+                    }
+
+                    return false;
+                });
+            }
+
+            ignite.cluster().setBaselineTopology(GRIDS_CNT);
+
+            for (Ignite ig0 : G.allGrids()) {
+                if (ig0.cluster().localNode().order() <= GRIDS_CNT / 2)
+                    continue;
+
+                TestRecordingCommunicationSpi.spi(ig0).waitForBlocked();
+            }
+
+            assertEquals(c, ignite.cache(DEFAULT_CACHE_NAME).size());
+
+            int i = 0;
+
+            while(i < GRIDS_CNT / 2) {
+                stopGrid(GRIDS_CNT / 2 + i);
+
+                i++;
+            }
+
+            awaitPartitionMapExchange();
+
+            for (Ignite ig : G.allGrids()) {
+                GridDhtLocalPartition locPart = dht(ig.cache(DEFAULT_CACHE_NAME)).topology().localPartition(blockPartId);
+
+                assertNotNull(locPart);
+
+                assertEquals("Unexpected state", OWNING, locPart.state());
+            }
+
+            startGridsMultiThreaded(GRIDS_CNT / 2, GRIDS_CNT / 2);
+
+            awaitPartitionMapExchange(true, true, null);
+
+            for (Ignite ig : G.allGrids()) {
+                GridDhtLocalPartition locPart = dht(ig.cache(DEFAULT_CACHE_NAME)).topology().localPartition(blockPartId);
+
+                assertNotNull(locPart);
+
+                switch ((String)ig.cluster().localNode().attribute(GRP_ATTR)) {
+                    case EVEN_GRP:
+                        assertEquals("Unexpected state", EVICTED, locPart.state());
+
+                        break;
+
+                    case ODD_GRP:
+                        assertEquals("Unexpected state", OWNING, locPart.state());
+
+                        break;
+
+                    default:
+                        fail();
+                }
+            }
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        cleanPersistenceDir();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        cleanPersistenceDir();
+    }
+
+    /** */
+    public static class TestAffinityFunction extends RendezvousAffinityFunction {
+        /** */
+        public TestAffinityFunction() {
+        }
+
+        /** */
+        public TestAffinityFunction(boolean exclNeighbors) {
+            super(exclNeighbors);
+        }
+
+        /** */
+        public TestAffinityFunction(boolean exclNeighbors, int parts) {
+            super(exclNeighbors, parts);
+        }
+
+        /** */
+        public TestAffinityFunction(int parts,
+            @Nullable IgniteBiPredicate<ClusterNode, ClusterNode> backupFilter) {
+            super(parts, backupFilter);
+        }
+
+        /** {@inheritDoc} */
+        @Override public List<List<ClusterNode>> assignPartitions(AffinityFunctionContext affCtx) {
+            int parts = partitions();
+
+            List<List<ClusterNode>> assignments = new ArrayList<>(parts);
+
+            Map<UUID, Collection<ClusterNode>> neighborhoodCache = isExcludeNeighbors() ?
+                GridCacheUtils.neighbors(affCtx.currentTopologySnapshot()) : null;
+
+            List<ClusterNode> nodes = affCtx.currentTopologySnapshot();
+
+            Map<Object, List<ClusterNode>> nodesByGrp = U.newHashMap(2);
+
+            for (ClusterNode node : nodes) {
+                Object grp = node.attribute(GRP_ATTR);
+
+                List<ClusterNode> grpNodes = nodesByGrp.get(grp);
+
+                if (grpNodes == null)
+                    nodesByGrp.put(grp, (grpNodes = new ArrayList<>()));
+
+                grpNodes.add(node);
+            }
+
+            boolean split = nodesByGrp.size() == 2;
+
+            for (int i = 0; i < parts; i++) {
+                List<ClusterNode> partAssignment = assignPartition(i, split ?
+                        nodesByGrp.get(i % 2 == 0 ? EVEN_GRP : ODD_GRP) : nodes,
+                    affCtx.backups(), neighborhoodCache);
+
+                assignments.add(partAssignment);
+            }
+
+            return assignments;
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return Integer.MAX_VALUE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheRentingStateRepairTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheRentingStateRepairTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheRentingStateRepairTest.java
index dd117cd..83a590a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheRentingStateRepairTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheRentingStateRepairTest.java
@@ -31,7 +31,6 @@ import org.apache.ignite.internal.TestRecordingCommunicationSpi;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
@@ -181,14 +180,10 @@ public class CacheRentingStateRepairTest extends GridCommonAbstractTest {
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
         cleanPersistenceDir();
-
-        U.IGNITE_TEST_FEATURES_ENABLED = true;
     }
 
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
         cleanPersistenceDir();
-
-        U.IGNITE_TEST_FEATURES_ENABLED = false;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index b373be9..8591f0c 100755
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -94,6 +94,7 @@ import org.apache.ignite.internal.processors.cache.verify.IdleVerifyResultV2;
 import org.apache.ignite.internal.processors.cache.verify.PartitionHashRecord;
 import org.apache.ignite.internal.processors.cache.verify.PartitionKey;
 import org.apache.ignite.internal.processors.cache.verify.VerifyBackupPartitionsTask;
+import org.apache.ignite.internal.util.lang.GridAbsClosure;
 import org.apache.ignite.internal.util.lang.GridAbsPredicate;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.G;
@@ -109,6 +110,7 @@ import org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskArg;
 import org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskResult;
 import org.apache.ignite.internal.visor.verify.VisorIdleVerifyTaskV2;
 import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgniteInClosure;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.lang.IgniteRunnable;
 import org.apache.ignite.resources.IgniteInstanceResource;
@@ -1178,6 +1180,21 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
      * @return List of keys.
      */
     protected final List<Integer> movingKeysAfterJoin(Ignite ign, String cacheName, int size) {
+        return movingKeysAfterJoin(ign, cacheName, size, null);
+    }
+
+    /**
+     * Return list of keys that are primary for given node on current topology,
+     * but primary node will change after new node will be added.
+     *
+     * @param ign Ignite.
+     * @param cacheName Cache name.
+     * @param size Number of keys.
+     * @param nodeInitializer Node initializer closure.
+     * @return List of keys.
+     */
+    protected final List<Integer> movingKeysAfterJoin(Ignite ign, String cacheName, int size,
+        @Nullable IgniteInClosure<ClusterNode> nodeInitializer) {
         assertEquals("Expected consistentId is set to node name", ign.name(), ign.cluster().localNode().consistentId());
 
         ArrayList<ClusterNode> nodes = new ArrayList<>(ign.cluster().nodes());
@@ -1186,6 +1203,9 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
 
         GridTestNode fakeNode = new GridTestNode(UUID.randomUUID(), null);
 
+        if (nodeInitializer != null)
+            nodeInitializer.apply(fakeNode);
+
         fakeNode.consistentId(getTestIgniteInstanceName(nodes.size()));
 
         nodes.add(fakeNode);

http://git-wip-us.apache.org/repos/asf/ignite/blob/aa112a32/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java
index 2bd0861..3a35950 100755
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite7.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.processors.cache.WalModeChangeCoordinatorNotAf
 import org.apache.ignite.internal.processors.cache.WalModeChangeSelfTest;
 import org.apache.ignite.internal.processors.cache.distributed.Cache64kPartitionsTest;
 import org.apache.ignite.internal.processors.cache.distributed.CacheRentingStateRepairTest;
+import org.apache.ignite.internal.processors.cache.distributed.CacheDataLossOnPartitionMoveTest;
 import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingPartitionCountersTest;
 import org.apache.ignite.internal.processors.cache.distributed.rebalancing.GridCacheRebalancingWithAsyncClearingTest;
 import org.apache.ignite.internal.processors.cache.eviction.paged.PageEvictionMultinodeMixedRegionsTest;
@@ -96,6 +97,7 @@ public class IgniteCacheTestSuite7 extends TestSuite {
         suite.addTestSuite(CacheRentingStateRepairTest.class);
 
         suite.addTestSuite(TransactionIntegrityWithPrimaryIndexCorruptionTest.class);
+        suite.addTestSuite(CacheDataLossOnPartitionMoveTest.class);
 
         return suite;
     }