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

amashenkov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 1f1000d074 IGNITE-19272 Sql. Log query exception on remote node and 
pass traceId back (#1994)
1f1000d074 is described below

commit 1f1000d0741f4f95acaa0bc2e10b00c20c5da6da
Author: Andrew V. Mashenkov <[email protected]>
AuthorDate: Wed May 3 19:55:55 2023 +0300

    IGNITE-19272 Sql. Log query exception on remote node and pass traceId back 
(#1994)
---
 .../client/handler/JdbcQueryEventHandlerImpl.java  |  6 +++
 .../org/apache/ignite/lang/RemoteException.java    | 54 ++++++++++++++++++++++
 .../internal/sql/api/ItSqlAsynchronousApiTest.java |  3 +-
 .../ignite/internal/sql/engine/ItDmlTest.java      |  4 +-
 .../internal/sql/engine/AsyncSqlCursorImpl.java    | 52 ++++-----------------
 .../sql/engine/exec/ExchangeServiceImpl.java       | 36 ++++++++++++++-
 .../sql/engine/exec/ExecutionServiceImpl.java      | 13 ++++--
 .../internal/sql/engine/message/ErrorMessage.java  | 16 +++++--
 ....java => RemoteFragmentExecutionException.java} | 31 ++++++++++---
 .../sql/engine/exec/ExecutionServiceImplTest.java  |  7 +--
 .../sql/engine/exec/MockedStructuresTest.java      |  7 +--
 .../internal/table/distributed/TableManager.java   |  2 +-
 12 files changed, 163 insertions(+), 68 deletions(-)

diff --git 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
index bfdd72893e..494238f8dc 100644
--- 
a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
+++ 
b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
@@ -52,6 +52,8 @@ import 
org.apache.ignite.internal.jdbc.proto.event.JdbcQueryExecuteRequest;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcQueryExecuteResult;
 import org.apache.ignite.internal.jdbc.proto.event.JdbcQuerySingleResult;
 import org.apache.ignite.internal.jdbc.proto.event.Response;
+import org.apache.ignite.internal.logger.IgniteLogger;
+import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.sql.engine.AsyncSqlCursor;
 import org.apache.ignite.internal.sql.engine.QueryContext;
 import org.apache.ignite.internal.sql.engine.QueryProcessor;
@@ -76,6 +78,8 @@ import org.jetbrains.annotations.Nullable;
  * Jdbc query event handler implementation.
  */
 public class JdbcQueryEventHandlerImpl implements JdbcQueryEventHandler {
+    /** Logger. */
+    private static final IgniteLogger LOG = 
Loggers.forClass(JdbcQueryEventHandlerImpl.class);
 
     /** {@link SqlQueryType}s allowed in JDBC select statements. **/
     private static final Set<SqlQueryType> SELECT_STATEMENT_QUERIES = 
Set.of(SqlQueryType.QUERY, SqlQueryType.EXPLAIN);
@@ -167,6 +171,8 @@ public class JdbcQueryEventHandlerImpl implements 
JdbcQueryEventHandler {
         return result.thenCompose(cursor -> createJdbcResult(new 
JdbcQueryCursor<>(req.maxRows(), cursor), req))
                 .thenApply(jdbcResult -> new 
JdbcQueryExecuteResult(List.of(jdbcResult)))
                 .exceptionally(t -> {
+                    LOG.info("Exception while executing query [query=" + 
req.sqlQuery() + "]", ExceptionUtils.unwrapCause(t));
+
                     StringWriter sw = getWriterWithStackTrace(t);
 
                     return new JdbcQueryExecuteResult(Response.STATUS_FAILED,
diff --git 
a/modules/core/src/main/java/org/apache/ignite/lang/RemoteException.java 
b/modules/core/src/main/java/org/apache/ignite/lang/RemoteException.java
new file mode 100644
index 0000000000..762055bf7b
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/lang/RemoteException.java
@@ -0,0 +1,54 @@
+/*
+ * 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.lang;
+
+import static org.apache.ignite.lang.IgniteStringFormatter.format;
+
+import java.util.Objects;
+import java.util.UUID;
+
+/**
+ * Remote exception stub. This exception is used to indicate an exception was 
thrown and logged on the remote node.
+ */
+public class RemoteException extends IgniteInternalException {
+    /** Serial version uid. */
+    private static final long serialVersionUID = 0L;
+
+    /**
+     * Creates a new exception with the given trace id and error code.
+     *
+     * @param nodeName Node name, where original exception was thrown.
+     * @param traceId Unique identifier of this exception.
+     * @param code Full error code.
+     * @param originalMessage Original error message from remote node.
+     */
+    public RemoteException(String nodeName, UUID traceId, int code, String 
originalMessage) {
+        this(traceId, code, format("Remote exception: node={}, 
originalMessage={}", Objects.requireNonNull(nodeName), originalMessage));
+    }
+
+    /**
+     * Creates a new exception with the given trace id, error code and detail 
message.
+     *
+     * @param traceId Unique identifier of this exception.
+     * @param code Full error code.
+     * @param message Detail message.
+     */
+    protected RemoteException(UUID traceId, int code, String message) {
+        super(traceId, code, message, null);
+    }
+}
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
index 56bcd4563b..a8e3e67f14 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/api/ItSqlAsynchronousApiTest.java
@@ -76,7 +76,6 @@ import org.apache.ignite.sql.async.AsyncResultSet;
 import org.apache.ignite.table.Table;
 import org.apache.ignite.tx.IgniteTransactions;
 import org.apache.ignite.tx.Transaction;
-import org.apache.ignite.tx.TransactionException;
 import org.apache.ignite.tx.TransactionOptions;
 import org.hamcrest.Matcher;
 import org.junit.jupiter.api.AfterEach;
@@ -316,7 +315,7 @@ public class ItSqlAsynchronousApiTest extends 
ClusterPerClassIntegrationTest {
         // Outdated tx.
         Transaction outerTx0 = outerTx;
 
-        assertThrows(TransactionException.class,
+        assertThrows(SqlException.class,
                 () -> checkDml(1, ses, "INSERT INTO TEST VALUES (?, ?)", 
outerTx0, ROW_COUNT, Integer.MAX_VALUE));
 
         assertThrows(SqlException.class,
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
index f16ffc43fb..f0ce4c9335 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
@@ -39,7 +39,9 @@ import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 
-/** Different DML tests. */
+/**
+ * Various DML tests.
+ */
 public class ItDmlTest extends ClusterPerClassIntegrationTest {
 
     @Override
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
index 65c6995b1c..95aa6fd54e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
@@ -17,15 +17,13 @@
 
 package org.apache.ignite.internal.sql.engine;
 
-import java.lang.reflect.Constructor;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.sql.engine.metadata.RemoteException;
 import org.apache.ignite.internal.tx.InternalTransaction;
 import org.apache.ignite.internal.util.ExceptionUtils;
 import org.apache.ignite.lang.IgniteException;
+import org.apache.ignite.lang.IgniteInternalException;
 import org.apache.ignite.sql.ResultSetMetadata;
-import org.jetbrains.annotations.NotNull;
+import org.apache.ignite.sql.SqlException;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -97,49 +95,15 @@ public class AsyncSqlCursorImpl<T> implements 
AsyncSqlCursor<T> {
         return dataCursor.closeAsync();
     }
 
-    private static RuntimeException wrapIfNecessary(@NotNull Throwable t) {
-        Throwable cause = unwrapRemoteCause(t);
+    private static RuntimeException wrapIfNecessary(Throwable t) {
+        Throwable err = ExceptionUtils.unwrapCause(t);
 
-        // If the cause is IgniteException then create
-        // an exception of the same type with the same properties
-        // and set its cause to the original exception.
-        if (cause instanceof IgniteException) {
-            return preserveExceptionType((IgniteException) cause, t);
-        } else {
-            // If the cause is not a subclass of IgniteException, wrap it in 
IgniteException.
-            return IgniteException.wrap(t);
-        }
-    }
-
-    private static Throwable unwrapRemoteCause(@NotNull Throwable t) {
-        Throwable err = t;
+        if (err instanceof IgniteInternalException) {
+            IgniteInternalException iex = (IgniteInternalException) err;
 
-        while (err != null) {
-            err = ExceptionUtils.unwrapCause(err);
-            // Unwrap RemoteExceptions because they are just wrappers.
-            if (err instanceof RemoteException) {
-                err = err.getCause();
-                continue;
-            }
-
-            return err;
+            return new SqlException(iex.traceId(), iex.code(), 
iex.getMessage(), iex);
         }
 
-        return t;
-    }
-
-    private static IgniteException preserveExceptionType(IgniteException e, 
Throwable t) {
-        // Return IgniteException as is
-        if (e.getClass() == IgniteException.class) {
-            return e;
-        }
-
-        try {
-            Constructor<?> ctor = 
e.getClass().getDeclaredConstructor(UUID.class, int.class, String.class, 
Throwable.class);
-
-            return (IgniteException) ctor.newInstance(e.traceId(), e.code(), 
e.getMessage(), t);
-        } catch (Exception ex) {
-            throw new RuntimeException("IgniteException-derived class does not 
have required constructor: " + e.getClass().getName(), ex);
-        }
+        return IgniteException.wrap(t);
     }
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
index a25cc6bfe9..0027f8f94e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExchangeServiceImpl.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine.exec;
 
 import static org.apache.ignite.lang.ErrorGroups.Common.UNEXPECTED_ERR;
+import static org.apache.ignite.lang.IgniteStringFormatter.format;
 
 import java.util.List;
 import java.util.UUID;
@@ -33,7 +34,12 @@ import 
org.apache.ignite.internal.sql.engine.message.QueryBatchRequestMessage;
 import org.apache.ignite.internal.sql.engine.message.SqlQueryMessageGroup;
 import org.apache.ignite.internal.sql.engine.message.SqlQueryMessagesFactory;
 import org.apache.ignite.internal.sql.engine.util.Commons;
+import org.apache.ignite.internal.util.ExceptionUtils;
+import org.apache.ignite.lang.IgniteException;
+import org.apache.ignite.lang.IgniteInternalCheckedException;
 import org.apache.ignite.lang.IgniteInternalException;
+import org.apache.ignite.sql.SqlException;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -105,16 +111,44 @@ public class ExchangeServiceImpl implements 
ExchangeService {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<Void> sendError(String nodeName, UUID queryId, 
long fragmentId, Throwable error) {
+        IgniteException errorWithCode = wrapIfNecessary(error);
+
+        if (!(error instanceof ExecutionCancelledException)) {
+            LOG.info(format("Failed to execute query fragment: queryId={}, 
fragmentId={}", queryId, fragmentId), errorWithCode);
+        } else if (LOG.isDebugEnabled()) {
+            LOG.debug(format("Failed to execute query fragment: queryId={}, 
fragmentId={}", queryId, fragmentId), errorWithCode);
+        }
+
         return messageService.send(
                 nodeName,
                 FACTORY.errorMessage()
                         .queryId(queryId)
                         .fragmentId(fragmentId)
-                        .error(error)
+                        .traceId(errorWithCode.traceId())
+                        .code(errorWithCode.code())
+                        .message(errorWithCode.getMessage())
                         .build()
         );
     }
 
+    private static IgniteException wrapIfNecessary(@NotNull Throwable t) {
+        Throwable cause = ExceptionUtils.unwrapCause(t);
+
+        if (cause instanceof IgniteException) {
+            return cause == t ? (IgniteException) cause : 
IgniteException.wrap(t);
+        } else if (cause instanceof IgniteInternalException) {
+            IgniteInternalException iex = (IgniteInternalException) cause;
+
+            return new SqlException(iex.traceId(), iex.code(), 
iex.getMessage(), iex);
+        } else if (cause instanceof IgniteInternalCheckedException) {
+            IgniteInternalCheckedException iex = 
(IgniteInternalCheckedException) cause;
+
+            return new SqlException(iex.traceId(), iex.code(), 
iex.getMessage(), iex);
+        } else {
+            return new SqlException(UNEXPECTED_ERR, cause);
+        }
+    }
+
     private void onMessage(String nodeName, QueryBatchRequestMessage msg) {
         CompletableFuture<Outbox<?>> outboxFut = 
mailboxRegistry.outbox(msg.queryId(), msg.exchangeId());
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
index 76c2404894..37dd817ff9 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
@@ -62,7 +62,7 @@ import 
org.apache.ignite.internal.sql.engine.metadata.FragmentDescription;
 import org.apache.ignite.internal.sql.engine.metadata.MappingService;
 import org.apache.ignite.internal.sql.engine.metadata.MappingServiceImpl;
 import org.apache.ignite.internal.sql.engine.metadata.NodeWithTerm;
-import org.apache.ignite.internal.sql.engine.metadata.RemoteException;
+import 
org.apache.ignite.internal.sql.engine.metadata.RemoteFragmentExecutionException;
 import org.apache.ignite.internal.sql.engine.prepare.Cloner;
 import org.apache.ignite.internal.sql.engine.prepare.DdlPlan;
 import org.apache.ignite.internal.sql.engine.prepare.ExplainPlan;
@@ -352,7 +352,14 @@ public class ExecutionServiceImpl<RowT> implements 
ExecutionService, TopologyEve
         DistributedQueryManager dqm = queryManagerMap.get(msg.queryId());
 
         if (dqm != null) {
-            RemoteException e = new RemoteException(nodeName, msg.queryId(), 
msg.fragmentId(), msg.error());
+            RemoteFragmentExecutionException e = new 
RemoteFragmentExecutionException(
+                    nodeName,
+                    msg.queryId(),
+                    msg.fragmentId(),
+                    msg.traceId(),
+                    msg.code(),
+                    msg.message()
+            );
 
             dqm.onError(e);
         }
@@ -495,7 +502,7 @@ public class ExecutionServiceImpl<RowT> implements 
ExecutionService, TopologyEve
             remoteFragmentInitCompletion.get(new RemoteFragmentKey(nodeName, 
fragmentId)).complete(null);
         }
 
-        private void onError(RemoteException ex) {
+        private void onError(RemoteFragmentExecutionException ex) {
             root.thenAccept(root -> {
                 root.onError(ex);
 
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
index 7f22aca0b4..43900c918e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/ErrorMessage.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.sql.engine.message;
 import java.io.Serializable;
 import java.util.UUID;
 import org.apache.ignite.network.NetworkMessage;
-import org.apache.ignite.network.annotations.Marshallable;
 import org.apache.ignite.network.annotations.Transferable;
 
 /**
@@ -40,8 +39,17 @@ public interface ErrorMessage extends NetworkMessage, 
Serializable {
     long fragmentId();
 
     /**
-     * Get error.
+     * Get error traceId.
      */
-    @Marshallable
-    Throwable error();
+    UUID traceId();
+
+    /**
+     * Gets error code.
+     */
+    int code();
+
+    /**
+     * Gets original error message.
+     */
+    String message();
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteException.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteFragmentExecutionException.java
similarity index 60%
rename from 
modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteException.java
rename to 
modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteFragmentExecutionException.java
index 95822b032c..8314e0307e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteException.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/metadata/RemoteFragmentExecutionException.java
@@ -17,13 +17,19 @@
 
 package org.apache.ignite.internal.sql.engine.metadata;
 
+import static org.apache.ignite.lang.IgniteStringFormatter.format;
+
 import java.util.UUID;
+import org.apache.ignite.lang.RemoteException;
+import org.jetbrains.annotations.Nullable;
 
 /**
- * RemoteException.
- * TODO Documentation https://issues.apache.org/jira/browse/IGNITE-15859
+ * Remote query fragment exception. This exception is used to indicate a 
remote fragment execution has been failed.
  */
-public class RemoteException extends RuntimeException {
+public class RemoteFragmentExecutionException extends RemoteException {
+    /** Serial version uid. */
+    private static final long serialVersionUID = 0L;
+
     private final String nodeName;
 
     private final UUID queryId;
@@ -33,13 +39,26 @@ public class RemoteException extends RuntimeException {
     /**
      * Constructor.
      *
-     * @param cause Cause.
      * @param nodeName Node consistent ID.
      * @param queryId Query ID.
      * @param fragmentId Fragment ID.
+     * @param traceId Unique identifier of this exception.
+     * @param code Full error code.
+     * @param message Original error message from remote node.
      */
-    public RemoteException(String nodeName, UUID queryId, long fragmentId, 
Throwable cause) {
-        super("Remote query execution", cause);
+    public RemoteFragmentExecutionException(
+            String nodeName,
+            UUID queryId,
+            long fragmentId,
+            UUID traceId,
+            int code,
+            @Nullable String message
+    ) {
+        super(traceId, code,
+                format("Query remote fragment execution failed: nodeName={}, 
queryId={}, fragmentId={}, originalMessage={}",
+                        nodeName, queryId, fragmentId, message)
+        );
+
         this.nodeName = nodeName;
         this.queryId = queryId;
         this.fragmentId = fragmentId;
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index d9ee94036c..305b4b17d7 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -31,6 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.isA;
@@ -73,7 +74,7 @@ import 
org.apache.ignite.internal.sql.engine.message.MessageService;
 import org.apache.ignite.internal.sql.engine.message.QueryStartRequest;
 import org.apache.ignite.internal.sql.engine.message.SqlQueryMessagesFactory;
 import org.apache.ignite.internal.sql.engine.metadata.ColocationGroup;
-import org.apache.ignite.internal.sql.engine.metadata.RemoteException;
+import 
org.apache.ignite.internal.sql.engine.metadata.RemoteFragmentExecutionException;
 import org.apache.ignite.internal.sql.engine.prepare.MappingQueryContext;
 import org.apache.ignite.internal.sql.engine.prepare.PrepareService;
 import org.apache.ignite.internal.sql.engine.prepare.PrepareServiceImpl;
@@ -323,8 +324,8 @@ public class ExecutionServiceImplTest {
 
         await(batchFut.exceptionally(ex -> {
             assertInstanceOf(CompletionException.class, ex);
-            assertInstanceOf(RemoteException.class, ex.getCause());
-            assertInstanceOf(ExecutionCancelledException.class, 
ex.getCause().getCause());
+            assertInstanceOf(RemoteFragmentExecutionException.class, 
ex.getCause());
+            assertNull(ex.getCause().getCause());
 
             return null;
         }));
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
index d9308c7f8c..9939084c42 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
@@ -91,6 +91,7 @@ import 
org.apache.ignite.internal.storage.rocksdb.configuration.schema.RocksDbSt
 import org.apache.ignite.internal.table.distributed.TableManager;
 import 
org.apache.ignite.internal.table.distributed.raft.snapshot.outgoing.OutgoingSnapshotsManager;
 import org.apache.ignite.internal.testframework.IgniteAbstractTest;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
 import org.apache.ignite.internal.tx.TxManager;
 import org.apache.ignite.internal.vault.VaultManager;
 import org.apache.ignite.lang.ByteArray;
@@ -414,14 +415,14 @@ public class MockedStructuresTest extends 
IgniteAbstractTest {
 
         
when(distributionZoneManager.zoneIdAsyncInternal(nonExistZone)).thenReturn(completedFuture(null));
 
-        Exception exception = assertThrows(
-                IgniteException.class,
+        Throwable exception = assertThrows(
+                Throwable.class,
                 () -> readFirst(queryProc.querySingleAsync(sessionId, context,
                         String.format("CREATE TABLE %s (c1 int PRIMARY KEY, c2 
varbinary(255)) "
                                 + "with primary_zone='%s'", tableName, 
nonExistZone)))
         );
 
-        assertInstanceOf(DistributionZoneNotFoundException.class, 
exception.getCause());
+        assertTrue(IgniteTestUtils.hasCause(exception.getCause(), 
DistributionZoneNotFoundException.class, null));
 
         log.info("Creating a table with a ClusterManagementGroupManager 
throwing an exception.");
 
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 2ec5b0ae9b..b302568278 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -1618,7 +1618,7 @@ public class TableManager extends Producer<TableEvent, 
TableEventParameters> imp
             ex = t;
         }
 
-        return ex instanceof IgniteException ? (IgniteException) ex : new 
IgniteException(ex);
+        return (ex instanceof IgniteException) ? (IgniteException) ex : 
IgniteException.wrap(ex);
     }
 
     /**

Reply via email to