You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by gv...@apache.org on 2018/11/30 13:06:20 UTC

[2/2] ignite git commit: IGNITE-10365: MVCC: Create "Cache 6" test suite for MVCC mode. This closes #5478.

IGNITE-10365: MVCC: Create "Cache 6" test suite for MVCC mode. This closes #5478.


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

Branch: refs/heads/master
Commit: 74d342d666bbe593b98224f0dc73d94bad885a32
Parents: 73f4f91
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Fri Nov 30 16:06:03 2018 +0300
Committer: Igor Seliverstov <gv...@gmail.com>
Committed: Fri Nov 30 16:06:03 2018 +0300

----------------------------------------------------------------------
 .../CacheGetsDistributionAbstractTest.java      | 375 +++++++++++++++++++
 .../cache/CacheNoAffinityExchangeTest.java      |   8 +
 ...titionedAtomicCacheGetsDistributionTest.java |  24 +-
 ...cTxPessimisticCacheGetsDistributionTest.java |  32 ++
 ...onalOptimisticCacheGetsDistributionTest.java |  17 +-
 ...nalPessimisticCacheGetsDistributionTest.java |  24 +-
 ...plicatedAtomicCacheGetsDistributionTest.java | 329 +---------------
 ...cTxPessimisticCacheGetsDistributionTest.java |  32 ++
 ...onalOptimisticCacheGetsDistributionTest.java |   9 +-
 ...nalPessimisticCacheGetsDistributionTest.java |  24 +-
 .../distributed/CacheExchangeMergeTest.java     |   9 +-
 .../CacheTryLockMultithreadedTest.java          |   3 +
 .../distributed/IgniteCache150ClientsTest.java  |  10 +-
 .../IgniteCacheThreadLocalTxTest.java           |   4 +
 .../IgnitePessimisticTxSuspendResumeTest.java   |   5 +
 .../cache/transactions/TxLabelTest.java         |  23 +-
 .../cache/transactions/TxRollbackAsyncTest.java |  40 +-
 .../TxRollbackOnIncorrectParamsTest.java        |  17 +-
 .../transactions/TxRollbackOnTimeoutTest.java   |   9 +
 .../transactions/TxStateChangeEventTest.java    |  78 +++-
 .../testframework/MvccFeatureChecker.java       |   4 +
 .../testsuites/IgniteCacheMvccTestSuite6.java   |  94 +++++
 .../testsuites/IgniteCacheTestSuite6.java       |  83 ++--
 23 files changed, 807 insertions(+), 446 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGetsDistributionAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGetsDistributionAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGetsDistributionAbstractTest.java
