Generally, I think we should not trim any exceptions, because this way we
can unexpectedly remove useful information. Do we know what was the
original reasoning behind this logic?

-Val

On Mon, Mar 12, 2018 at 3:57 AM, Stanislav Lukyanov <stanlukya...@gmail.com>
wrote:

> Hi,
>
> IgniteUtils::cast method is used to cast an exception to
> IgniteCheckedException. It is done by trimming the top exceptions in the
> trace until we find IgniteCheckedException, or until we’ve found the last
> one. As a result, IgniteUtils::cast generally can trim the whole stack
> trace but the root exception.
>
> One problem caused by that is https://issues.apache.org/
> jira/browse/IGNITE-7904.
> ComputeTask::result may throw IgniteException which is to be rethrown by
> the ComputeTaskFuture::get, but in fact the IgniteException and all its
> causes (but the root one) are trimmed, and the exception that comes from
> the ComputeTaskFuture::get is different than excepted.
>
> To fix that I want to change the IgniteUtils::cast not to remove any
> exceptions from the stack trace and just wrap all arguments with
> IgniteCheckException.
> Of course, this will affect all places where IgniteUtils::cast is used
> (mostly various futures completion).
> Does anyone have concerns about this?
>
> To illustrate, a patch (untested!) for IgniteUtils is below.
>
> Thanks,
> Stan
>
> 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 cbe64cd97af..5e8d9c8f4d9 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
> @@ -7256,26 +7256,16 @@ public abstract class IgniteUtils {
>      public static IgniteCheckedException cast(Throwable t) {
>          assert t != null;
>
> -        while (true) {
> -            if (t instanceof Error)
> -                throw (Error)t;
> +        while (t instanceof GridClosureException)
> +            t = ((GridClosureException)t).unwrap();
>
> -            if (t instanceof GridClosureException) {
> -                t = ((GridClosureException)t).unwrap();
> +        if (t instanceof Error)
> +            throw (Error)t;
>
> -                continue;
> -            }
> -
> -            if (t instanceof IgniteCheckedException)
> -                return (IgniteCheckedException)t;
> -
> -            if (!(t instanceof IgniteException) || t.getCause() == null)
> -                return new IgniteCheckedException(t);
> +        if (t instanceof IgniteCheckedException)
> +            return (IgniteCheckedException)t;
>
> -            assert t.getCause() != null; // ...and it is IgniteException.
> -
> -            t = t.getCause();
> -        }
> +        return new IgniteCheckedException(t);
>      }
>
>

Reply via email to