Repository: ignite
Updated Branches:
  refs/heads/master 49fe8cd77 -> 2bb773a8c


IGNITE-8651 VisrTxTask fails when printing transactions having implicit single 
type - Fixes #4096.

Signed-off-by: Alexey Goncharuk <[email protected]>


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

Branch: refs/heads/master
Commit: 2bb773a8cbaebdc029a7a6e0328bd473085a1d08
Parents: 49fe8cd
Author: Aleksei Scherbakov <[email protected]>
Authored: Thu May 31 16:38:33 2018 +0300
Committer: Alexey Goncharuk <[email protected]>
Committed: Thu May 31 16:38:33 2018 +0300

----------------------------------------------------------------------
 .../ignite/internal/visor/tx/VisorTxTask.java   | 12 ++++-
 .../ignite/util/GridCommandHandlerTest.java     | 47 ++++++++++++++------
 2 files changed, 43 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2bb773a8/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/VisorTxTask.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/VisorTxTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/VisorTxTask.java
index 72b1740..b411e29 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/VisorTxTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/tx/VisorTxTask.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.ConcurrentModificationException;
 import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
@@ -32,6 +33,7 @@ import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.compute.ComputeJobResult;
 import 
org.apache.ignite.internal.processors.cache.distributed.GridDistributedTxMapping;
 import 
org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
+import 
org.apache.ignite.internal.processors.cache.distributed.near.IgniteTxMappings;
 import 
org.apache.ignite.internal.processors.cache.transactions.TransactionProxyImpl;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.typedef.F;
@@ -179,10 +181,16 @@ public class VisorTxTask extends 
VisorMultiNodeTask<VisorTxTaskArg, Map<ClusterN
                 int size = 0;
 
                 if (locTx.mappings() != null) {
-                    for (GridDistributedTxMapping mapping : 
locTx.mappings().mappings()) {
+                    IgniteTxMappings txMappings = locTx.mappings();
+
+                    for (GridDistributedTxMapping mapping :
+                        txMappings.single() ? 
Collections.singleton(txMappings.singleMapping()) : txMappings.mappings()) {
+                        if (mapping == null)
+                            continue;
+
                         mappings.add(mapping.primary().id());
 
-                        size += mapping.entries().size(); // Entries are not 
synchronized so no visibility guaranties.
+                        size += mapping.entries().size(); // Entries are not 
synchronized so no visibility guaranties for size.
                     }
                 }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2bb773a8/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java 
b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 8b98ae6..a0b27d2 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -22,6 +22,7 @@ import java.io.File;
 import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.TreeMap;
@@ -47,6 +48,7 @@ import org.apache.ignite.internal.IgniteEx;
 import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.commandline.CommandHandler;
 import org.apache.ignite.internal.commandline.cache.CacheCommand;
+import org.apache.ignite.internal.processors.cache.GridCacheFuture;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.G;
 import org.apache.ignite.internal.util.typedef.X;
@@ -402,7 +404,7 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
             for (VisorTxInfo info : res.getInfos()) {
                 if (info.getSize() == 100) {
-                    toKill[0] = info;
+                    toKill[0] = info; // Store for further use.
 
                     break;
                 }
@@ -411,7 +413,7 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
             assertEquals(3, map.size());
         }, "--tx");
 
-        assertNotNull(toKill);
+        assertNotNull(toKill[0]);
 
         // Test filter by label.
         validate(h, map -> {
@@ -460,21 +462,18 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
         }, "--tx", "order", "DURATION");
 
         // Trigger topology change and test connection.
-        IgniteInternalFuture<?> startFut = multithreadedAsync(new Runnable() {
-            @Override public void run() {
-                try {
-                    startGrid(2);
-                }
-                catch (Exception e) {
-                    fail();
-                }
+        IgniteInternalFuture<?> startFut = multithreadedAsync(() -> {
+            try {
+                startGrid(2);
+            }
+            catch (Exception e) {
+                fail();
             }
         }, 1, "start-node-thread");
 
-        doSleep(5000);
+        doSleep(5000); // Give enough time to reach exchange future.
 
-        assertEquals(EXIT_CODE_OK, execute(h, "--host", "127.0.0.1", "--port", 
"11211", "--tx"));
-        assertEquals(EXIT_CODE_OK, execute(h, "--host", "127.0.0.1", "--port", 
"11212", "--tx"));
+        assertEquals(EXIT_CODE_OK, execute(h, "--tx"));
 
         // Test kill by xid.
         validate(h, map -> {
@@ -486,7 +485,7 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
 
                 assertEquals(toKill[0].getXid(), info.getXid());
             }, "--tx", "kill",
-            "xid", toKill[0].getXid().toString(),
+            "xid", toKill[0].getXid().toString(), // Use saved on first run 
value.
             "nodes", grid(0).localNode().consistentId().toString());
 
         unlockLatch.countDown();
@@ -494,6 +493,10 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
         startFut.get();
 
         fut.get();
+
+        awaitPartitionMapExchange();
+
+        checkFutures();
     }
 
     /**
@@ -880,4 +883,20 @@ public class GridCommandHandlerTest extends 
GridCommonAbstractTest {
             }
         }, 4, "tx-thread");
     }
+
+    /**
+     * Checks if all tx futures are finished.
+     */
+    private void checkFutures() {
+        for (Ignite ignite : G.allGrids()) {
+            IgniteEx ig = (IgniteEx)ignite;
+
+            final Collection<GridCacheFuture<?>> futs = 
ig.context().cache().context().mvcc().activeFutures();
+
+            for (GridCacheFuture<?> fut : futs)
+                log.info("Waiting for future: " + fut);
+
+            assertTrue("Expecting no active futures: node=" + 
ig.localNode().id(), futs.isEmpty());
+        }
+    }
 }

Reply via email to