You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2017/09/08 12:36:01 UTC

[29/36] ignite git commit: ignite-3484

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
index 4b4860b..a365fc5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheDataTree.java
@@ -21,7 +21,7 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.CacheGroupContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter;
 import org.apache.ignite.internal.processors.cache.persistence.CacheSearchRow;
@@ -114,7 +114,7 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> {
     /** {@inheritDoc} */
     @Override protected int compare(BPlusIO<CacheSearchRow> iox, long pageAddr, int idx, CacheSearchRow row)
         throws IgniteCheckedException {
-        assert !grp.mvccEnabled() || row.mvccUpdateTopologyVersion() != 0 || row.getClass() == SearchRow.class;
+        assert !grp.mvccEnabled() || row.mvccUpdateTopologyVersion() != 0;// || row.getClass() == SearchRow.class;
 
         RowLinkIO io = (RowLinkIO)iox;
 
@@ -155,7 +155,7 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> {
 
         cmp = compareKeys(row.key(), link);
 
-        if (cmp != 0 || !grp.mvccEnabled() || row.mvccUpdateTopologyVersion() == 0)
+        if (cmp != 0 || !grp.mvccEnabled())
             return 0;
 
         long mvccTopVer = io.getMvccUpdateTopologyVersion(pageAddr, idx);
@@ -167,7 +167,7 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> {
 
         long mvccCntr = io.getMvccUpdateCounter(pageAddr, idx);
 
-        assert row.mvccUpdateCounter() != TxMvccVersion.COUNTER_NA;
+        assert row.mvccUpdateCounter() != MvccUpdateVersion.COUNTER_NA;
 
         cmp = Long.compare(row.mvccUpdateCounter(), mvccCntr);
 
@@ -187,7 +187,14 @@ public class CacheDataTree extends BPlusTree<CacheSearchRow, CacheDataRow> {
             (CacheDataRowAdapter.RowData)flags :
             CacheDataRowAdapter.RowData.FULL;
 
-        return rowStore.dataRow(cacheId, hash, link, x);
+        if (grp.mvccEnabled()) {
+            long mvccTopVer = rowIo.getMvccUpdateTopologyVersion(pageAddr, idx);
+            long mvccCntr = rowIo.getMvccUpdateCounter(pageAddr, idx);
+
+            return rowStore.mvccRow(cacheId, hash, link, x, mvccTopVer, mvccCntr);
+        }
+        else
+            return rowStore.dataRow(cacheId, hash, link, x);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java
index 6922302..45856b8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataInnerIO.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.processors.cache.tree;
 
 import org.apache.ignite.internal.pagemem.PageUtils;
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions;
 
 /**
@@ -59,6 +59,6 @@ public final class CacheIdAwareDataInnerIO extends AbstractDataInnerIO {
 
     /** {@inheritDoc} */
     @Override public long getMvccUpdateCounter(long pageAddr, int idx) {
-        return TxMvccVersion.COUNTER_NA;
+        return MvccUpdateVersion.COUNTER_NA;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java
index b57fe94..11d56e0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/CacheIdAwareDataLeafIO.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.processors.cache.tree;
 
 import org.apache.ignite.internal.pagemem.PageUtils;
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions;
 
 /**
@@ -59,6 +59,6 @@ public final class CacheIdAwareDataLeafIO extends AbstractDataLeafIO {
 
     /** {@inheritDoc} */
     @Override public long getMvccUpdateCounter(long pageAddr, int idx) {
-        return TxMvccVersion.COUNTER_NA;
+        return MvccUpdateVersion.COUNTER_NA;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java
index b070de0..92371a1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataInnerIO.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.tree;
 
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 
@@ -59,6 +59,6 @@ public final class DataInnerIO extends AbstractDataInnerIO {
 
     /** {@inheritDoc} */
     @Override public long getMvccUpdateCounter(long pageAddr, int idx) {
-        return TxMvccVersion.COUNTER_NA;
+        return MvccUpdateVersion.COUNTER_NA;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java
index e992d18..bcf733c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/DataLeafIO.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.tree;
 
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.tree.io.IOVersions;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 
@@ -59,6 +59,6 @@ public final class DataLeafIO extends AbstractDataLeafIO {
 
     /** {@inheritDoc} */
     @Override public long getMvccUpdateCounter(long pageAddr, int idx) {
-        return TxMvccVersion.COUNTER_NA;
+        return MvccUpdateVersion.COUNTER_NA;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
index 484e5f1..d0d6ee1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/MvccDataRow.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.processors.cache.tree;
 import org.apache.ignite.internal.processors.cache.CacheGroupContext;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 
 /**
@@ -46,7 +46,7 @@ public class MvccDataRow extends DataRow {
         super(grp, hash, link, part, rowData);
 
         assert mvccTopVer > 0 : mvccTopVer;
-        assert mvccCntr != TxMvccVersion.COUNTER_NA;
+        assert mvccCntr != MvccUpdateVersion.COUNTER_NA;
 
         this.mvccTopVer = mvccTopVer;
         this.mvccCntr = mvccCntr;

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java
index d2226ca..b7fa275 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/tree/SearchRow.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.processors.cache.tree;
 
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
-import org.apache.ignite.internal.processors.cache.mvcc.TxMvccVersion;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccUpdateVersion;
 import org.apache.ignite.internal.processors.cache.persistence.CacheSearchRow;
 
 /**
@@ -82,6 +82,6 @@ public class SearchRow implements CacheSearchRow {
 
     /** {@inheritDoc} */
     @Override public long mvccUpdateCounter() {
-        return TxMvccVersion.COUNTER_NA;
+        return MvccUpdateVersion.COUNTER_NA;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
index 1cad356..eb8795f 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
@@ -27,6 +27,7 @@ import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.cache.eviction.EvictableEntry;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridDhtAtomicAbstractUpdateFuture;
+import org.apache.ignite.internal.processors.cache.mvcc.MvccQueryVersion;
 import org.apache.ignite.internal.processors.cache.persistence.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
 import org.apache.ignite.internal.processors.cache.transactions.IgniteTxKey;
@@ -391,7 +392,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         String taskName,
         @Nullable IgniteCacheExpiryPolicy expiryPlc,
         boolean keepBinary,
-        long mvccCntr) {
+        MvccQueryVersion mvccVer) {
         return val;
     }
 
@@ -408,7 +409,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         String taskName,
         @Nullable IgniteCacheExpiryPolicy expiryPlc,
         boolean keepBinary,
-        long mvccCntr,
+        MvccQueryVersion mvccVer,
         @Nullable ReaderArguments args) throws IgniteCheckedException, GridCacheEntryRemovedException {
         assert false;
 
@@ -426,7 +427,7 @@ public class GridCacheTestEntryEx extends GridMetadataAwareAdapter implements Gr
         String taskName,
         @Nullable IgniteCacheExpiryPolicy expiryPlc,
         boolean keepBinary,
-        long mvccCntr,
+        MvccQueryVersion mvccVer,
         @Nullable ReaderArguments readerArgs) {
         assert false;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
index 4c6b206..e0543b5 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTransactionsTest.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.Callable;
+import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -40,6 +41,9 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest;
+import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishResponse;
 import org.apache.ignite.internal.util.lang.GridInClosure3;
 import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.F;
@@ -63,7 +67,7 @@ import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
 
 /**
- *
+ * TODO IGNITE-3478: extend tests to use single/mutiple nodes, all tx types.
  */
 public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
     /** */
@@ -75,12 +79,18 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
     /** */
     private boolean client;
 
+    /** */
+    private boolean testSpi;
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         IgniteConfiguration cfg = super.getConfiguration(gridName);
 
         ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
 
+        if (testSpi)
+            cfg.setCommunicationSpi(new TestRecordingCommunicationSpi());
+
         ((TcpCommunicationSpi)cfg.getCommunicationSpi()).setSharedMemoryPort(-1);
 
         cfg.setClientMode(client);
@@ -88,6 +98,13 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
         return cfg;
     }
 
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        verifyCoordinatorInternalState();
+
+        stopAllGrids();
+    }
+
     /**
      * @throws Exception If failed.
      */
@@ -206,7 +223,7 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
 
             Ignite ignite = startGrid(SRVS);
 
-            CacheConfiguration ccfg = cacheConfiguration(PARTITIONED, FULL_SYNC, 1);
+            CacheConfiguration ccfg = cacheConfiguration(PARTITIONED, FULL_SYNC, 1, 512);
 
             IgniteCache<Integer, Integer> cache = ignite.createCache(ccfg);
 
@@ -231,7 +248,7 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
 
         IgniteTransactions txs = node.transactions();
 
-        final IgniteCache<Object, Object> cache = node.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0));
+        final IgniteCache<Object, Object> cache = node.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0, 1));
 
         final int KEYS = 10_000;
 
@@ -285,6 +302,158 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    public void testMyUpdatesAreVisible() throws Exception {
+        final Ignite ignite = startGrid(0);
+
+        final IgniteCache<Object, Object> cache = ignite.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0, 1));
+
+        final int THREADS = Runtime.getRuntime().availableProcessors() * 2;
+
+        final int KEYS = 10;
+
+        final CyclicBarrier b = new CyclicBarrier(THREADS);
+
+        GridTestUtils.runMultiThreaded(new IgniteInClosure<Integer>() {
+            @Override public void apply(Integer idx) {
+                try {
+                    int min = idx * KEYS;
+                    int max = min + KEYS;
+
+                    Set<Integer> keys = new HashSet<>();
+
+                    for (int k = min; k < max; k++)
+                        keys.add(k);
+
+                    b.await();
+
+                    for (int i = 0; i < 100; i++) {
+                        try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+                            for (int k = min; k < max; k++)
+                                cache.put(k, i);
+
+                            tx.commit();
+                        }
+
+                        Map<Object, Object> res = cache.getAll(keys);
+
+                        for (Integer key : keys)
+                            assertEquals(i, res.get(key));
+
+                        assertEquals(KEYS, res.size());
+                    }
+                }
+                catch (Exception e) {
+                    error("Unexpected error: " + e, e);
+
+                    fail("Unexpected error: " + e);
+                }
+            }
+        }, THREADS, "test-thread");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartialCommitGetAll() throws Exception {
+        testSpi = true;
+
+        startGrids(2);
+
+        client = true;
+
+        final Ignite ignite = startGrid(3);
+
+        awaitPartitionMapExchange();
+
+        final IgniteCache<Object, Object> cache =
+            ignite.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0, 16));
+
+        final Integer key1 = primaryKey(ignite(0).cache(cache.getName()));
+        final Integer key2 = primaryKey(ignite(1).cache(cache.getName()));
+
+        try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+            cache.put(key1, 1);
+            cache.put(key2, 1);
+
+            tx.commit();
+        }
+
+        Integer val = 1;
+
+        // Allow finish update for key1 and block update for key2.
+
+        TestRecordingCommunicationSpi clientSpi = TestRecordingCommunicationSpi.spi(ignite);
+        TestRecordingCommunicationSpi srvSpi = TestRecordingCommunicationSpi.spi(ignite(0));
+
+        for (int i = 0; i < 10; i++) {
+            info("Iteration: " + i);
+
+            clientSpi.blockMessages(GridNearTxFinishRequest.class, getTestIgniteInstanceName(1));
+
+            srvSpi.record(GridNearTxFinishResponse.class);
+
+            final Integer newVal = val + 1;
+
+            IgniteInternalFuture<?> fut = GridTestUtils.runAsync(new Callable<Void>() {
+                @Override public Void call() throws Exception {
+                    try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+                        cache.put(key1, newVal);
+                        cache.put(key2, newVal);
+
+                        tx.commit();
+                    }
+
+                    return null;
+                }
+            });
+
+            try {
+                srvSpi.waitForRecorded();
+
+                srvSpi.recordedMessages(true);
+
+                assertFalse(fut.isDone());
+
+                if (i % 2 == 1) {
+                    // Execute one more update to increase counter.
+                    try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC, REPEATABLE_READ)) {
+                        cache.put(1000_0000, 1);
+
+                        tx.commit();
+                    }
+                }
+
+                Set<Integer> keys = new HashSet<>();
+                keys.add(key1);
+                keys.add(key2);
+
+                Map<Object, Object> res;
+
+                res = cache.getAll(keys);
+
+                assertEquals(val, res.get(key1));
+                assertEquals(val, res.get(key2));
+
+                clientSpi.stopBlock(true);
+
+                fut.get();
+
+                res = cache.getAll(keys);
+
+                assertEquals(newVal, res.get(key1));
+                assertEquals(newVal, res.get(key2));
+
+                val = newVal;
+            }
+            finally {
+                clientSpi.stopBlock(true);
+            }
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testPutAllGetAll() throws Exception {
         final int RANGE = 20;
 
@@ -392,16 +561,16 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
-    public void testAccountsSumGetAll() throws Exception {
+    public void testAccountsTxGetAll() throws Exception {
         final int ACCOUNTS = 20;
 
         final int ACCOUNT_START_VAL = 1000;
 
         final long time = 10_000;
 
-        final int writers = 1;
+        final int writers = 4;
 
-        final int readers = 1;
+        final int readers = 4;
 
         final IgniteInClosure<IgniteCache<Object, Object>> init = new IgniteInClosure<IgniteCache<Object, Object>>() {
             @Override public void apply(IgniteCache<Object, Object> cache) {
@@ -432,13 +601,13 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
                     while (!stop.get()) {
                         cnt++;
 
-                        try (Transaction tx = txs.txStart(PESSIMISTIC, REPEATABLE_READ)) {
-                            Integer id1 = rnd.nextInt(ACCOUNTS);
-                            Integer id2 = rnd.nextInt(ACCOUNTS);
+                        Integer id1 = rnd.nextInt(ACCOUNTS);
+                        Integer id2 = rnd.nextInt(ACCOUNTS);
 
-                            if (id1.equals(id2))
-                                continue;
+                        while (id1.equals(id2))
+                            id2 = rnd.nextInt(ACCOUNTS);
 
+                        try (Transaction tx = txs.txStart(PESSIMISTIC, REPEATABLE_READ)) {
                             Account a1;
                             Account a2;
 
@@ -450,7 +619,7 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
                             Map<Object, Object> accounts = cache.getAll(keys);
 
                             a1 = (Account)accounts.get(id1);
-                            a2 = (Account)accounts.get(id1);
+                            a2 = (Account)accounts.get(id2);
 
                             assertNotNull(a1);
                             assertNotNull(a2);
@@ -519,6 +688,7 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
      * @param time Test time.
      * @param writers Number of writers.
      * @param readers Number of readers.
+     * @param init Optional init closure.
      * @param writer Writers threads closure.
      * @param reader Readers threads closure.
      * @throws Exception If failed.
@@ -531,7 +701,7 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
         final GridInClosure3<Integer, IgniteCache<Object, Object>, AtomicBoolean> reader) throws Exception {
         final Ignite ignite = startGrid(0);
 
-        final IgniteCache<Object, Object> cache = ignite.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0));
+        final IgniteCache<Object, Object> cache = ignite.createCache(cacheConfiguration(PARTITIONED, FULL_SYNC, 0, 1));
 
         if (init != null)
             init.apply(cache);
@@ -602,10 +772,10 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
     private List<CacheConfiguration<Object, Object>> cacheConfigurations() {
         List<CacheConfiguration<Object, Object>> ccfgs = new ArrayList<>();
 
-        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 0));
-        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 1));
-        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 2));
-        ccfgs.add(cacheConfiguration(REPLICATED, FULL_SYNC, 0));
+        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 0, RendezvousAffinityFunction.DFLT_PARTITION_COUNT));
+        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 1, RendezvousAffinityFunction.DFLT_PARTITION_COUNT));
+        ccfgs.add(cacheConfiguration(PARTITIONED, FULL_SYNC, 2, RendezvousAffinityFunction.DFLT_PARTITION_COUNT));
+        ccfgs.add(cacheConfiguration(REPLICATED, FULL_SYNC, 0, RendezvousAffinityFunction.DFLT_PARTITION_COUNT));
 
         return ccfgs;
     }
