This is an automated email from the ASF dual-hosted git repository.

namelchev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new b4d57e27c51 IGNITE-22515 Refactored errors output of the control 
utility (#11396)
b4d57e27c51 is described below

commit b4d57e27c5102c358b85293886ff52e7289ba78e
Author: Nikita Amelchev <[email protected]>
AuthorDate: Wed Jun 19 10:05:29 2024 +0300

    IGNITE-22515 Refactored errors output of the control utility (#11396)
---
 .../internal/commandline/CommandHandler.java       | 29 ++------
 .../ignite/internal/commandline/CommandLogger.java | 28 ++++----
 .../apache/ignite/util/GridCommandHandlerTest.java |  5 +-
 .../org/apache/ignite/util/MetricCommandTest.java  |  2 +-
 .../apache/ignite/util/SystemViewCommandTest.java  |  2 +-
 .../ignite/internal/TransactionsMXBeanImpl.java    |  2 +-
 .../internal/client/GridClientClusterState.java    |  5 +-
 .../client/impl/GridClientClusterStateImpl.java    | 13 ++--
 .../ignite/internal/management/StateCommand.java   |  3 +-
 .../internal/management/api/CommandInvoker.java    |  6 +-
 .../internal/management/api/CommandMBean.java      |  8 +--
 .../internal/management/api/CommandUtils.java      | 10 +--
 .../internal/management/api/LocalCommand.java      |  3 +-
 .../management/cache/CacheListCommand.java         |  5 +-
 .../management/cache/CacheMetricsCommand.java      | 23 +++---
 .../management/cache/CacheMetricsTask.java         | 48 ++++++-------
 .../management/cache/CacheMetricsTaskResult.java   | 83 ----------------------
 .../consistency/ConsistencyRepairCommand.java      |  5 +-
 .../management/kill/KillSnapshotCommand.java       |  3 +-
 .../management/kill/SnapshotCancelTask.java        |  4 +-
 .../snapshot/AbstractSnapshotCommand.java          | 13 +---
 .../management/snapshot/SnapshotCancelCommand.java |  2 +-
 .../management/snapshot/SnapshotCheckCommand.java  | 12 +---
 .../management/snapshot/SnapshotCheckTask.java     |  7 +-
 .../management/snapshot/SnapshotCreateCommand.java |  2 +-
 .../management/snapshot/SnapshotCreateTask.java    |  3 +-
 .../management/snapshot/SnapshotOneNodeTask.java   | 38 ----------
 .../snapshot/SnapshotRestoreCommand.java           |  2 +-
 .../management/snapshot/SnapshotRestoreTask.java   |  3 +-
 .../management/snapshot/SnapshotStatusCommand.java | 19 ++---
 .../management/snapshot/SnapshotStatusTask.java    | 12 ++--
 .../internal/management/tx/TxInfoCommand.java      |  3 +-
 .../ignite/internal/visor/VisorMultiNodeTask.java  |  9 ++-
 .../VisorTaskResult.java}                          | 22 +++---
 .../main/resources/META-INF/classnames.properties  |  4 +-
 .../distributed/GridCacheEventAbstractTest.java    |  2 +-
 ...MovingPartitionIsEvictedDuringClearingTest.java |  2 +-
 .../MaintenancePersistenceTaskTest.java            |  8 +--
 .../IncrementalSnapshotRestoreTest.java            |  6 +-
 .../cache/transactions/TxRollbackAsyncTest.java    |  2 +-
 .../junits/common/GridCommonAbstractTest.java      |  7 +-
 .../GridInternalTaskUnusedWalSegmentsTest.java     |  4 +-
 .../db/IgniteCacheGroupsWithRestartsTest.java      | 16 ++---
 .../processors/query/h2/GridIndexRebuildTest.java  | 21 +++---
 44 files changed, 158 insertions(+), 348 deletions(-)

diff --git 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
index 03193621665..98c27b87667 100644
--- 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
+++ 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java
@@ -288,20 +288,10 @@ public class CommandHandler {
 
                     if (args.command() instanceof HelpCommand)
                         printUsage(logger, args.cmdPath().peekLast());
-                    else {
-                        try {
-                            if (args.command() instanceof 
BeforeNodeStartCommand)
-                                lastOperationRes = 
invoker.invokeBeforeNodeStart(logger::info);
-                            else
-                                lastOperationRes = 
invoker.invoke(logger::info, args.verbose());
-                        }
-                        catch (Throwable e) {
-                            logger.error("Failed to perform operation.");
-                            logger.error(CommandLogger.errorMessage(e));
-
-                            throw e;
-                        }
-                    }
+                    else if (args.command() instanceof BeforeNodeStartCommand)
+                        lastOperationRes = 
invoker.invokeBeforeNodeStart(logger::info);
+                    else
+                        lastOperationRes = invoker.invoke(logger::info, 
args.verbose());
 
                     break;
                 }
@@ -335,16 +325,9 @@ public class CommandHandler {
 
             return EXIT_CODE_OK;
         }
-        catch (IllegalArgumentException e) {
-            logger.error("Check arguments. " + errorMessage(e));
-            logger.info("Command [" + cmdName + "] finished with code: " + 
EXIT_CODE_INVALID_ARGUMENTS);
-
-            if (verbose)
-                err = e;
-
-            return EXIT_CODE_INVALID_ARGUMENTS;
-        }
         catch (Throwable e) {
+            logger.error("Failed to perform operation.");
+
             if (isAuthError(e)) {
                 logger.error("Authentication error. " + errorMessage(e));
                 logger.info("Command [" + cmdName + "] finished with code: " + 
ERR_AUTHENTICATION_FAILED);
diff --git 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java
 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java
index 10ebdb03e12..f6cfc23efa4 100644
--- 
a/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java
+++ 
b/modules/control-utility/src/main/java/org/apache/ignite/internal/commandline/CommandLogger.java
@@ -17,28 +17,26 @@
 
 package org.apache.ignite.internal.commandline;
 
+import java.util.stream.Collectors;
+import org.apache.ignite.compute.ComputeUserUndeclaredException;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.X;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * Utility class for creating {@code CommangHandler} log messages.
  */
 public class CommandLogger {
     /**
-     * Generates readable error message from exception
-     * @param e Exctption
-     * @return error message
+     * Generates readable error message from exception.
+     * @param ex Exception.
+     * @return Error message.
      */
-    public static String errorMessage(Throwable e) {
-        String msg = e.getMessage();
-
-        if (F.isEmpty(msg))
-            msg = e.getClass().getName();
-        else if (msg.startsWith("Failed to handle request")) {
-            int p = msg.indexOf("err=");
-
-            msg = msg.substring(p + 4, msg.length() - 1);
-        }
-
-        return msg;
+    public static String errorMessage(Throwable ex) {
+        return X.getThrowableList(ex).stream()
+            .filter(e -> !(e instanceof ComputeUserUndeclaredException))
+            .map(e -> F.isEmpty(e.getMessage()) ? e.getClass().getName() : 
e.getMessage())
+            .distinct()
+            .collect(Collectors.joining(U.nl()));
     }
 }
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 429f818348b..42b8005f378 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -84,7 +84,6 @@ import org.apache.ignite.internal.client.impl.GridClientImpl;
 import org.apache.ignite.internal.client.util.GridConcurrentHashSet;
 import 
org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceTaskResult;
 import org.apache.ignite.internal.management.cache.IdleVerifyDumpTask;
-import org.apache.ignite.internal.management.snapshot.SnapshotTaskResult;
 import org.apache.ignite.internal.management.tx.TxInfo;
 import org.apache.ignite.internal.management.tx.TxTaskResult;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
@@ -3247,7 +3246,7 @@ public class GridCommandHandlerTest extends 
GridCommandHandlerClusterPerMethodAb
                 waitForCondition(endTimeMetricPredicate::getAsBoolean, 
getTestTimeout()));
         }
 
-        assertContains(log, 
(String)((SnapshotTaskResult)h.getLastOperationResult()).result(), snpName);
+        assertContains(log, (String)h.getLastOperationResult(), snpName);
 
         stopAllGrids();
 
@@ -3321,7 +3320,7 @@ public class GridCommandHandlerTest extends 
GridCommandHandlerClusterPerMethodAb
 
         StringBuilder sb = new StringBuilder();
 
-        
((SnapshotPartitionsVerifyTaskResult)((SnapshotTaskResult)h.getLastOperationResult()).result()).print(sb::append);
+        
((SnapshotPartitionsVerifyTaskResult)h.getLastOperationResult()).print(sb::append);
 
         assertContains(log, sb.toString(), "The check procedure has finished, 
no conflicts have been found");
     }
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java
index 4933ea4275a..3197a041273 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/MetricCommandTest.java
@@ -108,7 +108,7 @@ public class MetricCommandTest extends 
GridCommandHandlerClusterByClassAbstractT
 
         assertContains(log,
             executeCommand(EXIT_CODE_INVALID_ARGUMENTS, CMD_METRIC, 
"--node-id", incorrectNodeId, IGNITE_METRICS),
-            "Failed to perform operation.\nNode with id=" + incorrectNodeId + 
" not found");
+            "Check arguments. Node with id=" + incorrectNodeId + " not found");
     }
 
     /** Tests command output in case nonexistent metric name is specified. */
