Repository: ignite
Updated Branches:
  refs/heads/master 834869c2a -> 3a4f23bfe


IGNITE-7904: Changed IgniteUtils::cast not to trim exception chains. This 
closes #3683.


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

Branch: refs/heads/master
Commit: 3a4f23bfebbbc515ecafdf9b97cf1b5d99d5dbf6
Parents: 834869c
Author: Stanislav Lukyanov <lukyanov....@gmail.com>
Authored: Mon Apr 9 14:33:13 2018 +0300
Committer: devozerov <voze...@gridgain.com>
Committed: Mon Apr 9 14:33:13 2018 +0300

----------------------------------------------------------------------
 .../ignite/compute/ComputeTaskAdapter.java      |   2 +-
 .../processors/cache/GridCacheUtils.java        |   5 +-
 .../processors/cache/IgniteCacheProxyImpl.java  |   3 +
 .../processors/igfs/IgfsMetaManager.java        |  30 ++-
 .../internal/processors/job/GridJobWorker.java  |   2 +-
 .../platform/services/PlatformServices.java     |   8 +-
 .../processors/service/GridServiceProxy.java    |  27 ++-
 .../ignite/internal/util/IgniteUtils.java       |  32 +---
 .../IgniteComputeResultExceptionTest.java       | 186 +++++++++++++++++++
 .../cache/GridCacheAbstractFullApiSelfTest.java |   9 +-
 .../closure/GridClosureSerializationTest.java   |   2 +-
 .../GridServiceProcessorProxySelfTest.java      |  12 +-
 .../testsuites/IgniteComputeGridTestSuite.java  |   2 +
 ...niteCacheLockPartitionOnAffinityRunTest.java |  46 ++---
 .../jdbc/CacheJdbcPojoStoreFactorySelfTest.java |  11 +-
 .../resource/GridServiceInjectionSelfTest.java  |  64 +++----
 .../GridSpringResourceInjectionSelfTest.java    |  58 +++---
 17 files changed, 339 insertions(+), 160 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/compute/ComputeTaskAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/compute/ComputeTaskAdapter.java 
b/modules/core/src/main/java/org/apache/ignite/compute/ComputeTaskAdapter.java
index c5352aa..fc55ad9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/compute/ComputeTaskAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/compute/ComputeTaskAdapter.java
@@ -99,7 +99,7 @@ public abstract class ComputeTaskAdapter<T, R> implements 
ComputeTask<T, R> {
                 return ComputeJobResultPolicy.FAILOVER;
 
             throw new IgniteException("Remote job threw user exception 
(override or implement ComputeTask.result(..) " +
-                "method if you would like to have automatic failover for this 
exception).", e);
+                "method if you would like to have automatic failover for this 
exception): " + e.getMessage(), e);
         }
 
         // Wait for all job responses.

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index 09a96d3..83ce2ba 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -1283,8 +1283,9 @@ public class GridCacheUtils {
         else if (e instanceof SchemaOperationException)
             return new CacheException(e.getMessage(), e);
 
-        if (e.getCause() instanceof CacheException)
-            return (CacheException)e.getCause();
+        CacheException ce = X.cause(e, CacheException.class);
+        if (ce != null)
+            return ce;
 
         if (e.getCause() instanceof NullPointerException)
             return (NullPointerException)e.getCause();

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java
index c5d68b5..be4b0db 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxyImpl.java
@@ -1727,6 +1727,9 @@ public class IgniteCacheProxyImpl<K, V> extends 
AsyncSupportAdapter<IgniteCache<
                         ctx.name(), e);
         }
 
+        if (e instanceof IgniteException && X.hasCause(e, 
CacheException.class))
+            e = X.cause(e, CacheException.class);
+
         if (e instanceof IgniteCheckedException)
             return CU.convertToCacheException((IgniteCheckedException) e);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java
index a26239c..e821b80 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsMetaManager.java
@@ -89,6 +89,7 @@ import org.apache.ignite.internal.util.lang.IgniteOutClosureX;
 import org.apache.ignite.internal.util.typedef.CI1;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.T1;