@@ -646,19 +816,21 @@ public class CacheMvccTransactionsTest extends GridCommonAbstractTest {
      * @param cacheMode Cache mode.
      * @param syncMode Write synchronization mode.
      * @param backups Number of backups.
+     * @param parts Number of partitions.
      * @return Cache configuration.
      */
     private CacheConfiguration<Object, Object> cacheConfiguration(
         CacheMode cacheMode,
         CacheWriteSynchronizationMode syncMode,
-        int backups) {
+        int backups,
+        int parts) {
         CacheConfiguration<Object, Object> ccfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME);
 
         ccfg.setCacheMode(cacheMode);
         ccfg.setAtomicityMode(TRANSACTIONAL);
         ccfg.setWriteSynchronizationMode(syncMode);
         ccfg.setMvccEnabled(true);
-        ccfg.setAffinity(new RendezvousAffinityFunction(false, 1));
+        ccfg.setAffinity(new RendezvousAffinityFunction(false, parts));
 
         if (cacheMode == PARTITIONED)
             ccfg.setBackups(backups);

http://git-wip-us.apache.org/repos/asf/ignite/blob/e40b4d9d/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
index bd64bce..e3144b3 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Row.java
@@ -179,4 +179,14 @@ public abstract class GridH2Row implements GridSearchRowPointer, CacheDataRow, R
     @Override public int cacheId() {
         return 0;
     }
+
+    /** {@inheritDoc} */
+    @Override public long mvccUpdateTopologyVersion() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long mvccUpdateCounter() {
+        throw new UnsupportedOperationException();
+    }
 }
\ No newline at end of file