diff --git 
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
 
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
index 7ec28653395..17aba103540 100644
--- 
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
+++ 
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
@@ -243,7 +243,7 @@ public class SystemViewCommandTest extends 
GridCommandHandlerClusterByClassAbstr
 
         assertContains(log,
             executeCommand(EXIT_CODE_INVALID_ARGUMENTS, CMD_SYS_VIEW, NODE_ID, 
incorrectNodeId, CACHES_VIEW),
-            "Failed to perform operation.\nNode with id=" + incorrectNodeId + 
" not found");
+            "Check arguments. Node with id=" + incorrectNodeId + " not found");
     }
 
     /** Tests command output in case nonexistent system view names is 
specified. */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
index 89315e303bb..b6e9293bf55 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/TransactionsMXBeanImpl.java
@@ -85,7 +85,7 @@ public class TransactionsMXBeanImpl implements 
TransactionsMXBean {
             Map<ClusterNode, TxTaskResult> res = ctx.task().execute(
                 new TxTask(),
                 new VisorTaskArgument<>(ctx.cluster().get().localNode().id(), 
arg, false)
-            ).get();
+            ).get().result();
 
             if (detailed) {
                 StringWriter sw = new StringWriter();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java
index 602d48bb228..23aa571bae4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/GridClientClusterState.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.client;
 
 import java.util.UUID;
-
 import org.apache.ignite.cluster.ClusterState;
 
 /**
@@ -36,14 +35,14 @@ public interface GridClientClusterState {
      *
      * @return ID of the cluster.
      */
-    public UUID id() throws GridClientException;
+    public UUID id() throws Exception;
 
     /**
      * User-defined tag of cluster STATE command was sent to.
      *
      * @return Tag of the cluster.
      */
-    public String tag() throws GridClientException;
+    public String tag() throws Exception;
 
     /**
      * Changes cluster state to {@code newState}.
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java
index 4f63043a72a..da13d1d4ed8 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/client/impl/GridClientClusterStateImpl.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.client.GridClientPredicate;
 import org.apache.ignite.internal.client.balancer.GridClientLoadBalancer;
 import org.apache.ignite.internal.client.impl.connection.GridClientConnection;
 import org.apache.ignite.internal.visor.VisorTaskArgument;
+import org.apache.ignite.internal.visor.VisorTaskResult;
 import org.apache.ignite.internal.visor.misc.VisorIdAndTagViewTask;
 import org.apache.ignite.internal.visor.misc.VisorIdAndTagViewTaskResult;
 
@@ -42,8 +43,8 @@ public class GridClientClusterStateImpl extends 
GridClientAbstractProjection<Gri
     /**
      * Closure to execute Cluster ID and Tag view action on cluster.
      */
-    private static final ClientProjectionClosure<VisorIdAndTagViewTaskResult> 
ID_AND_TAG_VIEW_CL = (conn, nodeId) ->
-        conn.execute(
+    private static final 
ClientProjectionClosure<VisorTaskResult<VisorIdAndTagViewTaskResult>> 
ID_AND_TAG_VIEW_CL =
+        (conn, nodeId) -> conn.execute(
             VisorIdAndTagViewTask.class.getName(),
             new VisorTaskArgument<>(nodeId, null, false),
             nodeId,
@@ -92,13 +93,13 @@ public class GridClientClusterStateImpl extends 
GridClientAbstractProjection<Gri
     }
 
     /** {@inheritDoc} */
-    @Override public UUID id() throws GridClientException {
-        return withReconnectHandling(ID_AND_TAG_VIEW_CL).get().id();
+    @Override public UUID id() throws Exception {
+        return withReconnectHandling(ID_AND_TAG_VIEW_CL).get().result().id();
     }
 
     /** {@inheritDoc} */
-    @Override public String tag() throws GridClientException {
-        return withReconnectHandling(ID_AND_TAG_VIEW_CL).get().tag();
+    @Override public String tag() throws Exception {
+        return withReconnectHandling(ID_AND_TAG_VIEW_CL).get().result().tag();
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
index 21eca4fd8a1..73444ca0bf5 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/StateCommand.java
@@ -23,7 +23,6 @@ import org.apache.ignite.Ignite;
 import org.apache.ignite.cluster.ClusterState;
 import org.apache.ignite.internal.client.GridClient;
 import org.apache.ignite.internal.client.GridClientClusterState;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.management.api.LocalCommand;
 import org.apache.ignite.internal.management.api.NoArg;
 import org.apache.ignite.internal.util.lang.GridTuple3;
@@ -50,7 +49,7 @@ public class StateCommand implements LocalCommand<NoArg, 
GridTuple3<UUID, String
         @Nullable Ignite ignite,
         NoArg arg,
         Consumer<String> printer
-    ) throws GridClientException {
+    ) throws Exception {
         ClusterState state;
         UUID id;
         String tag;
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
index 0c500bca629..250db201128 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandInvoker.java
@@ -55,7 +55,7 @@ public class CommandInvoker<A extends 
IgniteDataTransferObject> {
     /**
      * @param printer Result printer.
      * @return {@code True} of command successfully prepared and can be 
invoked, {@code false} otherwise.
-     * @throws GridClientException In failed.
+     * @throws GridClientException If failed.
      */
     public boolean prepare(Consumer<String> printer) throws 
GridClientException {
         if (!(cmd instanceof PreparableCommand))
@@ -70,9 +70,9 @@ public class CommandInvoker<A extends 
IgniteDataTransferObject> {
      * @param printer Result printer.
      * @param verbose Use verbose mode or not
      * @return Result of operation (mostly usable for tests).
-     * @throws GridClientException In failed.
+     * @throws Exception If failed.
      */
-    public <R> R invoke(Consumer<String> printer, boolean verbose) throws 
GridClientException {
+    public <R> R invoke(Consumer<String> printer, boolean verbose) throws 
Exception {
         R res;
 
         if (cmd instanceof LocalCommand)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandMBean.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandMBean.java
index 9af32a2a4ad..caa66e36853 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandMBean.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandMBean.java
@@ -35,7 +35,6 @@ import javax.management.MBeanParameterInfo;
 import javax.management.ReflectionException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
 import org.apache.ignite.internal.util.typedef.F;
 
@@ -129,15 +128,10 @@ public class CommandMBean<A extends 
IgniteDataTransferObject, R> implements Dyna
 
             return resStr.toString();
         }
-        catch (GridClientException e) {
-            log.error("Invoke error:", e);
-
-            throw new RuntimeException(e);
-        }
         catch (Exception e) {
             log.error("Invoke error:", e);
 
-            throw e;
+            throw new RuntimeException(e);
         }
     }
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
index 4fb79b9794d..e4f3ed4fb0d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/CommandUtils.java
@@ -55,6 +55,7 @@ import org.apache.ignite.internal.util.typedef.internal.SB;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorMultiNodeTask;
 import org.apache.ignite.internal.visor.VisorTaskArgument;
+import org.apache.ignite.internal.visor.VisorTaskResult;
 import org.apache.ignite.lang.IgniteExperimental;
 import org.apache.ignite.lang.IgniteUuid;
 import org.jetbrains.annotations.Nullable;
@@ -767,7 +768,7 @@ public class CommandUtils {
         Class<? extends VisorMultiNodeTask<A, R, ?>> taskCls,
         A arg,
         Collection<GridClientNode> nodes
-    ) throws GridClientException {
+    ) throws Exception {
         Collection<UUID> nodesIds = nodes.stream()
             .map(GridClientNode::nodeId)
             .collect(Collectors.toList());
@@ -783,15 +784,16 @@ public class CommandUtils {
             if (!connectable.isEmpty())
                 compute = compute.projection(connectable);
 
-            return compute.execute(
+            return ((VisorTaskResult<R>)compute.execute(
                 taskCls.getName(),
                 new VisorTaskArgument<>(nodesIds, arg, false)
-            );
+            )).result();
         }
 
         return ignite
             .compute(ignite.cluster())
-            .execute(taskCls, new VisorTaskArgument<>(nodesIds, arg, false));
+            .execute(taskCls, new VisorTaskArgument<>(nodesIds, arg, false))
+            .result();
     }
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
index d8f3976660e..a878708fa72 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/api/LocalCommand.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.management.api;
 import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.client.GridClient;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
@@ -44,5 +43,5 @@ public interface LocalCommand<A extends 
IgniteDataTransferObject, R> extends Com
      * @param printer Results printer.
      * @return Command result.
      */
-    public R execute(@Nullable GridClient cli, @Nullable Ignite ignite, A arg, 
Consumer<String> printer) throws GridClientException;
+    R execute(@Nullable GridClient cli, @Nullable Ignite ignite, A arg, 
Consumer<String> printer) throws Exception;
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
index f76c4a258a6..3cff6b84c3a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheListCommand.java
@@ -28,7 +28,6 @@ import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.internal.client.GridClient;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
 import org.apache.ignite.internal.management.api.LocalCommand;
@@ -64,7 +63,7 @@ public class CacheListCommand implements 
LocalCommand<CacheListCommandArg, ViewC
         @Nullable Ignite ignite,
         CacheListCommandArg arg,
         Consumer<String> printer
-    ) throws GridClientException {
+    ) throws Exception {
         ViewCacheCmd cmd = arg.groups()
             ? GROUPS
             : (arg.seq() ? SEQ : CACHES);
@@ -98,7 +97,7 @@ public class CacheListCommand implements 
LocalCommand<CacheListCommandArg, ViewC
         CacheListCommandArg arg,
         ViewCacheTaskResult viewRes,
         Consumer<String> printer
-    ) throws GridClientException {
+    ) throws Exception {
         Collection<GridClientNode> nodes = nodes(cli, ignite)
             .stream()
             .filter(FILTER.apply(arg))
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsCommand.java
index d4d68cfa494..ac567065bda 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsCommand.java
@@ -18,9 +18,9 @@
 package org.apache.ignite.internal.management.cache;
 
 import java.util.List;
+import java.util.Map;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
-import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.management.api.ComputeCommand;
 
 import static java.util.Arrays.asList;
@@ -28,7 +28,7 @@ import static 
org.apache.ignite.internal.management.SystemViewCommand.printTable
 import static 
org.apache.ignite.internal.management.SystemViewTask.SimpleType.STRING;
 
 /** Enable / disable cache metrics collection or show metrics collection 
status. */
-public class CacheMetricsCommand implements 
ComputeCommand<CacheMetricsCommandArg, CacheMetricsTaskResult> {
+public class CacheMetricsCommand implements 
ComputeCommand<CacheMetricsCommandArg, Map<String, Boolean>> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Manages user cache metrics collection: enables, disables it or 
shows status";
@@ -45,17 +45,12 @@ public class CacheMetricsCommand implements 
ComputeCommand<CacheMetricsCommandAr
     }
 
     /** {@inheritDoc} */
-    @Override public void printResult(CacheMetricsCommandArg arg, 
CacheMetricsTaskResult res, Consumer<String> printer) {
-        try {
-            List<List<?>> values = res.result().entrySet()
-                .stream()
-                .map(e -> asList(e.getKey(), e.getValue() ? "enabled" : 
"disabled"))
-                .collect(Collectors.toList());
-
-            printTable(asList("Cache Name", "Metrics Status"), asList(STRING, 
STRING), values, printer);
-        }
-        catch (Exception e) {
-            throw new IgniteException(e);
-        }
+    @Override public void printResult(CacheMetricsCommandArg arg, Map<String, 
Boolean> res, Consumer<String> printer) {
+        List<List<?>> values = res.entrySet()
+            .stream()
+            .map(e -> asList(e.getKey(), e.getValue() ? "enabled" : 
"disabled"))
+            .collect(Collectors.toList());
+
+        printTable(asList("Cache Name", "Metrics Status"), asList(STRING, 
STRING), values, printer);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTask.java
index 79e18d91260..2ececb51a2a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTask.java
@@ -35,7 +35,7 @@ import static 
org.apache.ignite.internal.management.cache.CacheMetricsOperation.
  * Task for a cache metrics command.
  */
 @GridInternal
-public class CacheMetricsTask extends VisorOneNodeTask<CacheMetricsCommandArg, 
CacheMetricsTaskResult> {
+public class CacheMetricsTask extends VisorOneNodeTask<CacheMetricsCommandArg, 
Map<String, Boolean>> {
     /** Serial version uid. */
     private static final long serialVersionUID = 0L;
 
@@ -47,9 +47,8 @@ public class CacheMetricsTask extends 
VisorOneNodeTask<CacheMetricsCommandArg, C
     /**
      * Job returns {@link Map} with names of processed caches paired with 
corresponding metrics collection statuses or
      * exception, caught during execution of job.
-     * Results are passed into instance of wrapper class {@link 
CacheMetricsTaskResult}.
      */
-    private static class CacheMetricsJob extends 
VisorJob<CacheMetricsCommandArg, CacheMetricsTaskResult> {
+    private static class CacheMetricsJob extends 
VisorJob<CacheMetricsCommandArg, Map<String, Boolean>> {
         /** Serial version uid. */
         private static final long serialVersionUID = 0L;
 
@@ -64,32 +63,25 @@ public class CacheMetricsTask extends 
VisorOneNodeTask<CacheMetricsCommandArg, C
         }
 
         /** {@inheritDoc} */
-        @Override protected CacheMetricsTaskResult run(@Nullable 
CacheMetricsCommandArg arg)
-            throws IgniteException {
-            if (arg != null) {
-                Collection<String> cacheNames = F.isEmpty(arg.caches()) ? 
ignite.cacheNames() : Arrays.asList(arg.caches());
-
-                try {
-                    switch (arg.operation()) {
-                        case ENABLE:
-                        case DISABLE:
-                            ignite.cluster().enableStatistics(cacheNames, 
ENABLE == arg.operation());
-
-                            return new 
CacheMetricsTaskResult(cacheMetricsStatus(cacheNames));
-
-                        case STATUS:
-                            return new 
CacheMetricsTaskResult(cacheMetricsStatus(cacheNames));
-
-                        default:
-                            throw new IllegalStateException("Unexpected value: 
" + arg.operation());
-                    }
-                }
-                catch (Exception e) {
-                    return new CacheMetricsTaskResult(e);
-                }
-            }
+        @Override protected Map<String, Boolean> run(@Nullable 
CacheMetricsCommandArg arg) throws IgniteException {
+            if (arg == null)
+                return null;
+
+            Collection<String> cacheNames = F.isEmpty(arg.caches()) ? 
ignite.cacheNames() : Arrays.asList(arg.caches());
+
+            switch (arg.operation()) {
+                case ENABLE:
+                case DISABLE:
+                    ignite.cluster().enableStatistics(cacheNames, ENABLE == 
arg.operation());
 
-            return null;
+                    return cacheMetricsStatus(cacheNames);
+
+                case STATUS:
+                    return cacheMetricsStatus(cacheNames);
+
+                default:
+                    throw new IllegalStateException("Unexpected value: " + 
arg.operation());
+            }
         }
 
         /**
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTaskResult.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTaskResult.java
deleted file mode 100644
index d8b0418b893..00000000000
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/cache/CacheMetricsTaskResult.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.management.cache;
-
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Collections;
-import java.util.Map;
-import org.apache.ignite.internal.dto.IgniteDataTransferObject;
-import org.apache.ignite.internal.util.typedef.internal.U;
-
-/**
- * Result wrapper for {@link CacheMetricsTask}.
- */
-public class CacheMetricsTaskResult extends IgniteDataTransferObject {
-    /** Serial version uid. */
-    private static final long serialVersionUID = 0L;
-
-    /** Task result. */
-    private Map<String, Boolean> result;
-
-    /** Task execution error. */
-    private Exception error;
-
-    /**
-     * Default constructor.
-     */
-    public CacheMetricsTaskResult() {
-        // No-op.
-    }
-
-    /**
-     * @param result Task execution result.
-     */
-    public CacheMetricsTaskResult(Map<String, Boolean> result) {
-        this.result = Collections.unmodifiableMap(result);
-    }
-
-    /**
-     * @param error Task execution error.
-     */
-    public CacheMetricsTaskResult(Exception error) {
-        this.error = error;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void writeExternalData(ObjectOutput out) throws 
IOException {
-        U.writeMap(out, result);
-        out.writeObject(error);
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void readExternalData(byte protoVer, ObjectInput in) 
throws IOException, ClassNotFoundException {
-        result = U.readMap(in);
-        error = (Exception)in.readObject();
-    }
-
-    /**
-     * Get task result or task execution error.
-     */
-    public Map<String, Boolean> result() throws Exception {
-        if (error != null)
-            throw error;
-
-        return Collections.unmodifiableMap(result);
-    }
-}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
index a6bdac934b7..61f1f7c644f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/consistency/ConsistencyRepairCommand.java
@@ -24,7 +24,6 @@ import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.client.GridClient;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
 import org.apache.ignite.internal.management.api.LocalCommand;
@@ -53,7 +52,7 @@ public class ConsistencyRepairCommand implements 
LocalCommand<ConsistencyRepairC
         @Nullable Ignite ignite,
         ConsistencyRepairCommandArg arg,
         Consumer<String> printer
-    ) throws GridClientException, IgniteException {
+    ) throws Exception {
         StringBuilder sb = new StringBuilder();
         boolean failed = false;
 
@@ -89,7 +88,7 @@ public class ConsistencyRepairCommand implements 
LocalCommand<ConsistencyRepairC
         ConsistencyRepairCommandArg arg,
         Collection<GridClientNode> nodes,
         StringBuilder sb
-    ) throws GridClientException {
+    ) throws Exception {
         boolean failed = false;
 
         ConsistencyTaskResult res = CommandUtils.execute(
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/kill/KillSnapshotCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/kill/KillSnapshotCommand.java
index 9eda58ff183..8becd2c1fec 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/kill/KillSnapshotCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/kill/KillSnapshotCommand.java
@@ -19,10 +19,9 @@ package org.apache.ignite.internal.management.kill;
 
 import org.apache.ignite.internal.management.api.ComputeCommand;
 import 
org.apache.ignite.internal.management.kill.SnapshotCancelTask.CancelSnapshotArg;
-import org.apache.ignite.internal.management.snapshot.SnapshotTaskResult;
 
 /** */
-public class KillSnapshotCommand implements ComputeCommand<CancelSnapshotArg, 
SnapshotTaskResult> {
+public class KillSnapshotCommand implements ComputeCommand<CancelSnapshotArg, 
String> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Kill running snapshot by snapshot name";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/kill/SnapshotCancelTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/kill/SnapshotCancelTask.java
index 93116489de1..0a466a008d6 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/kill/SnapshotCancelTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/kill/SnapshotCancelTask.java
@@ -22,17 +22,17 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
 import 
org.apache.ignite.internal.management.kill.SnapshotCancelTask.CancelSnapshotArg;
 import org.apache.ignite.internal.management.snapshot.SnapshotJob;
-import org.apache.ignite.internal.management.snapshot.SnapshotOneNodeTask;
 import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSnapshotManager;
 import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotMXBeanImpl;
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 
 /**
  * @see IgniteSnapshotManager#cancelSnapshotOperation(UUID)
  */
 @GridInternal
-public class SnapshotCancelTask extends SnapshotOneNodeTask<CancelSnapshotArg, 
String> {
+public class SnapshotCancelTask extends VisorOneNodeTask<CancelSnapshotArg, 
String> {
     /** Serial version uid. */
     private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/AbstractSnapshotCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/AbstractSnapshotCommand.java
index 3a27d0fedff..df5de62544d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/AbstractSnapshotCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/AbstractSnapshotCommand.java
@@ -18,20 +18,13 @@
 package org.apache.ignite.internal.management.snapshot;
 
 import java.util.function.Consumer;
-import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.dto.IgniteDataTransferObject;
 import org.apache.ignite.internal.management.api.ComputeCommand;
 
 /** */
-public abstract class AbstractSnapshotCommand<A extends 
IgniteDataTransferObject>
-    implements ComputeCommand<A, SnapshotTaskResult> {
+public abstract class AbstractSnapshotCommand<A extends 
IgniteDataTransferObject, R> implements ComputeCommand<A, R> {
     /** {@inheritDoc} */
-    @Override public void printResult(A arg, SnapshotTaskResult res, 
Consumer<String> printer) {
-        try {
-            printer.accept(String.valueOf(res.result()));
-        }
-        catch (Exception e) {
-            throw new IgniteException(e);
-        }
+    @Override public void printResult(A arg, R res, Consumer<String> printer) {
+        printer.accept(String.valueOf(res));
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCancelCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCancelCommand.java
index 7285ac15a0c..1dd9ba2f758 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCancelCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCancelCommand.java
@@ -21,7 +21,7 @@ import 
org.apache.ignite.internal.management.kill.SnapshotCancelTask;
 import 
org.apache.ignite.internal.management.kill.SnapshotCancelTask.CancelSnapshotArg;
 
 /** */
-public class SnapshotCancelCommand extends 
AbstractSnapshotCommand<CancelSnapshotArg> {
+public class SnapshotCancelCommand extends 
AbstractSnapshotCommand<CancelSnapshotArg, String> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Cancel running snapshot operation";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckCommand.java
index 22336e3c002..11f833819c0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckCommand.java
@@ -18,11 +18,10 @@
 package org.apache.ignite.internal.management.snapshot;
 
 import java.util.function.Consumer;
-import org.apache.ignite.IgniteException;
 import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotPartitionsVerifyTaskResult;
 
 /** */
-public class SnapshotCheckCommand extends 
AbstractSnapshotCommand<SnapshotCheckCommandArg> {
+public class SnapshotCheckCommand extends 
AbstractSnapshotCommand<SnapshotCheckCommandArg, 
SnapshotPartitionsVerifyTaskResult> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Check snapshot";
@@ -39,12 +38,7 @@ public class SnapshotCheckCommand extends 
AbstractSnapshotCommand<SnapshotCheckC
     }
 
     /** {@inheritDoc} */
-    @Override public void printResult(SnapshotCheckCommandArg arg, 
SnapshotTaskResult res0, Consumer<String> printer) {
-        try {
-            ((SnapshotPartitionsVerifyTaskResult)res0.result()).print(printer);
-        }
-        catch (Exception e) {
-            throw new IgniteException(e);
-        }
+    @Override public void printResult(SnapshotCheckCommandArg arg, 
SnapshotPartitionsVerifyTaskResult res, Consumer<String> printer) {
+        res.print(printer);
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckTask.java
index c467585d862..0d48dac64cc 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCheckTask.java
@@ -23,13 +23,13 @@ import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.Snapshot
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.future.IgniteFutureImpl;
 import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 
 /**
  * @see IgniteSnapshotManager#checkSnapshot(String, String)
  */
 @GridInternal
-public class SnapshotCheckTask extends 
SnapshotOneNodeTask<SnapshotCheckCommandArg,
-    SnapshotPartitionsVerifyTaskResult> {
+public class SnapshotCheckTask extends 
VisorOneNodeTask<SnapshotCheckCommandArg, SnapshotPartitionsVerifyTaskResult> {
     /** Serial version uid. */
     private static final long serialVersionUID = 0L;
 
@@ -39,8 +39,7 @@ public class SnapshotCheckTask extends 
SnapshotOneNodeTask<SnapshotCheckCommandA
     }
 
     /** */
-    private static class SnapshotCheckJob extends 
SnapshotJob<SnapshotCheckCommandArg,
-            SnapshotPartitionsVerifyTaskResult> {
+    private static class SnapshotCheckJob extends 
SnapshotJob<SnapshotCheckCommandArg, SnapshotPartitionsVerifyTaskResult> {
         /** Serial version uid. */
         private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateCommand.java
index c8c82d1a206..23e521ef8db 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateCommand.java
@@ -18,7 +18,7 @@
 package org.apache.ignite.internal.management.snapshot;
 
 /** */
-public class SnapshotCreateCommand extends 
AbstractSnapshotCommand<SnapshotCreateCommandArg> {
+public class SnapshotCreateCommand extends 
AbstractSnapshotCommand<SnapshotCreateCommandArg, String> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Create cluster snapshot";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateTask.java
index e236ad6fc7c..8d4cec81e3a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotCreateTask.java
@@ -23,12 +23,13 @@ import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSn
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.future.IgniteFutureImpl;
 import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 
 /**
  * @see IgniteSnapshot#createSnapshot(String)
  */
 @GridInternal
-public class SnapshotCreateTask extends 
SnapshotOneNodeTask<SnapshotCreateCommandArg, String> {
+public class SnapshotCreateTask extends 
VisorOneNodeTask<SnapshotCreateCommandArg, String> {
     /** Serial version uid. */
     private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotOneNodeTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotOneNodeTask.java
deleted file mode 100644
index d2b9fec8d1b..00000000000
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotOneNodeTask.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.management.snapshot;
-
-import java.util.List;
-import org.apache.ignite.compute.ComputeJobResult;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.visor.VisorMultiNodeTask;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Base class for single node visor snapshot task.
- */
-public abstract class SnapshotOneNodeTask<A, R> extends VisorMultiNodeTask<A, 
SnapshotTaskResult, R> {
-    /** {@inheritDoc} */
-    @Nullable @Override protected SnapshotTaskResult 
reduce0(List<ComputeJobResult> results) {
-        assert results.size() == 1 : results.size();
-
-        ComputeJobResult res = F.first(results);
-
-        return new SnapshotTaskResult(res.getData(), res.getException());
-    }
-}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreCommand.java
index b904513f9f9..7ba5185e447 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreCommand.java
@@ -20,7 +20,7 @@ package org.apache.ignite.internal.management.snapshot;
 import org.jetbrains.annotations.Nullable;
 
 /** */
-public class SnapshotRestoreCommand extends 
AbstractSnapshotCommand<SnapshotRestoreCommandArg> {
+public class SnapshotRestoreCommand extends 
AbstractSnapshotCommand<SnapshotRestoreCommandArg, String> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Restore snapshot";
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreTask.java
index d238c7bc69d..15173895266 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotRestoreTask.java
@@ -24,12 +24,13 @@ import 
org.apache.ignite.internal.processors.cache.persistence.snapshot.IgniteSn
 import org.apache.ignite.internal.processors.task.GridInternal;
 import org.apache.ignite.internal.util.future.IgniteFutureImpl;
 import org.apache.ignite.internal.visor.VisorJob;
+import org.apache.ignite.internal.visor.VisorOneNodeTask;
 
 /**
  * Visor snapshot restore task.
  */
 @GridInternal
-public class SnapshotRestoreTask extends 
SnapshotOneNodeTask<SnapshotRestoreCommandArg, String> {
+public class SnapshotRestoreTask extends 
VisorOneNodeTask<SnapshotRestoreCommandArg, String> {
     /** Serial version uid. */
     private static final long serialVersionUID = 0L;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusCommand.java
index 7a063f800fe..18f4fc5b690 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusCommand.java
@@ -26,10 +26,10 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
-import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.management.SystemViewCommand;
 import org.apache.ignite.internal.management.SystemViewTask;
 import org.apache.ignite.internal.management.api.NoArg;
+import 
org.apache.ignite.internal.management.snapshot.SnapshotStatusTask.SnapshotStatus;
 import org.apache.ignite.internal.util.GridStringBuilder;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T5;
@@ -40,7 +40,7 @@ import static 
org.apache.ignite.internal.management.SystemViewTask.SimpleType.NU
 import static 
org.apache.ignite.internal.management.SystemViewTask.SimpleType.STRING;
 
 /** */
-public class SnapshotStatusCommand extends AbstractSnapshotCommand<NoArg> {
+public class SnapshotStatusCommand extends AbstractSnapshotCommand<NoArg, 
SnapshotStatus> {
     /** {@inheritDoc} */
     @Override public String description() {
         return "Get the status of the current snapshot operation";
@@ -57,24 +57,13 @@ public class SnapshotStatusCommand extends 
AbstractSnapshotCommand<NoArg> {
     }
 
     /** {@inheritDoc} */
-    @Override public void printResult(NoArg arg, SnapshotTaskResult res0, 
Consumer<String> printer) {
-        Object res;
-
-        try {
-            res = res0.result();
-        }
-        catch (Exception e) {
-            throw new IgniteException(e);
-        }
-
-        if (res == null) {
+    @Override public void printResult(NoArg arg, SnapshotStatus status, 
Consumer<String> printer) {
+        if (status == null) {
             printer.accept("There is no create or restore snapshot operation 
in progress.");
 
             return;
         }
 
-        SnapshotStatusTask.SnapshotStatus status = 
(SnapshotStatusTask.SnapshotStatus)res;
-
         boolean isCreating = status.operation() == 
SnapshotStatusTask.SnapshotOperation.CREATE;
         boolean isIncremental = status.incrementIndex() > 0;
 
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusTask.java
index 830c52d3d80..6d774c3262c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotStatusTask.java
@@ -49,7 +49,7 @@ import static 
org.apache.ignite.internal.processors.cache.persistence.snapshot.S
  * Task to get the status of the current snapshot operation in the cluster.
  */
 @GridInternal
-public class SnapshotStatusTask extends VisorMultiNodeTask<NoArg, 
SnapshotTaskResult, SnapshotStatus> {
+public class SnapshotStatusTask extends VisorMultiNodeTask<NoArg, 
SnapshotStatus, SnapshotStatus> {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -64,21 +64,21 @@ public class SnapshotStatusTask extends 
VisorMultiNodeTask<NoArg, SnapshotTaskRe
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected SnapshotTaskResult 
reduce0(List<ComputeJobResult> results) {
+    @Nullable @Override protected SnapshotStatus 
reduce0(List<ComputeJobResult> results) {
         if (results.isEmpty())
-            return new SnapshotTaskResult(null, new IgniteException("Failed to 
get the snapshot status. Topology is empty."));
+            throw new IgniteException("Failed to get the snapshot status. 
Topology is empty.");
 
         IgniteException error = F.find(F.viewReadOnly(results, 
ComputeJobResult::getException,
             r -> r.getException() != null), null, F.notNull());
 
         if (error != null)
-            return new SnapshotTaskResult(null, new IgniteException("Failed to 
get the snapshot status.", error));
+            throw new IgniteException("Failed to get the snapshot status.", 
error);
 
         Collection<SnapshotStatus> res = F.viewReadOnly(results, 
ComputeJobResult::getData, r -> r.getData() != null);
 
         // There is no snapshot operation.
         if (res.isEmpty())
-            return new SnapshotTaskResult(null, null);
+            return null;
 
         SnapshotStatus s0 = F.first(res);
 
@@ -90,7 +90,7 @@ public class SnapshotStatusTask extends 
VisorMultiNodeTask<NoArg, SnapshotTaskRe
 
         res.forEach(s -> progress.putAll(s.progress));
 
-        return new SnapshotTaskResult(new SnapshotStatus(s0.op, s0.name, 
s0.incIdx, s0.requestId, s0.startTime, progress), null);
+        return new SnapshotStatus(s0.op, s0.name, s0.incIdx, s0.requestId, 
s0.startTime, progress);
     }
 
     /** */
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
index 0d8bfc2ac33..6823cda9b7b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/management/tx/TxInfoCommand.java
@@ -27,7 +27,6 @@ import java.util.function.Consumer;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.client.GridClient;
-import org.apache.ignite.internal.client.GridClientException;
 import org.apache.ignite.internal.client.GridClientNode;
 import org.apache.ignite.internal.management.api.CommandUtils;
 import org.apache.ignite.internal.management.api.LocalCommand;
@@ -58,7 +57,7 @@ public class TxInfoCommand implements 
LocalCommand<AbstractTxCommandArg, Map<Clu
         @Nullable Ignite ignite,
         AbstractTxCommandArg arg0,
         Consumer<String> printer
-    ) throws GridClientException {
+    ) throws Exception {
         TxInfoCommandArg arg = (TxInfoCommandArg)arg0;
 
         Optional<GridClientNode> node = CommandUtils.nodes(cli, 
ignite).stream()
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
index 70f08bada1f..0c7b159969e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorMultiNodeTask.java
@@ -44,7 +44,7 @@ import static 
org.apache.ignite.internal.visor.util.VisorTaskUtils.logStart;
  * @param <R> Task result type.
  * @param <J> Job result type
  */
-public abstract class VisorMultiNodeTask<A, R, J> implements 
ComputeTask<VisorTaskArgument<A>, R> {
+public abstract class VisorMultiNodeTask<A, R, J> implements 
ComputeTask<VisorTaskArgument<A>, VisorTaskResult<R>> {
     /** Auto-injected grid instance. */
     @IgniteInstanceResource
     protected transient IgniteEx ignite;
@@ -135,9 +135,12 @@ public abstract class VisorMultiNodeTask<A, R, J> 
implements ComputeTask<VisorTa
     @Nullable protected abstract R reduce0(List<ComputeJobResult> results) 
throws IgniteException;
 
     /** {@inheritDoc} */
-    @Nullable @Override public final R reduce(List<ComputeJobResult> results) {
+    @Nullable @Override public final VisorTaskResult<R> 
reduce(List<ComputeJobResult> results) {
         try {
-            return reduce0(results);
+            return new VisorTaskResult<>(reduce0(results), null);
+        }
+        catch (Exception e) {
+            return new VisorTaskResult<>(null, e);
         }
         finally {
             if (debug)
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotTaskResult.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskResult.java
similarity index 78%
rename from 
modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotTaskResult.java
rename to 
modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskResult.java
index a9dd29e5f1f..2b41e927c15 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/management/snapshot/SnapshotTaskResult.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/visor/VisorTaskResult.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.management.snapshot;
+package org.apache.ignite.internal.visor;
 
 import java.io.IOException;
 import java.io.ObjectInput;
@@ -24,20 +24,20 @@ import 
org.apache.ignite.internal.dto.IgniteDataTransferObject;
 import org.jetbrains.annotations.Nullable;
 
 /**
- * Snapshot task result wrapper.
+ * Management task result.
  */
-public class SnapshotTaskResult extends IgniteDataTransferObject {
+public class VisorTaskResult<R> extends IgniteDataTransferObject {
     /** Serial version UID. */
     private static final long serialVersionUID = 0L;
 
     /** Task result. */
-    private @Nullable Object res;
+    private @Nullable R res;
 
     /** Error. */
     private @Nullable Exception err;
 
-    /** Default constructor. */
-    public SnapshotTaskResult() {
+    /** */
+    public VisorTaskResult() {
         // No-op.
     }
 
@@ -45,16 +45,16 @@ public class SnapshotTaskResult extends 
IgniteDataTransferObject {
      * @param res Task result.
      * @param err Error.
      */
-    public SnapshotTaskResult(@Nullable Object res, @Nullable Exception err) {
-        this.err = err;
+    public VisorTaskResult(@Nullable R res, @Nullable Exception err) {
         this.res = res;
+        this.err = err;
     }
 
     /**
      * @return Task result.
-     * @throws Exception if the job was completed with an error.
+     * @throws Exception if the task was completed with an error.
      */
-    public @Nullable Object result() throws Exception {
+    public @Nullable R result() throws Exception {
         if (err != null)
             throw err;
 
@@ -69,7 +69,7 @@ public class SnapshotTaskResult extends 
IgniteDataTransferObject {
 
     /** {@inheritDoc} */
     @Override protected void readExternalData(byte ver, ObjectInput in) throws 
IOException, ClassNotFoundException {
-        res = in.readObject();
+        res = (R)in.readObject();
         err = (Exception)in.readObject();
     }
 }
diff --git a/modules/core/src/main/resources/META-INF/classnames.properties 
b/modules/core/src/main/resources/META-INF/classnames.properties
index d64b665f098..e4544198795 100644
--- a/modules/core/src/main/resources/META-INF/classnames.properties
+++ b/modules/core/src/main/resources/META-INF/classnames.properties
@@ -2074,6 +2074,7 @@ org.apache.ignite.internal.visor.VisorJob
 org.apache.ignite.internal.visor.VisorMultiNodeTask
 org.apache.ignite.internal.visor.VisorOneNodeTask
 org.apache.ignite.internal.visor.VisorTaskArgument
+org.apache.ignite.internal.visor.VisorTaskResult
 org.apache.ignite.internal.management.baseline.BaselineAutoAdjustSettings
 org.apache.ignite.internal.management.baseline.BaselineNode
 org.apache.ignite.internal.management.baseline.BaselineNode$ResolvedAddresses
@@ -2121,7 +2122,6 @@ 
org.apache.ignite.internal.management.cache.ScheduleIndexRebuildTaskRes
 org.apache.ignite.internal.management.cache.CacheMetricsOperation
 org.apache.ignite.internal.management.cache.CacheMetricsTask
 org.apache.ignite.internal.management.cache.CacheMetricsTask$CacheMetricsJob
-org.apache.ignite.internal.management.cache.CacheMetricsTaskResult
 org.apache.ignite.internal.management.cdc.CdcCacheDataResendTask
 
org.apache.ignite.internal.management.cdc.CdcCacheDataResendTask$CdcCacheDataResendJob
 org.apache.ignite.internal.management.cdc.CdcDeleteLostSegmentsTask
@@ -2220,7 +2220,6 @@ 
org.apache.ignite.internal.management.snapshot.SnapshotCheckTask$SnapshotCheckJo
 org.apache.ignite.internal.management.snapshot.SnapshotCreateTask
 
org.apache.ignite.internal.management.snapshot.SnapshotCreateTask$SnapshotCreateJob
 org.apache.ignite.internal.management.snapshot.SnapshotJob
-org.apache.ignite.internal.management.snapshot.SnapshotOneNodeTask
 org.apache.ignite.internal.management.snapshot.SnapshotRestoreTask
 
org.apache.ignite.internal.management.snapshot.SnapshotRestoreTask$SnapshotRestoreCancelJob
 
org.apache.ignite.internal.management.snapshot.SnapshotRestoreTask$SnapshotRestoreStatusJob
@@ -2229,7 +2228,6 @@ 
org.apache.ignite.internal.management.snapshot.SnapshotStatusTask
 
org.apache.ignite.internal.management.snapshot.SnapshotStatusTask$SnapshotOperation
 
org.apache.ignite.internal.management.snapshot.SnapshotStatusTask$SnapshotStatus
 
org.apache.ignite.internal.management.snapshot.SnapshotStatusTask$SnapshotStatusJob
-org.apache.ignite.internal.management.snapshot.SnapshotTaskResult
 org.apache.ignite.internal.management.SystemViewTask
 org.apache.ignite.internal.management.SystemViewTask$SimpleType
 org.apache.ignite.internal.management.SystemViewTask$SystemViewJob
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheEventAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheEventAbstractTest.java
index 69651ff5090..bf001665450 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheEventAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/GridCacheEventAbstractTest.java
@@ -180,7 +180,7 @@ public abstract class GridCacheEventAbstractTest extends 
GridCacheAbstractSelfTe
      *
      * @param run {@link TestCacheRunnable} instance.
      * @param evtCnts Expected event counts for each iteration.
-     * @throws Exception In failed.
+     * @throws Exception If failed.
      */
     @SuppressWarnings({"CaughtExceptionImmediatelyRethrown"})
     private void runTest(TestCacheRunnable run, IgniteBiTuple<Integer, 
Integer>... evtCnts) throws Exception {
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/MovingPartitionIsEvictedDuringClearingTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/MovingPartitionIsEvictedDuringClearingTest.java
index 4f00d8386d4..151b06aae03 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/MovingPartitionIsEvictedDuringClearingTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/topology/MovingPartitionIsEvictedDuringClearingTest.java
@@ -170,7 +170,7 @@ public class MovingPartitionIsEvictedDuringClearingTest 
extends GridCommonAbstra
     /**
      * @param size Size.
      */
-    private void validadate(int size) {
+    private void validadate(int size) throws Exception {
         assertPartitionsSame(idleVerify(grid(0), DEFAULT_CACHE_NAME));
 
         for (Ignite grid : G.allGrids())
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/MaintenancePersistenceTaskTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/MaintenancePersistenceTaskTest.java
index e724e34b288..e49c70c68c1 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/MaintenancePersistenceTaskTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/MaintenancePersistenceTaskTest.java
@@ -146,14 +146,14 @@ public class MaintenancePersistenceTaskTest extends 
GridCommonAbstractTest {
      * @param node Ignite node.
      * @return Execution's result.
      */
-    private PersistenceTaskResult executeInfo(IgniteEx node) {
+    private PersistenceTaskResult executeInfo(IgniteEx node) throws Exception {
         VisorTaskArgument<PersistenceCommand.PersistenceTaskArg> infoArg = new 
VisorTaskArgument<>(
             node.localNode().id(),
             new PersistenceCommand.PersistenceInfoTaskArg(),
             false
         );
 
-        return node.compute().execute(new PersistenceTask(), infoArg);
+        return node.compute().execute(new PersistenceTask(), infoArg).result();
     }
 
     /**
@@ -162,7 +162,7 @@ public class MaintenancePersistenceTaskTest extends 
GridCommonAbstractTest {
      * @param node Ignite node.
      * @return Execution's result.
      */
-    private PersistenceTaskResult executeClean(IgniteEx node) {
+    private PersistenceTaskResult executeClean(IgniteEx node) throws Exception 
{
         PersistenceCleanCachesTaskArg arg = new 
PersistenceCleanCachesTaskArg();
 
         arg.caches(new String[]{CACHE_NAME});
@@ -173,6 +173,6 @@ public class MaintenancePersistenceTaskTest extends 
GridCommonAbstractTest {
             false
         );
 
-        return node.compute().execute(new PersistenceTask(), cleanArg);
+        return node.compute().execute(new PersistenceTask(), 
cleanArg).result();
     }
 }
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java
index e311718e857..9ba95490aeb 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/incremental/IncrementalSnapshotRestoreTest.java
@@ -828,7 +828,7 @@ public class IncrementalSnapshotRestoreTest extends 
AbstractIncrementalSnapshotT
     }
 
     /** */
-    private void checkData(Map<?, ?> expData, String cacheName) {
+    private void checkData(Map<?, ?> expData, String cacheName) throws 
Exception {
         List<Cache.Entry<Object, Object>> actData = 
grid(0).cache(cacheName).withKeepBinary().query(new ScanQuery<>()).getAll();
 
         assertEquals(actData.size(), expData.size());
@@ -862,7 +862,9 @@ public class IncrementalSnapshotRestoreTest extends 
AbstractIncrementalSnapshotT
             new VisorTaskArgument<>(
                 G.allGrids().stream().map(ign -> 
ign.cluster().localNode().id()).collect(Collectors.toList()),
                 arg,
-                false));
+                false
+            )
+        ).result();
 
         assertFalse(res.message(), res.cancelled());
         assertFalse(res.message(), res.failed());
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 6c68ed4bac8..b6608e84305 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
@@ -989,7 +989,7 @@ public class TxRollbackAsyncTest extends 
GridCommonAbstractTest {
         arg.kill(true);
 
         Map<ClusterNode, TxTaskResult> res = 
client.compute(client.cluster().forPredicate(F.alwaysTrue())).
-            execute(new TxTask(), new 
VisorTaskArgument<>(client.cluster().localNode().id(), arg, false));
+            execute(new TxTask(), new 
VisorTaskArgument<>(client.cluster().localNode().id(), arg, false)).result();
 
         int expCnt = 0;
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index 1e9b9f8b8c3..3e909de4610 100755
--- 
a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -130,6 +130,7 @@ import org.apache.ignite.internal.util.typedef.T3;
 import org.apache.ignite.internal.util.typedef.internal.LT;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorTaskArgument;
+import org.apache.ignite.internal.visor.VisorTaskResult;
 import org.apache.ignite.lang.IgniteBiInClosure;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgniteInClosure;
@@ -2223,7 +2224,7 @@ public abstract class GridCommonAbstractTest extends 
GridAbstractTest {
      * @return Conflicts result.
      * @throws IgniteException If none caches or node found.
      */
-    protected IdleVerifyResultV2 idleVerify(Ignite ig, @Nullable String... 
caches) {
+    protected IdleVerifyResultV2 idleVerify(Ignite ig, @Nullable String... 
caches) throws Exception {
         log.info("Starting idleVerify ...");
 
         IgniteEx ig0 = (IgniteEx)ig;
@@ -2247,10 +2248,10 @@ public abstract class GridCommonAbstractTest extends 
GridAbstractTest {
 
         taskArg.caches(cacheNames.toArray(U.EMPTY_STRS));
 
-        return ig.compute().execute(
+        return ((VisorTaskResult<IdleVerifyResultV2>)ig.compute().execute(
             IdleVerifyTaskV2.class.getName(),
             new VisorTaskArgument<>(node.id(), taskArg, false)
-        );
+        )).result();
     }
 
     /**
diff --git 
a/modules/core/src/test/java/org/apache/ignite/util/GridInternalTaskUnusedWalSegmentsTest.java
 
b/modules/core/src/test/java/org/apache/ignite/util/GridInternalTaskUnusedWalSegmentsTest.java
index f6d33a47515..fbee2b9dc21 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/util/GridInternalTaskUnusedWalSegmentsTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/util/GridInternalTaskUnusedWalSegmentsTest.java
@@ -113,7 +113,7 @@ public class GridInternalTaskUnusedWalSegmentsTest extends 
GridCommonAbstractTes
 
             WalTaskResult printRes = ig0.compute().execute(WalTask.class,
                     new VisorTaskArgument<>(ig0.cluster().node().id(),
-                            new WalPrintCommandArg(), false));
+                            new WalPrintCommandArg(), false)).result();
 
             assertEquals("Check that print task finished without exceptions", 
printRes.results().size(), 4);
 
@@ -126,7 +126,7 @@ public class GridInternalTaskUnusedWalSegmentsTest extends 
GridCommonAbstractTes
 
             WalTaskResult delRes = ig0.compute().execute(WalTask.class,
                     new VisorTaskArgument<>(ig0.cluster().node().id(),
-                            new WalDeleteCommandArg(), false));
+                            new WalDeleteCommandArg(), false)).result();
 
             assertEquals("Check that delete task finished with no exceptions", 
delRes.results().size(), 4);
 
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
index f6715709927..3b22b27d39f 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteCacheGroupsWithRestartsTest.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
-import java.util.function.BiFunction;
 import javax.cache.Cache;
 import javax.cache.configuration.Factory;
 import javax.cache.integration.CacheLoaderException;
@@ -48,6 +47,7 @@ import 
org.apache.ignite.internal.management.cache.CacheFindGarbageCommandArg;
 import 
org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceJobResult;
 import 
org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceTask;
 import 
org.apache.ignite.internal.management.cache.FindAndDeleteGarbageInPersistenceTaskResult;
+import org.apache.ignite.internal.util.function.ThrowableBiFunction;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.S;
@@ -297,7 +297,7 @@ public class IgniteCacheGroupsWithRestartsTest extends 
GridCommonAbstractTest {
      * @param doFindAndRemove Do find and remove.
      */
     public void testFindAndDeleteGarbage(
-        BiFunction<IgniteEx, Boolean, 
FindAndDeleteGarbageInPersistenceTaskResult> doFindAndRemove
+        ThrowableBiFunction<IgniteEx, Boolean, 
FindAndDeleteGarbageInPersistenceTaskResult, Exception> doFindAndRemove
     ) throws Exception {
         IgniteEx ignite = startGrids(3);
 
@@ -347,7 +347,7 @@ public class IgniteCacheGroupsWithRestartsTest extends 
GridCommonAbstractTest {
     private FindAndDeleteGarbageInPersistenceTaskResult executeTask(
         IgniteEx ignite,
         boolean deleteFoundGarbage
-    ) {
+    ) throws Exception {
         CacheFindGarbageCommandArg arg0 = new CacheFindGarbageCommandArg();
 
         arg0.groups(new String[] {GROUP});
@@ -355,12 +355,10 @@ public class IgniteCacheGroupsWithRestartsTest extends 
GridCommonAbstractTest {
 
         UUID id = ignite.localNode().id();
 
-        VisorTaskArgument arg = new VisorTaskArgument(id, arg0, true);
-
-        FindAndDeleteGarbageInPersistenceTaskResult result =
-            
ignite.compute().execute(FindAndDeleteGarbageInPersistenceTask.class, arg);
-
-        return result;
+        return ignite.compute().execute(
+            FindAndDeleteGarbageInPersistenceTask.class,
+            new VisorTaskArgument<>(id, arg0, true)
+        ).result();
     }
 
     /**
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexRebuildTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexRebuildTest.java
index 9ddc91974b1..8ecdbc3f7af 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexRebuildTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexRebuildTest.java
@@ -42,7 +42,6 @@ import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.ComputeTaskInternalFuture;
 import org.apache.ignite.internal.IgniteEx;
 import 
org.apache.ignite.internal.management.cache.CacheValidateIndexesCommandArg;
 import org.apache.ignite.internal.management.cache.ValidateIndexesJobResult;
@@ -223,12 +222,10 @@ public class GridIndexRebuildTest extends 
GridCommonAbstractTest {
         arg.checkCrc(true);
         arg.checkSizes(true);
 
-        VisorTaskArgument<CacheValidateIndexesCommandArg> visorTaskArg = new 
VisorTaskArgument<>(nodes, arg, true);
-
-        ComputeTaskInternalFuture<ValidateIndexesTaskResult> exec = 
grid1.context().task().
-            execute(new ValidateIndexesTask(), visorTaskArg);
-
-        ValidateIndexesTaskResult res = exec.get();
+        ValidateIndexesTaskResult res = grid1.context().task().execute(
+            new ValidateIndexesTask(),
+            new VisorTaskArgument<>(nodes, arg, true)
+        ).get().result();
 
         Map<?, ValidateIndexesJobResult> results = res.results();
 
@@ -322,12 +319,10 @@ public class GridIndexRebuildTest extends 
GridCommonAbstractTest {
         arg.checkCrc(true);
         arg.checkSizes(true);
 
-        VisorTaskArgument<CacheValidateIndexesCommandArg> visorTaskArg = new 
VisorTaskArgument<>(nodes, arg, true);
-
-        ComputeTaskInternalFuture<ValidateIndexesTaskResult> exec = 
grid1.context().task().
-            execute(new ValidateIndexesTask(), visorTaskArg);
-
-        ValidateIndexesTaskResult res = exec.get();
+        ValidateIndexesTaskResult res = grid1.context().task().execute(
+            new ValidateIndexesTask(),
+            new VisorTaskArgument<>(nodes, arg, true)
+        ).get().result();
 
         Map<?, ValidateIndexesJobResult> results = res.results();
 

Reply via email to