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);
}
/**