new file mode 100644
index 0000000..559a719
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGetsDistributionAbstractTest.java
@@ -0,0 +1,375 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.UUID;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.TransactionConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.transactions.Transaction;
+import org.apache.ignite.transactions.TransactionConcurrency;
+import org.apache.ignite.transactions.TransactionIsolation;
+
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS;
+import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+
+/**
+ * Tests of replicated cache's 'get' requests distribution.
+ */
+public abstract class CacheGetsDistributionAbstractTest extends GridCommonAbstractTest {
+    /** Client nodes instance's name. */
+    private static final String CLIENT_NAME = "client";
+
+    /** Value prefix. */
+    private static final String VAL_PREFIX = "val";
+
+    /** */
+    private static final int PRIMARY_KEYS_NUMBER = 1_000;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        assert gridCount() >= 1 : "At least one grid must be started";
+
+        startGridsMultiThreaded(gridCount());
+
+        IgniteConfiguration clientCfg = getConfiguration(CLIENT_NAME);
+
+        clientCfg.setClientMode(true);
+
+        startGrid(clientCfg);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        super.afterTestsStopped();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        IgniteCache cache = ignite(0).cache(DEFAULT_CACHE_NAME);
+
+        if (cache != null)
+            cache.destroy();
+
+        // Setting different MAC addresses for all nodes
+        Map<UUID, String> macs = getClusterMacs();
+
+        int idx = 0;
+
+        for (Map.Entry<UUID, String> entry : macs.entrySet())
+            entry.setValue("x2-xx-xx-xx-xx-x" + idx++);
+
+        replaceMacAddresses(G.allGrids(), macs);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        TransactionConfiguration txCfg = new TransactionConfiguration()
+            .setDefaultTxIsolation(transactionIsolation())
+            .setDefaultTxConcurrency(transactionConcurrency());
+
+        cfg.setTransactionConfiguration(txCfg);
+
+        return cfg;
+    }
+
+    /**
+     * @return Grids count to start.
+     */
+    protected int gridCount() {
+        return 4;
+    }
+
+    /**
+     * @return Cache configuration.
+     */
+    protected <K, V> CacheConfiguration<K, V> cacheConfiguration() {
+        CacheConfiguration<K, V> ccfg = defaultCacheConfiguration();
+
+        ccfg.setCacheMode(cacheMode());
+        ccfg.setAtomicityMode(atomicityMode());
+        ccfg.setWriteSynchronizationMode(FULL_SYNC);
+        ccfg.setReadFromBackup(true);
+        ccfg.setStatisticsEnabled(true);
+
+        if (cacheMode() == CacheMode.PARTITIONED)
+            ccfg.setBackups(backupsCount());
+
+        return ccfg;
+    }
+
+    /**
+     * @return Cache mode.
+     */
+    protected abstract CacheMode cacheMode();
+
+    /**
+     * @return Cache atomicity mode.
+     */
+    protected abstract CacheAtomicityMode atomicityMode();
+
+    /**
+     * @return Cache transaction isolation.
+     */
+    protected TransactionIsolation transactionIsolation() {
+        return REPEATABLE_READ;
+    }
+
+    /**
+     * @return Cache transaction concurrency.
+     */
+    protected TransactionConcurrency transactionConcurrency() {
+        return PESSIMISTIC;
+    }
+
+    /**
+     * @return Backups count.
+     */
+    protected int backupsCount() {
+        return gridCount() - 1;
+    }
+
+    /**
+     * Test 'get' operations requests generator distribution.
+     *
+     * @throws Exception In case of an error.
+     * @see #runTestBalancingDistribution(boolean)
+     */
+    public void testGetRequestsGeneratorDistribution() throws Exception {
+        runTestBalancingDistribution(false);
+    }
+
+    /**
+     * Test 'getAll' operations requests generator distribution.
+     *
+     * @throws Exception In case of an error.
+     * @see #runTestBalancingDistribution(boolean)
+     */
+    public void testGetAllRequestsGeneratorDistribution() throws Exception {
+        runTestBalancingDistribution(true);
+    }
+
+    /**
+     * @param batchMode Whenever 'get' or 'getAll' operations are used in the test.
+     * @throws Exception In case of an error.
+     */
+    protected void runTestBalancingDistribution(boolean batchMode) throws Exception {
+        IgniteCache<Integer, String> cache = grid(0).createCache(cacheConfiguration());
+
+        List<Integer> keys = primaryKeys(cache, PRIMARY_KEYS_NUMBER);
+
+        for (Integer key : keys)
+            cache.put(key, VAL_PREFIX + key);
+
+        IgniteCache<Integer, String> clientCache = grid(CLIENT_NAME).cache(DEFAULT_CACHE_NAME)
+            .withAllowAtomicOpsInTx();
+
+        assertTrue(GridTestUtils.waitForCondition(
+            new GridAbsPredicate() {
+                int batchSize = 10;
+                int idx = 0;
+
+                @Override public boolean apply() {
+                    if (idx >= PRIMARY_KEYS_NUMBER)
+                        idx = 0;
+
+                    try (Transaction tx = grid(CLIENT_NAME).transactions().txStart()) {
+                        if (batchMode) {
+                            Set<Integer> keys0 = new TreeSet<>();
+
+                            for (int i = idx; i < idx + batchSize && i < PRIMARY_KEYS_NUMBER; i++)
+                                keys0.add(keys.get(i));
+
+                            idx += batchSize;
+
+                            Map<Integer, String> results = clientCache.getAll(keys0);
+
+                            for (Map.Entry<Integer, String> entry : results.entrySet())
+                                assertEquals(VAL_PREFIX + entry.getKey(), entry.getValue());
+                        }
+                        else {
+                            for (int i = idx; i < idx + gridCount() && i < PRIMARY_KEYS_NUMBER; i++) {
+                                Integer key = keys.get(i);
+
+                                assertEquals(VAL_PREFIX + key, clientCache.get(key));
+                            }
+
+                            idx += gridCount();
+                        }
+
+                        tx.commit();
+                    }
+
+                    for (int i = 0; i < gridCount(); i++) {
+                        IgniteEx ignite = grid(i);
+
+                        long getsCnt = ignite.cache(DEFAULT_CACHE_NAME).localMetrics().getCacheGets();
+
+                        if (getsCnt == 0)
+                            return false;
+                    }
+
+                    return true;
+                }
+            },
+            getTestTimeout())
+        );
+    }
+
+    /**
+     * Tests that the 'get' operation requests are routed to node with same MAC address as at requester.
+     *
+     * @throws Exception In case of an error.
+     * @see #runTestSameHostDistribution(UUID, boolean)
+     */
+    public void testGetRequestsDistribution() throws Exception {
+        UUID destId = grid(0).localNode().id();
+
+        runTestSameHostDistribution(destId, false);
+    }
+
+    /**
+     * Tests that the 'getAll' operation requests are routed to node with same MAC address as at requester.
+     *
+     * @throws Exception In case of an error.
+     * @see #runTestSameHostDistribution(UUID, boolean)
+     */
+    public void testGetAllRequestsDistribution() throws Exception {
+        UUID destId = grid(gridCount() - 1).localNode().id();
+
+        runTestSameHostDistribution(destId, true);
+    }
+
+    /**
+     * Tests that the 'get' and 'getAll' requests are routed to node with same MAC address as at requester.
+     *
+     * @param destId Destination Ignite instance id for requests distribution.
+     * @param batchMode Test mode.
+     * @throws Exception In case of an error.
+     */
+    protected void runTestSameHostDistribution(final UUID destId, final boolean batchMode) throws Exception {
+        Map<UUID, String> macs = getClusterMacs();
+
+        String clientMac = macs.get(grid(CLIENT_NAME).localNode().id());
+
+        macs.put(destId, clientMac);
+
+        replaceMacAddresses(G.allGrids(), macs);
+
+        IgniteCache<Integer, String> cache = grid(0).createCache(cacheConfiguration());
+
+        List<Integer> keys = primaryKeys(cache, PRIMARY_KEYS_NUMBER);
+
+        for (Integer key : keys)
+            cache.put(key, VAL_PREFIX + key);
+
+        IgniteCache<Integer, String> clientCache = grid(CLIENT_NAME).cache(DEFAULT_CACHE_NAME)
+            .withAllowAtomicOpsInTx();
+
+        try (Transaction tx = grid(CLIENT_NAME).transactions().txStart()) {
+            if (batchMode) {
+                Map<Integer, String> results = clientCache.getAll(new TreeSet<>(keys));
+
+                for (Map.Entry<Integer, String> entry : results.entrySet())
+                    assertEquals(VAL_PREFIX + entry.getKey(), entry.getValue());
+            }
+            else {
+                for (Integer key : keys)
+                    assertEquals(VAL_PREFIX + key, clientCache.get(key));
+            }
+
+            tx.commit();
+        }
+
+        for (int i = 0; i < gridCount(); i++) {
+            IgniteEx ignite = grid(i);
+
+            long getsCnt = ignite.cache(DEFAULT_CACHE_NAME).localMetrics().getCacheGets();
+
+            if (destId.equals(ignite.localNode().id()))
+                assertEquals(PRIMARY_KEYS_NUMBER, getsCnt);
+            else
+                assertEquals(0L, getsCnt);
+        }
+    }
+
+    /**
+     * @param instances Started Ignite instances.
+     * @param macs Mapping MAC addresses to UUID.
+     */
+    private void replaceMacAddresses(List<Ignite> instances, Map<UUID, String> macs) {
+        for (Ignite ignite : instances) {
+            for (ClusterNode node : ignite.cluster().nodes()) {
+                String mac = macs.get(node.id());
+
+                assertNotNull(mac);
+
+                Map<String, Object> attrs = new HashMap<>(node.attributes());
+
+                attrs.put(ATTR_MACS, mac);
+
+                ((TcpDiscoveryNode)node).setAttributes(attrs);
+            }
+        }
+    }
+
+    /**
+     * @return Cluster nodes MAC addresses.
+     */
+    private Map<UUID, String> getClusterMacs() {
+        Map<UUID, String> macs = new HashMap<>();
+
+        for (Ignite ignite : G.allGrids()) {
+            ClusterNode node = ignite.cluster().localNode();
+
+            String mac = node.attribute(ATTR_MACS);
+
+            assert mac != null;
+
+            macs.put(node.id(), mac);
+        }
+
+        return macs;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheNoAffinityExchangeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheNoAffinityExchangeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheNoAffinityExchangeTest.java
index 45c6f25..15cd5ee 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheNoAffinityExchangeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheNoAffinityExchangeTest.java
@@ -35,6 +35,7 @@ import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeAddFinishedM
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeFailedMessage;
 import org.apache.ignite.spi.discovery.tcp.messages.TcpDiscoveryNodeLeftMessage;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 /**
@@ -52,6 +53,13 @@ public class CacheNoAffinityExchangeTest extends GridCommonAbstractTest {
         .setAddresses(Collections.singleton("127.0.0.1:47500"));
 
     /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        MvccFeatureChecker.failIfNotSupported(MvccFeatureChecker.Feature.ENTRY_LOCK);
+
+        super.beforeTestsStarted();
+    }
+
+    /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedAtomicCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedAtomicCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedAtomicCacheGetsDistributionTest.java
index 2241a95..963ccc8 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedAtomicCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedAtomicCacheGetsDistributionTest.java
@@ -17,33 +17,23 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.configuration.CacheConfiguration;
 
+import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 
 /**
  * Tests of partitioned atomic cache's 'get' requests distribution.
  */
-public class PartitionedAtomicCacheGetsDistributionTest extends ReplicatedAtomicCacheGetsDistributionTest {
+public class PartitionedAtomicCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
     /** {@inheritDoc} */
-    @Override protected CacheMode cacheMode() {
-        return PARTITIONED;
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return ATOMIC;
     }
 
     /** {@inheritDoc} */
-    @Override protected <K, V> CacheConfiguration<K, V> cacheConfiguration() {
-        CacheConfiguration<K, V> cacheCfg = super.cacheConfiguration();
-
-        cacheCfg.setBackups(backupsCount());
-
-        return cacheCfg;
-    }
-
-    /**
-     * @return Backups count.
-     */
-    protected int backupsCount() {
-        return gridCount() - 1;
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedMvccTxPessimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedMvccTxPessimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedMvccTxPessimisticCacheGetsDistributionTest.java
new file mode 100644
index 0000000..de9d9a6
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedMvccTxPessimisticCacheGetsDistributionTest.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.transactions.TransactionIsolation;
+
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+
+/**
+ * Tests of pessimistic transactional partitioned cache's 'get' requests distribution.
+ */
+public class PartitionedMvccTxPessimisticCacheGetsDistributionTest extends PartitionedTransactionalPessimisticCacheGetsDistributionTest {
+    /** {@inheritDoc} */
+    @Override protected TransactionIsolation transactionIsolation() {
+        return REPEATABLE_READ;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalOptimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalOptimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalOptimisticCacheGetsDistributionTest.java
index 4c88229..e518e32 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalOptimisticCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalOptimisticCacheGetsDistributionTest.java
@@ -18,29 +18,36 @@
 package org.apache.ignite.internal.processors.cache;
 
 import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.transactions.TransactionConcurrency;
 import org.apache.ignite.transactions.TransactionIsolation;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
 
 /**
  * Tests of optimistic transactional partitioned cache's 'get' requests distribution.
  */
-public class PartitionedTransactionalOptimisticCacheGetsDistributionTest extends PartitionedAtomicCacheGetsDistributionTest {
+public class PartitionedTransactionalOptimisticCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
     /** {@inheritDoc} */
-    @Override protected CacheAtomicityMode atomicityMode() {
-        return TRANSACTIONAL;
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
     }
 
     /** {@inheritDoc} */
-    @Override protected TransactionIsolation transactionIsolation() {
-        return READ_COMMITTED;
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return TRANSACTIONAL;
     }
 
     /** {@inheritDoc} */
     @Override protected TransactionConcurrency transactionConcurrency() {
         return OPTIMISTIC;
     }
+
+    /** {@inheritDoc} */
+    @Override protected TransactionIsolation transactionIsolation() {
+        return READ_COMMITTED;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalPessimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalPessimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalPessimisticCacheGetsDistributionTest.java
index 78ea7a6..ce1f7b6 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalPessimisticCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/PartitionedTransactionalPessimisticCacheGetsDistributionTest.java
@@ -17,17 +17,37 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.transactions.TransactionConcurrency;
+import org.apache.ignite.transactions.TransactionIsolation;
 
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
 
 /**
  * Tests of pessimistic transactional partitioned cache's 'get' requests distribution.
  */
-public class PartitionedTransactionalPessimisticCacheGetsDistributionTest
-    extends PartitionedTransactionalOptimisticCacheGetsDistributionTest {
+public class PartitionedTransactionalPessimisticCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return TRANSACTIONAL;
+    }
+
     /** {@inheritDoc} */
     @Override protected TransactionConcurrency transactionConcurrency() {
         return PESSIMISTIC;
     }
+
+    /** {@inheritDoc} */
+    @Override protected TransactionIsolation transactionIsolation() {
+        return READ_COMMITTED;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedAtomicCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedAtomicCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedAtomicCacheGetsDistributionTest.java
index 1aaea76..ef90408e4a2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedAtomicCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedAtomicCacheGetsDistributionTest.java
@@ -17,350 +17,23 @@
 
 package org.apache.ignite.internal.processors.cache;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.UUID;
-import org.apache.ignite.Ignite;
-import org.apache.ignite.IgniteCache;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.cluster.ClusterNode;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.TransactionConfiguration;
-import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.util.lang.GridAbsPredicate;
-import org.apache.ignite.internal.util.typedef.G;
-import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
-import org.apache.ignite.testframework.GridTestUtils;
-import org.apache.ignite.transactions.Transaction;
-import org.apache.ignite.transactions.TransactionConcurrency;
-import org.apache.ignite.transactions.TransactionIsolation;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
 import static org.apache.ignite.cache.CacheMode.REPLICATED;
-import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
-import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_MACS;
-import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
-import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
 
 /**
  * Tests of replicated cache's 'get' requests distribution.
  */
-public class ReplicatedAtomicCacheGetsDistributionTest extends GridCacheAbstractSelfTest {
-    /** Cache name. */
-    private static final String CACHE_NAME = "getsDistributionTest";
-
-    /** Client nodes instance's name. */
-    private static final String CLIENT_NAME = "client";
-
-    /** Value prefix. */
-    private static final String VAL_PREFIX = "val";
-
-    /** */
-    private static final int PRIMARY_KEYS_NUMBER = 1_000;
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        super.beforeTestsStarted();
-
-        IgniteConfiguration clientCfg = getConfiguration(CLIENT_NAME);
-
-        clientCfg.setClientMode(true);
-
-        startGrid(clientCfg);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTest() throws Exception {
-        super.beforeTest();
-
-        IgniteCache cache = ignite(0).cache(CACHE_NAME);
-
-        if (cache != null)
-            cache.destroy();
-
-        // Setting different MAC addresses for all nodes
-        Map<UUID, String> macs = getClusterMacs();
-
-        int idx = 0;
-
-        for (Map.Entry<UUID, String> entry : macs.entrySet())
-            entry.setValue("x2-xx-xx-xx-xx-x" + idx++);
-
-        replaceMacAddresses(G.allGrids(), macs);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
-
-        cfg.setTransactionConfiguration(transactionConfiguration());
-
-        return cfg;
-    }
-
+public class ReplicatedAtomicCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
     /** {@inheritDoc} */
     @Override protected CacheAtomicityMode atomicityMode() {
         return ATOMIC;
     }
 
     /** {@inheritDoc} */
-    @Override protected int gridCount() {
-        return 4;
-    }
-
-    /**
-     * Test 'get' operations requests generator distribution.
-     *
-     * @throws Exception In case of an error.
-     * @see #runTestBalancingDistribution(boolean)
-     */
-    public void testGetRequestsGeneratorDistribution() throws Exception {
-        runTestBalancingDistribution(false);
-    }
-
-    /**
-     * Test 'getAll' operations requests generator distribution.
-     *
-     * @throws Exception In case of an error.
-     * @see #runTestBalancingDistribution(boolean)
-     */
-    public void testGetAllRequestsGeneratorDistribution() throws Exception {
-        runTestBalancingDistribution(true);
-    }
-
-    /**
-     * @param batchMode Whenever 'get' or 'getAll' operations are used in the test.
-     * @throws Exception In case of an error.
-     */
-    protected void runTestBalancingDistribution(boolean batchMode) throws Exception {
-        IgniteCache<Integer, String> cache = grid(0).createCache(cacheConfiguration());
-
-        List<Integer> keys = primaryKeys(cache, PRIMARY_KEYS_NUMBER);
-
-        for (Integer key : keys)
-            cache.put(key, VAL_PREFIX + key);
-
-        IgniteCache<Integer, String> clientCache = grid(CLIENT_NAME).getOrCreateCache(CACHE_NAME)
-            .withAllowAtomicOpsInTx();
-
-        assertTrue(GridTestUtils.waitForCondition(
-            new GridAbsPredicate() {
-                int batchSize = 10;
-                int idx = 0;
-
-                @Override public boolean apply() {
-                    if (idx >= PRIMARY_KEYS_NUMBER)
-                        idx = 0;
-
-                    try (Transaction tx = grid(CLIENT_NAME).transactions().txStart()) {
-                        if (batchMode) {
-                            Set<Integer> keys0 = new TreeSet<>();
-
-                            for (int i = idx; i < idx + batchSize && i < PRIMARY_KEYS_NUMBER; i++)
-                                keys0.add(keys.get(i));
-
-                            idx += batchSize;
-
-                            Map<Integer, String> results = clientCache.getAll(keys0);
-
-                            for (Map.Entry<Integer, String> entry : results.entrySet())
-                                assertEquals(VAL_PREFIX + entry.getKey(), entry.getValue());
-                        }
-                        else {
-                            for (int i = idx; i < idx + gridCount() && i < PRIMARY_KEYS_NUMBER; i++) {
-                                Integer key = keys.get(i);
-
-                                assertEquals(VAL_PREFIX + key, clientCache.get(key));
-                            }
-
-                            idx += gridCount();
-                        }
-
-                        tx.commit();
-                    }
-
-                    for (int i = 0; i < gridCount(); i++) {
-                        IgniteEx ignite = grid(i);
-
-                        long getsCnt = ignite.cache(CACHE_NAME).localMetrics().getCacheGets();
-
-                        if (getsCnt == 0)
-                            return false;
-                    }
-
-                    return true;
-                }
-            },
-            getTestTimeout())
-        );
-    }
-
-    /**
-     * Tests that the 'get' operation requests are routed to node with same MAC address as at requester.
-     *
-     * @throws Exception In case of an error.
-     * @see #runTestSameHostDistribution(UUID, boolean)
-     */
-    public void testGetRequestsDistribution() throws Exception {
-        UUID destId = grid(0).localNode().id();
-
-        runTestSameHostDistribution(destId, false);
-    }
-
-    /**
-     * Tests that the 'getAll' operation requests are routed to node with same MAC address as at requester.
-     *
-     * @throws Exception In case of an error.
-     * @see #runTestSameHostDistribution(UUID, boolean)
-     */
-    public void testGetAllRequestsDistribution() throws Exception {
-        UUID destId = grid(gridCount() - 1).localNode().id();
-
-        runTestSameHostDistribution(destId, true);
-    }
-
-    /**
-     * Tests that the 'get' and 'getAll' requests are routed to node with same MAC address as at requester.
-     *
-     * @param destId Destination Ignite instance id for requests distribution.
-     * @param batchMode Test mode.
-     * @throws Exception In case of an error.
-     */
-    protected void runTestSameHostDistribution(final UUID destId, final boolean batchMode) throws Exception {
-        Map<UUID, String> macs = getClusterMacs();
-
-        String clientMac = macs.get(grid(CLIENT_NAME).localNode().id());
-
-        macs.put(destId, clientMac);
-
-        replaceMacAddresses(G.allGrids(), macs);
-
-        IgniteCache<Integer, String> cache = grid(0).createCache(cacheConfiguration());
-
-        List<Integer> keys = primaryKeys(cache, PRIMARY_KEYS_NUMBER);
-
-        for (Integer key : keys)
-            cache.put(key, VAL_PREFIX + key);
-
-        IgniteCache<Integer, String> clientCache = grid(CLIENT_NAME).getOrCreateCache(CACHE_NAME)
-            .withAllowAtomicOpsInTx();
-
-        try (Transaction tx = grid(CLIENT_NAME).transactions().txStart()) {
-            if (batchMode) {
-                Map<Integer, String> results = clientCache.getAll(new TreeSet<>(keys));
-
-                for (Map.Entry<Integer, String> entry : results.entrySet())
-                    assertEquals(VAL_PREFIX + entry.getKey(), entry.getValue());
-            }
-            else {
-                for (Integer key : keys)
-                    assertEquals(VAL_PREFIX + key, clientCache.get(key));
-            }
-
-            tx.commit();
-        }
-
-        for (int i = 0; i < gridCount(); i++) {
-            IgniteEx ignite = grid(i);
-
-            long getsCnt = ignite.cache(CACHE_NAME).localMetrics().getCacheGets();
-
-            if (destId.equals(ignite.localNode().id()))
-                assertEquals(PRIMARY_KEYS_NUMBER, getsCnt);
-            else
-                assertEquals(0L, getsCnt);
-        }
-    }
-
-    /**
-     * @return Transaction configuration.
-     */
-    protected TransactionConfiguration transactionConfiguration() {
-        TransactionConfiguration txCfg = new TransactionConfiguration();
-
-        txCfg.setDefaultTxIsolation(transactionIsolation());
-        txCfg.setDefaultTxConcurrency(transactionConcurrency());
-
-        return txCfg;
-    }
-
-    /**
-     * @return Cache transaction isolation.
-     */
-    protected TransactionIsolation transactionIsolation() {
-        return REPEATABLE_READ;
-    }
-
-    /**
-     * @return Cache transaction concurrency.
-     */
-    protected TransactionConcurrency transactionConcurrency() {
-        return PESSIMISTIC;
-    }
-
-    /**
-     * @return Caching mode.
-     */
     @Override protected CacheMode cacheMode() {
         return REPLICATED;
     }
-
-    /**
-     * @return Cache configuration.
-     */
-    protected <K, V> CacheConfiguration<K, V> cacheConfiguration() {
-        CacheConfiguration<K, V> cfg = new CacheConfiguration<K, V>(CACHE_NAME);
-
-        cfg.setCacheMode(cacheMode());
-        cfg.setAtomicityMode(atomicityMode());
-        cfg.setWriteSynchronizationMode(FULL_SYNC);
-        cfg.setReadFromBackup(true);
-        cfg.setStatisticsEnabled(true);
-
-        return cfg;
-    }
-
-    /**
-     * @param instances Started Ignite instances.
-     * @param macs Mapping MAC addresses to UUID.
-     */
-    private void replaceMacAddresses(List<Ignite> instances, Map<UUID, String> macs) {
-        for (Ignite ignite : instances) {
-            for (ClusterNode node : ignite.cluster().nodes()) {
-                String mac = macs.get(node.id());
-
-                assertNotNull(mac);
-
-                Map<String, Object> attrs = new HashMap<>(node.attributes());
-
-                attrs.put(ATTR_MACS, mac);
-
-                ((TcpDiscoveryNode)node).setAttributes(attrs);
-            }
-        }
-    }
-
-    /**
-     * @return Cluster nodes MAC addresses.
-     */
-    private Map<UUID, String> getClusterMacs() {
-        Map<UUID, String> macs = new HashMap<>();
-
-        for (Ignite ignite : G.allGrids()) {
-            ClusterNode node = ignite.cluster().localNode();
-
-            String mac = node.attribute(ATTR_MACS);
-
-            assert mac != null;
-
-            macs.put(node.id(), mac);
-        }
-
-        return macs;
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedMvccTxPessimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedMvccTxPessimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedMvccTxPessimisticCacheGetsDistributionTest.java
new file mode 100644
index 0000000..6e2d67c
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedMvccTxPessimisticCacheGetsDistributionTest.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.transactions.TransactionIsolation;
+
+import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
+
+/**
+ * Tests of pessimistic transactional replicated cache's 'get' requests distribution.
+ */
+public class ReplicatedMvccTxPessimisticCacheGetsDistributionTest extends ReplicatedTransactionalPessimisticCacheGetsDistributionTest {
+    /** {@inheritDoc} */
+    @Override protected TransactionIsolation transactionIsolation() {
+        return REPEATABLE_READ;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalOptimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalOptimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalOptimisticCacheGetsDistributionTest.java
index 3bc6809..4744f0a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalOptimisticCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalOptimisticCacheGetsDistributionTest.java
@@ -18,17 +18,24 @@
 package org.apache.ignite.internal.processors.cache;
 
 import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.transactions.TransactionConcurrency;
 import org.apache.ignite.transactions.TransactionIsolation;
 
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
 
 /**
  * Tests of optimistic transactional replicated cache's 'get' requests distribution.
  */
-public class ReplicatedTransactionalOptimisticCacheGetsDistributionTest extends ReplicatedAtomicCacheGetsDistributionTest {
+public class ReplicatedTransactionalOptimisticCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return REPLICATED;
+    }
+
     /** {@inheritDoc} */
     @Override protected CacheAtomicityMode atomicityMode() {
         return TRANSACTIONAL;

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalPessimisticCacheGetsDistributionTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalPessimisticCacheGetsDistributionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalPessimisticCacheGetsDistributionTest.java
index 7bace3c..2648851 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalPessimisticCacheGetsDistributionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/ReplicatedTransactionalPessimisticCacheGetsDistributionTest.java
@@ -17,17 +17,37 @@
 
 package org.apache.ignite.internal.processors.cache;
 
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.transactions.TransactionConcurrency;
+import org.apache.ignite.transactions.TransactionIsolation;
 
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
 
 /**
  * Tests of pessimistic transactional replicated cache's 'get' requests distribution.
  */
-public class ReplicatedTransactionalPessimisticCacheGetsDistributionTest
-    extends ReplicatedTransactionalOptimisticCacheGetsDistributionTest {
+public class ReplicatedTransactionalPessimisticCacheGetsDistributionTest extends CacheGetsDistributionAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return REPLICATED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return TRANSACTIONAL;
+    }
+
     /** {@inheritDoc} */
     @Override protected TransactionConcurrency transactionConcurrency() {
         return PESSIMISTIC;
     }
+
+    /** {@inheritDoc} */
+    @Override protected TransactionIsolation transactionIsolation() {
+        return READ_COMMITTED;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeTest.java
index 2dad0b5..9cd2489 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheExchangeMergeTest.java
@@ -79,6 +79,7 @@ import org.apache.ignite.transactions.TransactionIsolation;
 import static org.apache.ignite.IgniteSystemProperties.IGNITE_EXCHANGE_HISTORY_SIZE;
 import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
 import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
+import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheMode.REPLICATED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
@@ -149,7 +150,12 @@ public class CacheExchangeMergeTest extends GridCommonAbstractTest {
                 cacheConfiguration("c7", TRANSACTIONAL, PARTITIONED, 1),
                 cacheConfiguration("c8", TRANSACTIONAL, PARTITIONED, 2),
                 cacheConfiguration("c9", TRANSACTIONAL, PARTITIONED, 10),
-                cacheConfiguration("c10", TRANSACTIONAL, REPLICATED, 0)
+                cacheConfiguration("c10", TRANSACTIONAL, REPLICATED, 0),
+                cacheConfiguration("c11", TRANSACTIONAL_SNAPSHOT, PARTITIONED, 0),
+                cacheConfiguration("c12", TRANSACTIONAL_SNAPSHOT, PARTITIONED, 1),
+                cacheConfiguration("c13", TRANSACTIONAL_SNAPSHOT, PARTITIONED, 2),
+                cacheConfiguration("c14", TRANSACTIONAL_SNAPSHOT, PARTITIONED, 10),
+                cacheConfiguration("c15", TRANSACTIONAL_SNAPSHOT, REPLICATED, 0)
             );
         }
 
@@ -825,7 +831,6 @@ public class CacheExchangeMergeTest extends GridCommonAbstractTest {
         mergeServersAndClientsFail(true);
     }
 
-
     /**
      * @param waitRebalance Wait for rebalance end before start tested topology change.
      * @throws Exception If failed.

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheTryLockMultithreadedTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheTryLockMultithreadedTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheTryLockMultithreadedTest.java
index 82d9c12..bccc703 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheTryLockMultithreadedTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheTryLockMultithreadedTest.java
@@ -27,6 +27,7 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
@@ -68,6 +69,8 @@ public class CacheTryLockMultithreadedTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override protected void beforeTestsStarted() throws Exception {
+        MvccFeatureChecker.failIfNotSupported(MvccFeatureChecker.Feature.ENTRY_LOCK);
+
         super.beforeTestsStarted();
 
         startGridsMultiThreaded(SRVS);

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
index b7ae844..6230501 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCache150ClientsTest.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.ClientConnectorConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
@@ -37,8 +38,6 @@ import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
-import static org.apache.ignite.cache.CacheAtomicityMode.ATOMIC;
-import static org.apache.ignite.cache.CacheAtomicityMode.TRANSACTIONAL;
 import static org.apache.ignite.cache.CacheMode.PARTITIONED;
 import static org.apache.ignite.cache.CacheWriteSynchronizationMode.PRIMARY_SYNC;
 
@@ -52,6 +51,9 @@ public class IgniteCache150ClientsTest extends GridCommonAbstractTest {
     /** */
     private static final int CACHES = 10;
 
+    /** */
+    private static final int CLIENTS = 150;
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
@@ -80,7 +82,7 @@ public class IgniteCache150ClientsTest extends GridCommonAbstractTest {
             CacheConfiguration ccfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
 
             ccfg.setCacheMode(PARTITIONED);
-            ccfg.setAtomicityMode(i % 2 == 0 ? ATOMIC : TRANSACTIONAL);
+            ccfg.setAtomicityMode(CacheAtomicityMode.values()[i % 3]);
             ccfg.setWriteSynchronizationMode(PRIMARY_SYNC);
             ccfg.setBackups(1);
 
@@ -114,8 +116,6 @@ public class IgniteCache150ClientsTest extends GridCommonAbstractTest {
 
         assertFalse(srv.configuration().isClientMode());
 
-        final int CLIENTS = 150;
-
         final AtomicInteger idx = new AtomicInteger(1);
 
         final CountDownLatch latch = new CountDownLatch(CLIENTS);

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheThreadLocalTxTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheThreadLocalTxTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheThreadLocalTxTest.java
index c8eac20..cab6c72 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheThreadLocalTxTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteCacheThreadLocalTxTest.java
@@ -29,6 +29,7 @@ import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -106,6 +107,9 @@ public class IgniteCacheThreadLocalTxTest extends GridCommonAbstractTest {
 
         for (TransactionConcurrency concurrency : TransactionConcurrency.values()) {
             for (TransactionIsolation isolation : TransactionIsolation.values()) {
+                if (MvccFeatureChecker.forcedMvcc() && !MvccFeatureChecker.isSupported(concurrency, isolation))
+                    continue;
+
                 for (boolean read : reads) {
                     for (boolean write : writes) {
                         for (int i = 0; i < endOps; i++)

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgnitePessimisticTxSuspendResumeTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgnitePessimisticTxSuspendResumeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgnitePessimisticTxSuspendResumeTest.java
index 57a1470..dba769d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgnitePessimisticTxSuspendResumeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgnitePessimisticTxSuspendResumeTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.IgniteTransactions;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -70,6 +71,10 @@ public class IgnitePessimisticTxSuspendResumeTest extends GridCommonAbstractTest
             IgniteTransactions txs = g.transactions();
 
             for (TransactionIsolation isolation : TransactionIsolation.values()) {
+                if (MvccFeatureChecker.forcedMvcc() &&
+                    !MvccFeatureChecker.isSupported(TransactionConcurrency.PESSIMISTIC, isolation))
+                    continue;
+
                 final Transaction tx = txs.txStart(TransactionConcurrency.PESSIMISTIC, isolation);
 
                 cache.put(1, "1");

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxLabelTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxLabelTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxLabelTest.java
index d89ba0b..50b107d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxLabelTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxLabelTest.java
@@ -18,13 +18,27 @@
 package org.apache.ignite.internal.processors.cache.transactions;
 
 import org.apache.ignite.Ignite;
-import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 
 /**
  * Tests transaction labels.
  */
-public class TxLabelTest extends GridCacheAbstractSelfTest {
+public class TxLabelTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        super.beforeTestsStarted();
+
+        startGrid(0).getOrCreateCache(defaultCacheConfiguration());
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+
+        super.afterTestsStopped();
+    }
+
     /**
      * Tests transaction labels.
      */
@@ -55,9 +69,4 @@ public class TxLabelTest extends GridCacheAbstractSelfTest {
             tx.commit();
         }
     }
-
-    /** {@inheritDoc} */
-    @Override protected int gridCount() {
-        return 1;
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackAsyncTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackAsyncTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackAsyncTest.java
index e5e35b8..612d6ce 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackAsyncTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackAsyncTest.java
@@ -81,6 +81,7 @@ import org.apache.ignite.plugin.extensions.communication.Message;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils.SF;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -124,6 +125,14 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
     public static final String LABEL = "wLockTx";
 
     /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        if (MvccFeatureChecker.forcedMvcc())
+            fail("https://issues.apache.org/jira/browse/IGNITE-10410");
+
+        super.beforeTestsStarted();
+    }
+
+    /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 
@@ -165,10 +174,11 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
     }
 
     /**
-     *
      * @return {@code True} if persistence must be enabled for test.
      */
-    protected boolean persistenceEnabled() { return false; }
+    protected boolean persistenceEnabled() {
+        return false;
+    }
 
     /** {@inheritDoc} */
     @Override protected void beforeTest() throws Exception {
@@ -339,14 +349,13 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
     }
 
     /**
-     *
      * @param holdLockNode Node holding the write lock.
      * @param tryLockNode Node trying to acquire lock.
      * @param useTimeout {@code True} if need to start tx with timeout.
-     *
      * @throws Exception If failed.
      */
-    private void testSynchronousRollback0(Ignite holdLockNode, final Ignite tryLockNode, final boolean useTimeout) throws Exception {
+    private void testSynchronousRollback0(Ignite holdLockNode, final Ignite tryLockNode,
+        final boolean useTimeout) throws Exception {
         final CountDownLatch keyLocked = new CountDownLatch(1);
 
         CountDownLatch waitCommit = new CountDownLatch(1);
@@ -409,7 +418,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
 
                 int proc = 1;
 
-                while(true) {
+                while (true) {
                     try {
                         Transaction tx = txReadyFut.get();
 
@@ -490,11 +499,11 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
         testEnlistMany(true, SERIALIZABLE, OPTIMISTIC);
     }
 
-
     /**
      *
      */
-    private void testEnlistMany(boolean write, TransactionIsolation isolation, TransactionConcurrency conc) throws Exception {
+    private void testEnlistMany(boolean write, TransactionIsolation isolation,
+        TransactionConcurrency conc) throws Exception {
         final Ignite client = startClient();
 
         Map<Integer, Integer> entries = new HashMap<>();
@@ -504,7 +513,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
 
         IgniteInternalFuture<?> fut = null;
 
-        try(Transaction tx = client.transactions().txStart(conc, isolation, 0, 0)) {
+        try (Transaction tx = client.transactions().txStart(conc, isolation, 0, 0)) {
             fut = rollbackAsync(tx, 200);
 
             if (write)
@@ -549,7 +558,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
             }
         }, "tx-rollback-thread");
 
-        try(final Transaction tx = client.transactions().txStart()) {
+        try (final Transaction tx = client.transactions().txStart()) {
             client.cache(CACHE_NAME).put(0, 0);
 
             fail();
@@ -608,7 +617,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
             }
         }, "tx-rollback-thread");
 
-        try(final Transaction tx = client.transactions().txStart()) {
+        try (final Transaction tx = client.transactions().txStart()) {
             txRef.set(tx);
 
             client.cache(CACHE_NAME).put(0, 0);
@@ -757,7 +766,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
                 Transaction tx;
 
                 // Rollback all transaction
-                while((tx = nodeQ.poll()) != null) {
+                while ((tx = nodeQ.poll()) != null) {
                     rolledBack.increment();
 
                     doSleep(r.nextInt(50)); // Add random sleep to increase completed txs count.
@@ -791,7 +800,7 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
         for (BlockingQueue<Transaction> queue : perNodeTxs.values()) {
             Transaction tx;
 
-            while((tx = queue.poll()) != null) {
+            while ((tx = queue.poll()) != null) {
                 rolledBack.increment();
 
                 rollbackClo.apply(tx);
@@ -940,12 +949,12 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
             @Override public boolean apply(Event evt) {
                 runAsync(new Runnable() {
                     @Override public void run() {
-                        try(Transaction tx = crd.transactions().withLabel("testLbl").txStart()) {
+                        try (Transaction tx = crd.transactions().withLabel("testLbl").txStart()) {
                             // Wait for node start.
                             waitForCondition(new GridAbsPredicate() {
                                 @Override public boolean apply() {
                                     return crd.cluster().topologyVersion() != GRID_CNT +
-                                        /** client node */ 1  + /** stop server node */ 1 + /** start server node */ 1;
+                                        /** client node */1 + /** stop server node */1 + /** start server node */1;
                                 }
                             }, 10_000);
 
@@ -1021,7 +1030,6 @@ public class TxRollbackAsyncTest extends GridCommonAbstractTest {
      * @param keyLocked Latch for notifying until key is locked.
      * @param waitCommit Latch for waiting until commit is allowed.
      * @param timeout Timeout.
-     *
      * @return tx completion future.
      */
     private IgniteInternalFuture<?> lockInTx(final Ignite node, final CountDownLatch keyLocked,

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnIncorrectParamsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnIncorrectParamsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnIncorrectParamsTest.java
index 8aafa8b..75b7625 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnIncorrectParamsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnIncorrectParamsTest.java
@@ -28,6 +28,7 @@ import org.apache.ignite.events.TransactionStateChangedEvent;
 import org.apache.ignite.lang.IgniteBiPredicate;
 import org.apache.ignite.lang.IgnitePredicate;
 import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -39,6 +40,14 @@ import static org.apache.ignite.events.EventType.EVT_TX_STARTED;
  * Tests transaction rollback on incorrect tx params.
  */
 public class TxRollbackOnIncorrectParamsTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        if (MvccFeatureChecker.forcedMvcc())
+            fail("https://issues.apache.org/jira/browse/IGNITE-10415");
+
+        super.beforeTestsStarted();
+    }
+
     /**
      *
      */
@@ -61,14 +70,14 @@ public class TxRollbackOnIncorrectParamsTest extends GridCommonAbstractTest {
         IgniteCache cache = ignite.getOrCreateCache(defaultCacheConfiguration());
 
         try (Transaction tx = ignite.transactions().txStart(
-            TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ, 200, 2)) {
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, 200, 2)) {
             cache.put(1, 1);
 
             tx.commit();
         }
 
         try (Transaction tx = ignite.transactions().txStart(
-            TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
             cache.put(1, 2);
 
             tx.commit();
@@ -216,14 +225,14 @@ public class TxRollbackOnIncorrectParamsTest extends GridCommonAbstractTest {
             EVT_TX_STARTED);
 
         try (Transaction tx = ignite.transactions().txStart(
-            TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
             cacheLocal.put(1, 1);
 
             tx.commit();
         }
 
         try (Transaction tx = remote.transactions().txStart(
-            TransactionConcurrency.OPTIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, 100, 2)) {
             cacheRemote.put(1, 2);
 
             tx.commit();

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java
index 61e39ff..0ae15b0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxRollbackOnTimeoutTest.java
@@ -57,6 +57,7 @@ import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.GridTestUtils.SF;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -94,6 +95,14 @@ public class TxRollbackOnTimeoutTest extends GridCommonAbstractTest {
     private static final int GRID_CNT = 3;
 
     /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        if (MvccFeatureChecker.forcedMvcc())
+            fail("https://issues.apache.org/jira/browse/IGNITE-7388");
+
+        super.beforeTestsStarted();
+    }
+
+    /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java
index 01c87ae..446609f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java
@@ -21,10 +21,14 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
 import org.apache.ignite.IgniteEvents;
+import org.apache.ignite.IgniteTransactions;
+import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.events.Event;
 import org.apache.ignite.events.TransactionStateChangedEvent;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.testframework.MvccFeatureChecker;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 import org.apache.ignite.transactions.Transaction;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -67,20 +71,20 @@ public class TxStateChangeEventTest extends GridCommonAbstractTest {
      *
      */
     public void testLocal() throws Exception {
-        test(true);
+        check(true);
     }
 
     /**
      *
      */
     public void testRemote() throws Exception {
-        test(false);
+        check(false);
     }
 
     /**
      *
      */
-    private void test(boolean loc) throws Exception {
+    private void check(boolean loc) throws Exception {
         Ignite ignite = startGrids(5);
 
         final IgniteEvents evts = loc ? ignite.events() : grid(3).events();
@@ -104,27 +108,51 @@ public class TxStateChangeEventTest extends GridCommonAbstractTest {
                 },
                 EVTS_TX);
 
-        IgniteCache cache = ignite.getOrCreateCache(defaultCacheConfiguration().setBackups(2));
+        IgniteTransactions txs = ignite.transactions();
 
-        // create & commit
-        try (Transaction tx = ignite.transactions().withLabel(lb).txStart(
-            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.SERIALIZABLE, timeout, 3)) {
-            cache.put(1, 1);
+        IgniteCache<Integer, Integer> cache = ignite.getOrCreateCache(getCacheConfig());
 
-            tx.commit();
+        checkCommit(txs, cache);
+
+        if (!MvccFeatureChecker.forcedMvcc())
+            checkSuspendResume(txs, cache);
+
+        checkRollback(txs, cache);
+    }
+
+    /** */
+    @SuppressWarnings("unchecked")
+    private CacheConfiguration<Integer, Integer> getCacheConfig() {
+        return defaultCacheConfiguration().setBackups(2);
+    }
+
+    /**
+     * @param txs Transaction manager.
+     * @param cache Ignite cache.
+     */
+    private void checkRollback(IgniteTransactions txs, IgniteCache<Integer, Integer> cache) {
+        // create & rollback (pessimistic)
+        try (Transaction tx = txs.withLabel(lb).txStart(
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, timeout, 3)) {
+            cache.put(4, 5);
         }
 
         assertTrue(
             creation.get() &&
-                commit.get() &&
-                !rollback.get() &&
+                !commit.get() &&
+                rollback.get() &&
                 !suspend.get() &&
                 !resume.get());
+    }
 
-        clear();
-
+    /**
+     * @param txs Transaction manager.
+     * @param cache Ignite cache.
+     */
+    private void checkSuspendResume(IgniteTransactions txs,
+        IgniteCache<Integer, Integer> cache) throws IgniteInterruptedCheckedException {
         // create & suspend & resume & commit
-        try (Transaction tx = ignite.transactions().withLabel(lb).txStart(
+        try (Transaction tx = txs.withLabel(lb).txStart(
             TransactionConcurrency.OPTIMISTIC, TransactionIsolation.SERIALIZABLE, timeout, 3)) {
             cache.put(2, 7);
 
@@ -145,19 +173,29 @@ public class TxStateChangeEventTest extends GridCommonAbstractTest {
                 resume.get());
 
         clear();
+    }
 
-        // create & rollback (pessimistic)
-        try (Transaction tx = ignite.transactions().withLabel(lb).txStart(
-            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.SERIALIZABLE, timeout, 3)) {
-            cache.put(4, 5);
+    /**
+     * @param txs Transaction manager.
+     * @param cache Ignite cache.
+     */
+    private void checkCommit(IgniteTransactions txs, IgniteCache<Integer, Integer> cache) {
+        // create & commit
+        try (Transaction tx = txs.withLabel(lb).txStart(
+            TransactionConcurrency.PESSIMISTIC, TransactionIsolation.REPEATABLE_READ, timeout, 3)) {
+            cache.put(1, 1);
+
+            tx.commit();
         }
 
         assertTrue(
             creation.get() &&
-                !commit.get() &&
-                rollback.get() &&
+                commit.get() &&
+                !rollback.get() &&
                 !suspend.get() &&
                 !resume.get());
+
+        clear();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/testframework/MvccFeatureChecker.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/MvccFeatureChecker.java b/modules/core/src/test/java/org/apache/ignite/testframework/MvccFeatureChecker.java
index 2ea77b4..07947a9 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/MvccFeatureChecker.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/MvccFeatureChecker.java
@@ -42,6 +42,7 @@ public class MvccFeatureChecker {
         CACHE_EVENTS,
         EVICTION,
         EXPIRATION,
+        METRICS
         INTERCEPTOR
     }
 
@@ -134,6 +135,9 @@ public class MvccFeatureChecker {
             case EXPIRATION:
                 fail("https://issues.apache.org/jira/browse/IGNITE-7311");
 
+            case METRICS:
+                fail("https://issues.apache.org/jira/browse/IGNITE-9224");
+
             case INTERCEPTOR:
                 fail("https://issues.apache.org/jira/browse/IGNITE-9323");
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/74d342d6/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
new file mode 100644
index 0000000..688c572
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheMvccTestSuite6.java
@@ -0,0 +1,94 @@
+/*
+ * 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.testsuites;
+
+import java.util.HashSet;
+import java.util.Set;
+import junit.framework.TestSuite;
+import org.apache.ignite.IgniteSystemProperties;
+import org.apache.ignite.internal.processors.cache.PartitionedAtomicCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.PartitionedMvccTxPessimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.PartitionedTransactionalOptimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.PartitionedTransactionalPessimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.PartitionsExchangeCoordinatorFailoverTest;
+import org.apache.ignite.internal.processors.cache.ReplicatedAtomicCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.ReplicatedMvccTxPessimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest;
+import org.apache.ignite.internal.processors.cache.datastructures.IgniteExchangeLatchManagerCoordinatorFailTest;
+import org.apache.ignite.internal.processors.cache.distributed.CacheExchangeMergeTest;
+import org.apache.ignite.internal.processors.cache.distributed.CacheParallelStartTest;
+import org.apache.ignite.internal.processors.cache.distributed.IgniteCache150ClientsTest;
+import org.apache.ignite.internal.processors.cache.distributed.IgniteOptimisticTxSuspendResumeMultiServerTest;
+import org.apache.ignite.internal.processors.cache.distributed.IgniteOptimisticTxSuspendResumeTest;
+import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticOnPartitionExchangeTest;
+import org.apache.ignite.internal.processors.cache.transactions.TxOptimisticPrepareOnUnstableTopologyTest;
+import org.apache.ignite.internal.processors.cache.transactions.TxRollbackOnTimeoutOnePhaseCommitTest;
+import org.apache.ignite.internal.processors.cache.transactions.TxStateChangeEventTest;
+
+/**
+ * Test suite.
+ */
+public class IgniteCacheMvccTestSuite6 extends TestSuite {
+    /**
+     * @return IgniteCache test suite.
+     */
+    public static TestSuite suite() {
+        System.setProperty(IgniteSystemProperties.IGNITE_FORCE_MVCC_MODE_IN_TESTS, "true");
+
+        Set<Class> ignoredTests = new HashSet<>();
+
+        // Skip classes that already contains Mvcc tests
+        ignoredTests.add(TxStateChangeEventTest.class);
+
+        // Atomic cache tests.
+        ignoredTests.add(ReplicatedAtomicCacheGetsDistributionTest.class);
+        ignoredTests.add(PartitionedAtomicCacheGetsDistributionTest.class);
+
+        // Irrelevant Tx tests.
+        ignoredTests.add(IgniteOptimisticTxSuspendResumeTest.class);
+        ignoredTests.add(IgniteOptimisticTxSuspendResumeMultiServerTest.class);
+        ignoredTests.add(TxOptimisticPrepareOnUnstableTopologyTest.class);
+        ignoredTests.add(ReplicatedTransactionalOptimisticCacheGetsDistributionTest.class);
+        ignoredTests.add(PartitionedTransactionalOptimisticCacheGetsDistributionTest.class);
+        ignoredTests.add(TxOptimisticOnPartitionExchangeTest.class);
+
+        ignoredTests.add(TxRollbackOnTimeoutOnePhaseCommitTest.class);
+
+        // Other non-tx tests.
+        ignoredTests.add(CacheExchangeMergeTest.class);
+        ignoredTests.add(IgniteExchangeLatchManagerCoordinatorFailTest.class);
+        ignoredTests.add(PartitionsExchangeCoordinatorFailoverTest.class);
+        ignoredTests.add(CacheParallelStartTest.class);
+        ignoredTests.add(IgniteCache150ClientsTest.class);
+
+        // Skip tests that has Mvcc clones.
+        ignoredTests.add(PartitionedTransactionalPessimisticCacheGetsDistributionTest.class); // See PartitionedMvccTxPessimisticCacheGetsDistributionTest.
+        ignoredTests.add(ReplicatedTransactionalPessimisticCacheGetsDistributionTest.class); //See ReplicatedMvccTxPessimisticCacheGetsDistributionTest
+
+        TestSuite suite = new TestSuite("IgniteCache Mvcc Test Suite part 6");
+
+        suite.addTest(IgniteCacheTestSuite6.suite(ignoredTests));
+
+        // Add mvcc versions for skipped tests.
+        suite.addTestSuite(PartitionedMvccTxPessimisticCacheGetsDistributionTest.class);
+        suite.addTestSuite(ReplicatedMvccTxPessimisticCacheGetsDistributionTest.class);
+
+        return suite;
+    }
+}