+import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.transactions.TransactionConcurrency;
@@ -254,28 +255,19 @@ public class IgfsMetaManager extends IgfsManager {
      */
     <T> T runClientTask(IgfsClientAbstractCallable<T> task) {
         try {
-            return runClientTask(IgfsUtils.ROOT_ID, task);
-        }
-        catch (ClusterTopologyException e) {
-            throw new IgfsException("Failed to execute operation because there 
are no IGFS metadata nodes." , e);
-        }
-    }
-
-    /**
-     * Run client task.
-     *
-     * @param affinityFileId Affinity fileId.
-     * @param task Task.
-     * @return Result.
-     */
-    <T> T runClientTask(IgniteUuid affinityFileId, 
IgfsClientAbstractCallable<T> task) {
-        try {
             return (cfg.isColocateMetadata()) ?
-                clientCompute().affinityCall(metaCacheName, affinityFileId, 
task) :
+                clientCompute().affinityCall(metaCacheName, IgfsUtils.ROOT_ID, 
task) :
                 clientCompute().call(task);
         }
-        catch (ClusterTopologyException e) {
-            throw new IgfsException("Failed to execute operation because there 
are no IGFS metadata nodes." , e);
+        catch (Exception e) {
+            if (X.hasCause(e, ClusterTopologyException.class))
+                throw new IgfsException("Failed to execute operation because 
there are no IGFS metadata nodes." , e);
+
+            IgfsException igfsEx = X.cause(e, IgfsException.class);
+            if (igfsEx != null)
+                throw igfsEx;
+
+            throw e;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
index cce1077..6d2e621 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
@@ -678,7 +678,7 @@ public class GridJobWorker extends GridWorker implements 
GridTimeoutObject {
 
         if (msg == null) {
             msg = "Failed to execute job due to unexpected runtime exception 
[jobId=" + ses.getJobId() +
-                ", ses=" + ses + ']';
+                ", ses=" + ses + ", err=" + e.getMessage() + ']';
 
             ex = new ComputeUserUndeclaredException(msg, e);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
index ccb04d4..4ae59b9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
@@ -33,6 +33,7 @@ import 
org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
 import 
org.apache.ignite.internal.processors.platform.utils.PlatformWriterBiClosure;
 import 
org.apache.ignite.internal.processors.platform.utils.PlatformWriterClosure;
 import org.apache.ignite.internal.processors.service.GridServiceProxy;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.typedef.T3;
 import org.apache.ignite.lang.IgniteFuture;
 import org.apache.ignite.lang.IgnitePredicate;
@@ -581,7 +582,12 @@ public class PlatformServices extends 
PlatformAbstractTarget {
 
                 Method mtd = getMethod(serviceClass, mthdName, args);
 
-                return ((GridServiceProxy)proxy).invokeMethod(mtd, args);
+                try {
+                    return ((GridServiceProxy)proxy).invokeMethod(mtd, args);
+                }
+                catch (Throwable t) {
+                    throw IgniteUtils.cast(t);
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProxy.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProxy.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProxy.java
index e55c2e5..c5a2cee 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProxy.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProxy.java
@@ -47,6 +47,7 @@ import 
org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
 import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteCallable;
@@ -150,7 +151,7 @@ public class GridServiceProxy<T> implements Serializable {
      * @return Result.
      */
     @SuppressWarnings("BusyWait")
-    public Object invokeMethod(final Method mtd, final Object[] args) {
+    public Object invokeMethod(final Method mtd, final Object[] args) throws 
Throwable {
         if (U.isHashCodeMethod(mtd))
             return System.identityHashCode(proxy);
         else if (U.isEqualsMethod(mtd))
@@ -205,6 +206,12 @@ public class GridServiceProxy<T> implements Serializable {
                     throw e;
                 }
                 catch (IgniteCheckedException e) {
+                    // Rethrow original service method exception so that 
calling user code can handle it correctly.
+                    ServiceProxyException svcProxyE = X.cause(e, 
ServiceProxyException.class);
+
+                    if (svcProxyE != null)
+                        throw svcProxyE.getCause();
+
                     throw U.convertException(e);
                 }
                 catch (Exception e) {
@@ -352,7 +359,7 @@ public class GridServiceProxy<T> implements Serializable {
 
         /** {@inheritDoc} */
         @SuppressWarnings("BusyWait")
-        @Override public Object invoke(Object proxy, final Method mtd, final 
Object[] args) {
+        @Override public Object invoke(Object proxy, final Method mtd, final 
Object[] args) throws Throwable {
             return invokeMethod(mtd, args);
         }
     }
@@ -418,8 +425,7 @@ public class GridServiceProxy<T> implements Serializable {
                 return mtd.invoke(svcCtx.service(), args);
             }
             catch (InvocationTargetException e) {
-                // Get error message.
-                throw new IgniteCheckedException(e.getCause().getMessage(), e);
+                throw new ServiceProxyException(e.getCause());
             }
         }
 
@@ -444,4 +450,17 @@ public class GridServiceProxy<T> implements Serializable {
             return S.toString(ServiceProxyCallable.class, this);
         }
     }
+
+    /**
+     * Exception class that wraps an exception thrown by the service 
implementation.
+     */
+    private static class ServiceProxyException extends RuntimeException {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** {@inheritDoc} */
+        ServiceProxyException(Throwable cause) {
+            super(cause);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 18e182d..93f4fb4 100755
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -7285,35 +7285,23 @@ public abstract class IgniteUtils {
     }
 
     /**
-     * Casts this throwable as {@link IgniteCheckedException}. Creates wrapping
-     * {@link IgniteCheckedException}, if needed.
+     * Casts the passed {@code Throwable t} to {@link 
IgniteCheckedException}.<br>
+     * If {@code t} is a {@link GridClosureException}, it is unwrapped and 
then cast to {@link IgniteCheckedException}.
+     * If {@code t} is an {@link IgniteCheckedException}, it is returned.
+     * If {@code t} is not a {@link IgniteCheckedException}, a new {@link 
IgniteCheckedException} caused by {@code t}
+     * is returned.
      *
      * @param t Throwable to cast.
-     * @return Grid exception.
+     * @return {@code t} cast to {@link IgniteCheckedException}.
      */
     public static IgniteCheckedException cast(Throwable t) {
         assert t != null;
 
-        while (true) {
-            if (t instanceof Error)
-                throw (Error)t;
+        t = unwrap(t);
 
-            if (t instanceof GridClosureException) {
-                t = ((GridClosureException)t).unwrap();
-
-                continue;
-            }
-
-            if (t instanceof IgniteCheckedException)
-                return (IgniteCheckedException)t;
-
-            if (!(t instanceof IgniteException) || t.getCause() == null)
-                return new IgniteCheckedException(t);
-
-            assert t.getCause() != null; // ...and it is IgniteException.
-
-            t = t.getCause();
-        }
+        return t instanceof IgniteCheckedException
+            ? (IgniteCheckedException)t
+            : new IgniteCheckedException(t);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeResultExceptionTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeResultExceptionTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeResultExceptionTest.java
new file mode 100644
index 0000000..fab5de6
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeResultExceptionTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCompute;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.compute.ComputeJob;
+import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.compute.ComputeJobResultPolicy;
+import org.apache.ignite.compute.ComputeTask;
+import org.apache.ignite.compute.ComputeTaskFuture;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Testing that if {@link ComputeTask#result(ComputeJobResult, List)} throws 
an {@link IgniteException}
+ * then that exception is thrown as the execution result.
+ */
+public class IgniteComputeResultExceptionTest extends GridCommonAbstractTest {
+    /** */
+    public void testIgniteExceptionExecute() throws Exception {
+        checkExecuteException(new IgniteException());
+    }
+
+    /** */
+    public void testIgniteExceptionWithCauseExecute() throws Exception {
+        checkExecuteException(new IgniteException(new Exception()));
+    }
+
+    /** */
+    public void testIgniteExceptionWithCauseChainExecute() throws Exception {
+        checkExecuteException(new IgniteException(new Exception(new 
Throwable())));
+    }
+
+    /** */
+    public void testCustomExceptionExecute() throws Exception {
+        checkExecuteException(new TaskException());
+    }
+
+    /** */
+    public void testCustomExceptionWithCauseExecute() throws Exception {
+        checkExecuteException(new TaskException(new Exception()));
+    }
+
+    /** */
+    public void testCustomExceptionWithCauseChainExecute() throws Exception {
+        checkExecuteException(new TaskException(new Exception(new 
Throwable())));
+    }
+
+    /** */
+    private void checkExecuteException(IgniteException resE) throws Exception {
+        try (Ignite ignite = startGrid()) {
+            IgniteCompute compute = ignite.compute();
+            try {
+                compute.execute(new ResultExceptionTask(resE), null);
+            } catch (IgniteException e) {
+                assertSame(resE, e);
+            }
+        }
+    }
+
+    /** */
+    public void testIgniteExceptionExecuteAsync() throws Exception {
+        checkExecuteAsyncException(new IgniteException());
+    }
+
+    /** */
+    public void testIgniteExceptionWithCauseExecuteAsync() throws Exception {
+        checkExecuteAsyncException(new IgniteException(new Exception()));
+    }
+
+    /** */
+    public void testIgniteExceptionWithCauseChainExecuteAsync() throws 
Exception {
+        checkExecuteAsyncException(new IgniteException(new Exception(new 
Throwable())));
+    }
+
+
+    /** */
+    public void testCustomExceptionExecuteAsync() throws Exception {
+        checkExecuteAsyncException(new TaskException());
+    }
+
+    /** */
+    public void testCustomExceptionWithCauseExecuteAsync() throws Exception {
+        checkExecuteAsyncException(new TaskException(new Exception()));
+    }
+
+    /** */
+    public void testCustomExceptionWithCauseChainExecuteAsync() throws 
Exception {
+        checkExecuteAsyncException(new TaskException(new Exception(new 
Throwable())));
+    }
+
+    /** */
+    private void checkExecuteAsyncException(IgniteException resE) throws 
Exception {
+        try (Ignite ignite = startGrid()) {
+            IgniteCompute compute = ignite.compute();
+            ComputeTaskFuture<Object> fut = compute.executeAsync(new 
ResultExceptionTask(resE), null);
+            try {
+                fut.get();
+            } catch (IgniteException e) {
+                assertSame(resE, e);
+            }
+        }
+    }
+
+    /** */
+    private static class TaskException extends IgniteException {
+        /** */
+        public TaskException() {
+            // No-op.
+        }
+
+        /** */
+        public TaskException(Throwable cause) {
+            super(cause);
+        }
+    }
+
+    /** */
+    private static class NoopJob implements ComputeJob {
+        /** */
+        @Override public void cancel() {
+            // No-op.
+        }
+
+        /** */
+        @Override public Object execute() throws IgniteException {
+            return null;
+        }
+    }
+
+    /** */
+    private static class ResultExceptionTask implements ComputeTask<Object, 
Object> {
+        /** */
+        private final IgniteException resE;
+
+        /**
+         * @param resE Exception to be rethrown by the
+         */
+        ResultExceptionTask(IgniteException resE) {
+            this.resE = resE;
+        }
+
+        /** */
+        @Override public Map<? extends ComputeJob, ClusterNode> 
map(List<ClusterNode> subgrid,
+            @Nullable Object arg) throws IgniteException {
+            Map<ComputeJob, ClusterNode> jobs = new HashMap<>();
+
+            for (ClusterNode node : subgrid)
+                jobs.put(new NoopJob(), node);
+
+            return jobs;
+        }
+
+        /** */
+        @Override
+        public ComputeJobResultPolicy result(ComputeJobResult res, 
List<ComputeJobResult> rcvd) throws IgniteException {
+            throw resE;
+        }
+
+        /** */
+        @Nullable @Override public Object reduce(List<ComputeJobResult> 
results) throws IgniteException {
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
index 2e6a19c..e5df2c8 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
@@ -82,6 +82,7 @@ import org.apache.ignite.internal.util.lang.IgnitePair;
 import org.apache.ignite.internal.util.typedef.CIX1;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.PA;
+import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.CU;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -5041,12 +5042,16 @@ public abstract class GridCacheAbstractFullApiSelfTest 
extends GridCacheAbstract
 
                 checkIteratorsCleared();
             }
-            catch (AssertionFailedError e) {
+            catch (Throwable t) {
+                // If AssertionFailedError is in the chain, assume we need to 
wait and retry.
+                if (!X.hasCause(t, AssertionFailedError.class))
+                    throw t;
+                
                 if (i == 9) {
                     for (int j = 0; j < gridCount(); j++)
                         executeOnLocalOrRemoteJvm(j, new 
PrintIteratorStateTask());
 
-                    throw e;
+                    throw t;
                 }
 
                 log.info("Iterators not cleared, will wait");

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/test/java/org/apache/ignite/internal/processors/closure/GridClosureSerializationTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/closure/GridClosureSerializationTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/closure/GridClosureSerializationTest.java
index 8bcbd81..324a9e9 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/closure/GridClosureSerializationTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/closure/GridClosureSerializationTest.java
@@ -68,7 +68,7 @@ public class GridClosureSerializationTest extends 
GridCommonAbstractTest {
         final IgniteEx ignite0 = grid(0);
         final IgniteEx ignite1 = grid(1);
 
-        GridTestUtils.assertThrows(null, new Callable<Object>() {
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
                 
ignite1.compute(ignite1.cluster().forNode(ignite0.localNode())).call(new 
IgniteCallable<Object>() {
                     @Override public Object call() throws Exception {

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java
index d1c5294..97d5f05 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/service/GridServiceProcessorProxySelfTest.java
@@ -89,7 +89,7 @@ public class GridServiceProcessorProxySelfTest extends 
GridServiceProcessorAbstr
 
                 return null;
             }
-        }, IgniteException.class, "Test exception");
+        }, ErrorServiceException.class, "Test exception");
 
     }
 
@@ -450,9 +450,15 @@ public class GridServiceProcessorProxySelfTest extends 
GridServiceProcessorAbstr
 
         /** {@inheritDoc} */
         @Override public void go() throws Exception {
-            throw new Exception("Test exception");
+            throw new ErrorServiceException("Test exception");
         }
     }
 
-
+    /** */
+    private static class ErrorServiceException extends Exception {
+        /** */
+        ErrorServiceException(String msg) {
+            super(msg);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
index 2ffa11e..55fab8d 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
@@ -67,6 +67,7 @@ import org.apache.ignite.internal.GridTaskResultCacheSelfTest;
 import org.apache.ignite.internal.GridTaskTimeoutSelfTest;
 import org.apache.ignite.internal.IgniteComputeEmptyClusterGroupTest;
 import org.apache.ignite.internal.IgniteComputeJobOneThreadTest;
+import org.apache.ignite.internal.IgniteComputeResultExceptionTest;
 import org.apache.ignite.internal.IgniteComputeTopologyExceptionTest;
 import org.apache.ignite.internal.IgniteExecutorServiceTest;
 import org.apache.ignite.internal.IgniteExplicitImplicitDeploymentSelfTest;
@@ -156,6 +157,7 @@ public class IgniteComputeGridTestSuite {
         suite.addTestSuite(GridMultinodeRedeployIsolatedModeSelfTest.class);
         suite.addTestSuite(IgniteComputeEmptyClusterGroupTest.class);
         suite.addTestSuite(IgniteComputeTopologyExceptionTest.class);
+        suite.addTestSuite(IgniteComputeResultExceptionTest.class);
         suite.addTestSuite(GridTaskFailoverAffinityRunTest.class);
         suite.addTestSuite(TaskNodeRestartTest.class);
         
suite.addTestSuite(IgniteRoundRobinErrorAfterClientReconnectTest.class);

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLockPartitionOnAffinityRunTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLockPartitionOnAffinityRunTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLockPartitionOnAffinityRunTest.java
index 598212b..7bddafc 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLockPartitionOnAffinityRunTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheLockPartitionOnAffinityRunTest.java
@@ -23,6 +23,7 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteException;
@@ -404,39 +405,20 @@ public class IgniteCacheLockPartitionOnAffinityRunTest 
extends IgniteCacheLockPa
     public void testCheckReservePartitionException() throws Exception {
         int orgId = 
primaryKey(grid(1).cache(Organization.class.getSimpleName()));
 
-        try {
-            grid(0).compute().affinityRun(
-                Arrays.asList(Organization.class.getSimpleName(), 
OTHER_CACHE_NAME),
-                new Integer(orgId),
-                new IgniteRunnable() {
-                    @Override public void run() {
-                        // No-op.
-                    }
-                });
-
-            fail("Exception is expected");
-        }
-        catch (Exception e) {
-            assertTrue(e.getMessage()
-                .startsWith("Failed partition reservation. Partition is not 
primary on the node."));
-        }
-
-        try {
-            grid(0).compute().affinityCall(
-                Arrays.asList(Organization.class.getSimpleName(), 
OTHER_CACHE_NAME),
-                new Integer(orgId),
-                new IgniteCallable<Object>() {
-                    @Override public Object call() throws Exception {
-                        return null;
-                    }
-                });
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Void>() {
+            @Override public Void call() throws Exception {
+                grid(0).compute().affinityRun(
+                    Arrays.asList(Organization.class.getSimpleName(), 
OTHER_CACHE_NAME),
+                    new Integer(orgId),
+                    new IgniteRunnable() {
+                        @Override public void run() {
+                            // No-op.
+                        }
+                    });
 
-            fail("Exception is expected");
-        }
-        catch (Exception e) {
-            assertTrue(e.getMessage()
-                .startsWith("Failed partition reservation. Partition is not 
primary on the node."));
-        }
+                return null;
+            }
+        }, IgniteException.class, "Failed partition reservation. Partition is 
not primary on the node.");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/spring/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreFactorySelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreFactorySelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreFactorySelfTest.java
index 0fd16f0..0d6d6a2 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreFactorySelfTest.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreFactorySelfTest.java
@@ -21,7 +21,7 @@ import java.util.Collection;
 import java.util.concurrent.Callable;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteException;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.Ignition;
 import org.apache.ignite.cache.store.jdbc.dialect.H2Dialect;
 import org.apache.ignite.cache.store.jdbc.dialect.JdbcDialect;
@@ -69,15 +69,14 @@ public class CacheJdbcPojoStoreFactorySelfTest extends 
GridCommonAbstractTest {
      * @throws Exception If failed.
      */
     public void testIncorrectBeanConfiguration() throws Exception {
-        GridTestUtils.assertThrows(log, new Callable<Object>() {
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
-                try(Ignite ignite = 
Ignition.start("modules/spring/src/test/config/pojo-incorrect-store-cache.xml"))
 {
-                    
ignite.cache(CACHE_NAME).getConfiguration(CacheConfiguration.class).
-                        getCacheStoreFactory().create();
+                try (Ignite ignored = 
Ignition.start("modules/spring/src/test/config/pojo-incorrect-store-cache.xml"))
 {
+                    // No-op.
                 }
                 return null;
             }
-        }, IgniteException.class, "Spring bean with provided name doesn't 
exist");
+        }, IgniteCheckedException.class, "Spring bean with provided name 
doesn't exist");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridServiceInjectionSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridServiceInjectionSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridServiceInjectionSelfTest.java
index b59bf24..52581b6 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridServiceInjectionSelfTest.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridServiceInjectionSelfTest.java
@@ -18,11 +18,13 @@
 package org.apache.ignite.internal.processors.resource;
 
 import java.io.Serializable;
-import org.apache.ignite.IgniteException;
+import java.util.concurrent.Callable;
+import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.resources.ServiceResource;
 import org.apache.ignite.services.Service;
 import org.apache.ignite.services.ServiceContext;
+import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
 
 /**
@@ -124,23 +126,22 @@ public class GridServiceInjectionSelfTest extends 
GridCommonAbstractTest impleme
      * @throws Exception If failed.
      */
     public void testClosureFieldWithIncorrectType() throws Exception {
-        try {
-            grid(0).compute().call(new IgniteCallable<Object>() {
-                @ServiceResource(serviceName = SERVICE_NAME1)
-                private String svcName;
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Void>() {
+            @Override public Void call() {
+                grid(0).compute().call(new IgniteCallable<Object>() {
+                    @ServiceResource(serviceName = SERVICE_NAME1)
+                    private String svcName;
 
-                @Override public Object call() throws Exception {
-                    fail();
+                    @Override public Object call() throws Exception {
+                        fail();
 
-                    return null;
-                }
-            });
+                        return null;
+                    }
+                });
 
-            fail();
-        }
-        catch (IgniteException e) {
-            assertTrue(e.getMessage().startsWith("Resource field is not 
assignable from the resource"));
-        }
+                return null;
+            }
+        }, IgniteCheckedException.class, "Resource field is not assignable 
from the resource");
     }
 
     /**
@@ -221,23 +222,22 @@ public class GridServiceInjectionSelfTest extends 
GridCommonAbstractTest impleme
      * @throws Exception If failed.
      */
     public void testClosureMethodWithIncorrectType() throws Exception {
-        try {
-            grid(0).compute().call(new IgniteCallable<Object>() {
-                @ServiceResource(serviceName = SERVICE_NAME1)
-                private void service(String svcs) {
-                    fail();
-                }
-
-                @Override public Object call() throws Exception {
-                    return null;
-                }
-            });
-
-            fail();
-        }
-        catch (IgniteException e) {
-            assertTrue(e.getMessage().startsWith("Setter does not have single 
parameter of required type"));
-        }
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Void>() {
+            @Override public Void call() {
+                grid(0).compute().call(new IgniteCallable<Object>() {
+                    @ServiceResource(serviceName = SERVICE_NAME1)
+                    private void service(String svcs) {
+                        fail();
+                    }
+
+                    @Override public Object call() throws Exception {
+                        return null;
+                    }
+                });
+
+                return null;
+            }
+        }, IgniteCheckedException.class, "Setter does not have single 
parameter of required type");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a4f23bf/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
 
b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
index 827dd72..08fe69d 100644
--- 
a/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
+++ 
b/modules/spring/src/test/java/org/apache/ignite/internal/processors/resource/GridSpringResourceInjectionSelfTest.java
@@ -27,6 +27,8 @@ import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.resources.SpringResource;
 import org.apache.ignite.testframework.GridTestUtils;
 import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
 /**
@@ -93,7 +95,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
         Ignite anotherGrid = IgniteSpring.start(anotherCfg, new 
ClassPathXmlApplicationContext(
             
"/org/apache/ignite/internal/processors/resource/spring-resource-with-duplicate-beans.xml"));
 
-        Throwable err = assertError(new IgniteCallable<Object>() {
+        assertError(new IgniteCallable<Object>() {
             @SpringResource(resourceClass = DummyResourceBean.class)
             private transient DummyResourceBean dummyRsrcBean;
 
@@ -102,11 +104,9 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, anotherGrid, null);
-
-        assertTrue("Unexpected message: " + err.getMessage(), 
err.getMessage().startsWith("No qualifying bean of type " +
+        }, anotherGrid, NoUniqueBeanDefinitionException.class, "No qualifying 
bean of type " +
             
"'org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean'"
 +
-            " available: expected single matching bean but found 2:"));
+            " available: expected single matching bean but found 2:");
 
         G.stop("anotherGrid", false);
     }
@@ -124,7 +124,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "No bean named 'nonExistentResource' available");
+        }, grid, NoSuchBeanDefinitionException.class, "No bean named 
'nonExistentResource' available");
     }
 
     /**
@@ -140,7 +140,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "No qualifying bean of type 
'org.apache.ignite.internal.processors.resource." +
+        }, grid, NoSuchBeanDefinitionException.class, "No qualifying bean of 
type 'org.apache.ignite.internal.processors.resource." +
             "GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean' 
available");
     }
 
@@ -157,7 +157,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "Either bean name or its class must be specified in 
@SpringResource, but not both");
+        }, grid, IgniteException.class, "Either bean name or its class must be 
specified in @SpringResource, but not both");
     }
 
     /**
@@ -173,7 +173,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "Either bean name or its class must be specified in 
@SpringResource, but not both");
+        }, grid, IgniteException.class, "Either bean name or its class must be 
specified in @SpringResource, but not both");
     }
 
     /**
@@ -232,7 +232,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
             
"/org/apache/ignite/internal/processors/resource/spring-resource-with-duplicate-beans.xml"));
 
         try {
-            Throwable err = assertError(new IgniteCallable<Object>() {
+            assertError(new IgniteCallable<Object>() {
                 private DummyResourceBean dummyRsrcBean;
 
                 @SpringResource(resourceClass = DummyResourceBean.class)
@@ -247,11 +247,9 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                     return null;
                 }
-            }, anotherGrid, null);
-
-            assertTrue("Unexpected message: " + err.getMessage(), 
err.getMessage().startsWith("No qualifying bean of type " +
+            }, anotherGrid, NoUniqueBeanDefinitionException.class, "No 
qualifying bean of type " +
                 
"'org.apache.ignite.internal.processors.resource.GridSpringResourceInjectionSelfTest$DummyResourceBean'"
 +
-                " available: expected single matching bean but found 2:"));
+                " available: expected single matching bean but found 2:");
         }
         finally {
             G.stop("anotherGrid", false);
@@ -275,7 +273,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "No bean named 'nonExistentResource' available");
+        }, grid, NoSuchBeanDefinitionException.class, "No bean named 
'nonExistentResource' available");
     }
 
     /**
@@ -295,7 +293,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "No qualifying bean of type 
'org.apache.ignite.internal.processors.resource" +
+        }, grid, NoSuchBeanDefinitionException.class,"No qualifying bean of 
type 'org.apache.ignite.internal.processors.resource" +
             ".GridSpringResourceInjectionSelfTest$AnotherDummyResourceBean' 
available");
     }
 
@@ -312,7 +310,7 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "Either bean name or its class must be specified in 
@SpringResource, but not both");
+        }, grid, IgniteException.class, "Either bean name or its class must be 
specified in @SpringResource, but not both");
     }
 
     /**
@@ -328,32 +326,24 @@ public class GridSpringResourceInjectionSelfTest extends 
GridCommonAbstractTest
 
                 return null;
             }
-        }, "Either bean name or its class must be specified in 
@SpringResource, but not both");
+        }, grid, IgniteException.class, "Either bean name or its class must be 
specified in @SpringResource, but not both");
     }
 
     /**
-     * @param job {@link IgniteCallable} to be run
-     * @param grid Node.
-     * @param expEMsg Message that {@link IgniteException} thrown from 
<tt>job</tt> should bear
-     * @return Thrown error.
+     * @param job {@link IgniteCallable} to be run.
+     * @param grid Node to run the job on.
+     * @param expE Expected exception type.
+     * @param expEMsg Expected exception message.
      */
     @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    private Throwable assertError(final IgniteCallable<?> job, final Ignite 
grid, String expEMsg) {
-        return GridTestUtils.assertThrows(log, new Callable<Object>() {
+    private void assertError(final IgniteCallable<?> job, final Ignite grid, 
Class<? extends Throwable> expE,
+        String expEMsg) {
+        GridTestUtils.assertThrowsAnyCause(log, new Callable<Object>() {
             @Override public Object call() throws Exception {
                 grid.compute(grid.cluster().forLocal()).call(job);
                 return null;
             }
-        }, IgniteException.class, expEMsg);
-    }
-
-    /**
-     * @param job {@link IgniteCallable} to be run
-     * @param expEMsg Message that {@link IgniteException} thrown from 
<tt>job</tt> should bear
-     */
-    @SuppressWarnings("ThrowableResultOfMethodCallIgnored")
-    private void assertError(final IgniteCallable<?> job, String expEMsg) {
-        assertError(job, grid, expEMsg);
+        }, expE, expEMsg);
     }
 
     /**

Reply via email to