This is an automated email from the ASF dual-hosted git repository. jiangtian pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push: new 490aab1341b Fixed the NPE caused by multiple errors (#16091) 490aab1341b is described below commit 490aab1341b520e4b1931b0de9a4af9540df7a6f Author: Caideyipi <87789683+caidey...@users.noreply.github.com> AuthorDate: Tue Aug 5 18:27:18 2025 +0800 Fixed the NPE caused by multiple errors (#16091) * partial * fix * partial * add-failure-hanlder --- .../procedure/impl/cq/CreateCQProcedure.java | 4 +- .../procedure/impl/schema/SetTTLProcedure.java | 2 +- .../impl/schema/SetTemplateProcedure.java | 12 +-- .../impl/schema/UnsetTemplateProcedure.java | 4 +- .../impl/schema/table/AddTableColumnProcedure.java | 7 +- .../impl/schema/table/CreateTableProcedure.java | 6 +- .../schema/table/DropTableColumnProcedure.java | 4 +- .../impl/schema/table/DropTableProcedure.java | 4 +- .../schema/table/RenameTableColumnProcedure.java | 7 +- .../impl/schema/table/RenameTableProcedure.java | 7 +- .../schema/table/SetTablePropertiesProcedure.java | 7 +- .../schema/table/view/AddViewColumnProcedure.java | 3 +- .../table/view/CreateTableViewProcedure.java | 6 +- .../impl/sync/AuthOperationProcedure.java | 2 +- .../iotdb/db/auth/ClusterAuthorityFetcher.java | 5 +- .../queryengine/execution/QueryStateMachine.java | 2 +- .../analyze/cache/partition/PartitionCache.java | 3 +- .../analyze/schema/AutoCreateSchemaExecutor.java | 6 +- .../queryengine/plan/execution/QueryExecution.java | 2 +- .../plan/execution/config/ConfigExecution.java | 54 +++++++--- .../plan/execution/config/ConfigTaskResult.java | 11 ++ .../config/executor/ClusterConfigTaskExecutor.java | 114 ++++++++++----------- .../template/ClusterTemplateManager.java | 10 +- .../apache/iotdb/db/utils/ErrorHandlingUtils.java | 12 ++- .../iotdb/commons/exception/IoTDBException.java | 15 +++ .../commons/exception/IoTDBRuntimeException.java | 15 +++ 26 files changed, 193 insertions(+), 131 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/cq/CreateCQProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/cq/CreateCQProcedure.java index 2b274be607c..3da60c5ad84 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/cq/CreateCQProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/cq/CreateCQProcedure.java @@ -136,10 +136,10 @@ public class CreateCQProcedure extends AbstractNodeProcedure<CreateCQState> { setNextState(INACTIVE); } else if (res.code == TSStatusCode.CQ_ALREADY_EXIST.getStatusCode()) { LOGGER.info("Failed to init CQ {} because such cq already exists", req.cqId); - setFailure(new ProcedureException(new IoTDBException(res.message, res.code))); + setFailure(new ProcedureException(new IoTDBException(res))); } else { LOGGER.warn("Failed to init CQ {} because of unknown reasons {}", req.cqId, res); - setFailure(new ProcedureException(new IoTDBException(res.message, res.code))); + setFailure(new ProcedureException(new IoTDBException(res))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTTLProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTTLProcedure.java index 9b43af2003b..3e1af7dd1f5 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTTLProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTTLProcedure.java @@ -97,7 +97,7 @@ public class SetTTLProcedure extends StateMachineProcedure<ConfigNodeProcedureEn } if (res.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.info("Failed to execute plan {} because {}", plan, res.message); - setFailure(new ProcedureException(new IoTDBException(res.message, res.code))); + setFailure(new ProcedureException(new IoTDBException(res))); } else { setNextState(SetTTLState.UPDATE_DATANODE_CACHE); } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java index 46c09e9f36f..a5463439f66 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/SetTemplateProcedure.java @@ -168,9 +168,7 @@ public class SetTemplateProcedure if (resp.getStatus().getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(SetTemplateState.PRE_SET); } else { - setFailure( - new ProcedureException( - new IoTDBException(resp.getStatus().getMessage(), resp.getStatus().getCode()))); + setFailure(new ProcedureException(new IoTDBException(resp.getStatus()))); } } @@ -193,7 +191,7 @@ public class SetTemplateProcedure templateName, templateSetPath, status.getMessage()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -368,7 +366,7 @@ public class SetTemplateProcedure templateName, templateSetPath, status.getMessage()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -470,7 +468,7 @@ public class SetTemplateProcedure templateName, templateSetPath, status.getMessage()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -529,7 +527,7 @@ public class SetTemplateProcedure templateName, templateSetPath, status.getMessage()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java index fd8eb399406..464c6b7c21b 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java @@ -136,7 +136,7 @@ public class UnsetTemplateProcedure if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(UnsetTemplateState.CLEAN_DATANODE_TEMPLATE_CACHE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -199,7 +199,7 @@ public class UnsetTemplateProcedure .getClusterSchemaManager() .unsetSchemaTemplateInBlackList(template.getId(), path, isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AddTableColumnProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AddTableColumnProcedure.java index bdb5331e01e..d5b99942721 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AddTableColumnProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/AddTableColumnProcedure.java @@ -110,8 +110,7 @@ public class AddTableColumnProcedure database, tableName, addedColumnList, this instanceof AddViewColumnProcedure); final TSStatus status = result.getLeft(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure( - new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); return; } table = result.getRight(); @@ -137,7 +136,7 @@ public class AddTableColumnProcedure : new AddTableColumnPlan(database, tableName, addedColumnList, false), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } else { setNextState(AddTableColumnState.COMMIT_RELEASE); } @@ -186,7 +185,7 @@ public class AddTableColumnProcedure : new AddTableColumnPlan(database, tableName, addedColumnList, true), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java index 7890256675b..d0fbdb605d1 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/CreateTableProcedure.java @@ -142,7 +142,7 @@ public class CreateTableProcedure if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(CreateTableState.PRE_RELEASE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -175,7 +175,7 @@ public class CreateTableProcedure if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(CreateTableState.COMMIT_RELEASE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -225,7 +225,7 @@ public class CreateTableProcedure new RollbackCreateTablePlan(database, table.getTableName()), env, LOGGER); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.warn("Failed to rollback table creation {}.{}", database, table.getTableName()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableColumnProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableColumnProcedure.java index 02bd1679b52..65b591f0322 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableColumnProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableColumnProcedure.java @@ -142,7 +142,7 @@ public class DropTableColumnProcedure isAttributeColumn = status.isSetMessage(); setNextState(DropTableColumnState.INVALIDATE_CACHE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -216,7 +216,7 @@ public class DropTableColumnProcedure : new CommitDeleteColumnPlan(database, tableName, columnName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableProcedure.java index 1d9dbef13e2..1f02014e994 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/DropTableProcedure.java @@ -125,7 +125,7 @@ public class DropTableProcedure extends AbstractAlterOrDropTableProcedure<DropTa if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(DropTableState.INVALIDATE_CACHE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -201,7 +201,7 @@ public class DropTableProcedure extends AbstractAlterOrDropTableProcedure<DropTa : new CommitDeleteTablePlan(database, tableName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableColumnProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableColumnProcedure.java index 8303a4481f7..da51dad2672 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableColumnProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableColumnProcedure.java @@ -113,8 +113,7 @@ public class RenameTableColumnProcedure database, tableName, oldName, newName, this instanceof RenameViewColumnProcedure); final TSStatus status = result.getLeft(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure( - new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); return; } table = result.getRight(); @@ -140,7 +139,7 @@ public class RenameTableColumnProcedure : new RenameTableColumnPlan(database, tableName, oldName, newName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } else { setNextState(RenameTableColumnState.COMMIT_RELEASE); } @@ -184,7 +183,7 @@ public class RenameTableColumnProcedure new RenameTableColumnPlan(database, tableName, newName, oldName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java index 1e5dc24781c..93d1035a761 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/RenameTableProcedure.java @@ -106,8 +106,7 @@ public class RenameTableProcedure extends AbstractAlterOrDropTableProcedure<Rena database, tableName, newName, this instanceof RenameViewProcedure); final TSStatus status = result.getLeft(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure( - new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); return; } table = result.getRight(); @@ -133,7 +132,7 @@ public class RenameTableProcedure extends AbstractAlterOrDropTableProcedure<Rena : new RenameTablePlan(database, tableName, newName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } else { setNextState(RenameTableState.COMMIT_RELEASE); } @@ -175,7 +174,7 @@ public class RenameTableProcedure extends AbstractAlterOrDropTableProcedure<Rena : new RenameTablePlan(database, newName, tableName), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java index 6c0673068eb..eedbf7fdb3d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/SetTablePropertiesProcedure.java @@ -130,8 +130,7 @@ public class SetTablePropertiesProcedure this instanceof SetViewPropertiesProcedure); final TSStatus status = result.getLeft(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure( - new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); return; } table = result.getRight(); @@ -157,7 +156,7 @@ public class SetTablePropertiesProcedure : new SetTablePropertiesPlan(database, tableName, updatedProperties), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } else { setNextState(COMMIT_RELEASE); } @@ -207,7 +206,7 @@ public class SetTablePropertiesProcedure new SetTablePropertiesPlan(database, tableName, originalProperties), isGeneratedByPipe); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/AddViewColumnProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/AddViewColumnProcedure.java index 5418822aafb..27a0618ab6a 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/AddViewColumnProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/AddViewColumnProcedure.java @@ -76,8 +76,7 @@ public class AddViewColumnProcedure extends AddTableColumnProcedure { new TreeDeviceViewFieldDetector(env.getConfigManager(), table, fields2Detect) .detectMissingFieldTypes(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure( - new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/CreateTableViewProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/CreateTableViewProcedure.java index c8b3b02d3cb..b7fb458c8bb 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/CreateTableViewProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/table/view/CreateTableViewProcedure.java @@ -111,7 +111,7 @@ public class CreateTableViewProcedure extends CreateTableProcedure { new TreeDeviceViewFieldDetector(env.getConfigManager(), table, null) .detectMissingFieldTypes(); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -123,7 +123,7 @@ public class CreateTableViewProcedure extends CreateTableProcedure { if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { setNextState(CreateTableState.PRE_RELEASE); } else { - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } @@ -138,7 +138,7 @@ public class CreateTableViewProcedure extends CreateTableProcedure { new PreCreateTableViewPlan(database, oldView, oldStatus), env, LOGGER); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { LOGGER.warn("Failed to rollback table creation {}.{}", database, table.getTableName()); - setFailure(new ProcedureException(new IoTDBException(status.getMessage(), status.getCode()))); + setFailure(new ProcedureException(new IoTDBException(status))); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java index 9d4fb61f85d..4b2fea1aac8 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java @@ -162,7 +162,7 @@ public class AuthOperationProcedure extends AbstractNodeProcedure<AuthOperationP "Execute auth plan {} success. To invalidate datanodes: {}", plan, dataNodesToInvalid); } else { LOGGER.info("Failed to execute plan {} because {}", plan, res.message); - setFailure(new ProcedureException(new IoTDBException(res.message, res.code))); + setFailure(new ProcedureException(new IoTDBException(res))); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java index 48c70658fa7..4dbad54d51c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/auth/ClusterAuthorityFetcher.java @@ -378,7 +378,7 @@ public class ClusterAuthorityFetcher implements IAuthorityFetcher { : configNodeClient.operatePermission( statementToAuthorizerReq((AuthorStatement) plan)); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { onOperatePermissionSuccess(plan); future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -437,8 +437,7 @@ public class ClusterAuthorityFetcher implements IAuthorityFetcher { LOGGER.error(CONNECTERROR); authorizerResp.setStatus( RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, CONNECTERROR)); - future.setException( - new IoTDBException(authorizerResp.getStatus().message, authorizerResp.getStatus().code)); + future.setException(new IoTDBException(authorizerResp.getStatus())); } return future; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/QueryStateMachine.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/QueryStateMachine.java index cc0f787b014..c7c16f20baf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/QueryStateMachine.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/QueryStateMachine.java @@ -149,7 +149,7 @@ public class QueryStateMachine { public Throwable getFailureException() { Throwable throwable = failureException.get(); if (throwable == null) { - return new IoTDBException(getFailureStatus().getMessage(), getFailureStatus().code); + return new IoTDBException(getFailureStatus()); } else { return throwable; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java index 5202a9103d7..5d8a710ba3e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/cache/partition/PartitionCache.java @@ -315,8 +315,7 @@ public class PartitionCache { userName, PrivilegeType.MANAGE_DATABASE), PrivilegeType.MANAGE_DATABASE); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - throw new RuntimeException( - new IoTDBException(status.getMessage(), status.getCode())); + throw new RuntimeException(new IoTDBException(status)); } } } finally { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java index 80b17a2a45c..dd3c925786a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java @@ -549,7 +549,7 @@ class AutoCreateSchemaExecutor { status = executionResult.status; if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() && status.getCode() != TSStatusCode.TEMPLATE_IS_IN_USE.getStatusCode()) { - throw new SemanticException(new IoTDBException(status.getMessage(), status.getCode())); + throw new SemanticException(new IoTDBException(status)); } } @@ -581,7 +581,7 @@ class AutoCreateSchemaExecutor { throw new SemanticException(new MetadataException(String.join("; ", failedActivationSet))); } } else { - throw new SemanticException(new IoTDBException(status.getMessage(), status.getCode())); + throw new SemanticException(new IoTDBException(status)); } } @@ -660,7 +660,7 @@ class AutoCreateSchemaExecutor { if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode() && status.getCode() != TSStatusCode.MEASUREMENT_ALREADY_EXISTS_IN_TEMPLATE.getStatusCode()) { - throw new SemanticException(new IoTDBException(status.getMessage(), status.getCode())); + throw new SemanticException(new IoTDBException(status)); } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java index dbb99dbde90..2c1657e839e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java @@ -464,7 +464,7 @@ public class QueryExecution implements IQueryExecution { stateMachine.transitionToFailed(t); TSStatus status = stateMachine.getFailureStatus(); if (status != null) { - throw new IoTDBException(status.getMessage(), status.code); + throw new IoTDBException(status); } else { Throwable rootCause = stateMachine.getFailureException(); if (rootCause != null) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java index 6af502dd50a..1ae57fe38d5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.execution.config; +import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.commons.exception.IoTDBException; import org.apache.iotdb.commons.exception.IoTDBRuntimeException; import org.apache.iotdb.commons.utils.TestOnly; @@ -161,12 +162,22 @@ public class ConfigExecution implements IQueryExecution { private void fail(final Throwable cause) { int errorCode = TSStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(); + TSStatus status = null; if (cause instanceof IoTDBException) { - errorCode = ((IoTDBException) cause).getErrorCode(); + if (Objects.nonNull(((IoTDBException) cause).getStatus())) { + status = ((IoTDBException) cause).getStatus(); + } else { + errorCode = ((IoTDBException) cause).getErrorCode(); + } } else if (cause instanceof IoTDBRuntimeException) { - errorCode = ((IoTDBRuntimeException) cause).getErrorCode(); + if (Objects.nonNull(((IoTDBRuntimeException) cause).getStatus())) { + status = ((IoTDBRuntimeException) cause).getStatus(); + } else { + errorCode = ((IoTDBRuntimeException) cause).getErrorCode(); + } } - if (!userExceptionCodes.contains(errorCode)) { + if (Objects.nonNull(status) && isUserException(status) + || !userExceptionCodes.contains(errorCode)) { LOGGER.warn( "Failures happened during running ConfigExecution when executing {}.", Objects.nonNull(task) ? task.getClass().getSimpleName() : null, @@ -179,15 +190,31 @@ public class ConfigExecution implements IQueryExecution { errorCode); } stateMachine.transitionToFailed(cause); - final ConfigTaskResult result = - cause instanceof StatementExecutionException - ? new ConfigTaskResult( - TSStatusCode.representOf(((StatementExecutionException) cause).getStatusCode())) - : new ConfigTaskResult(TSStatusCode.representOf(errorCode)); + final ConfigTaskResult result; + if (Objects.nonNull(status)) { + result = new ConfigTaskResult(status); + } else { + result = + cause instanceof StatementExecutionException + ? new ConfigTaskResult( + TSStatusCode.representOf(((StatementExecutionException) cause).getStatusCode())) + : new ConfigTaskResult(TSStatusCode.representOf(errorCode)); + } taskFuture.set(result); } + private boolean isUserException(final TSStatus status) { + if (status.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) { + return status.getSubStatus().stream() + .allMatch( + s -> + s.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode() + || userExceptionCodes.contains(s.getCode())); + } + return userExceptionCodes.contains(status.getCode()); + } + @Override public void stop(Throwable t) { // do nothing @@ -211,14 +238,17 @@ public class ConfigExecution implements IQueryExecution { @Override public ExecutionResult getStatus() { try { - ConfigTaskResult taskResult = taskFuture.get(); - TSStatusCode statusCode = taskResult.getStatusCode(); + final ConfigTaskResult taskResult = taskFuture.get(); resultSet = taskResult.getResultSet(); datasetHeader = taskResult.getResultSetHeader(); - String message = + if (Objects.nonNull(taskResult.getStatus())) { + return new ExecutionResult(context.getQueryId(), taskResult.getStatus()); + } + final TSStatusCode statusCode = taskResult.getStatusCode(); + final String message = statusCode == TSStatusCode.SUCCESS_STATUS ? "" : stateMachine.getFailureMessage(); return new ExecutionResult(context.getQueryId(), RpcUtils.getStatus(statusCode, message)); - } catch (InterruptedException | ExecutionException e) { + } catch (final InterruptedException | ExecutionException e) { if (e instanceof InterruptedException) { Thread.currentThread().interrupt(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskResult.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskResult.java index cc003e31c77..3f4f525bdc6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskResult.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigTaskResult.java @@ -19,12 +19,14 @@ package org.apache.iotdb.db.queryengine.plan.execution.config; +import org.apache.iotdb.common.rpc.thrift.TSStatus; import org.apache.iotdb.db.queryengine.common.header.DatasetHeader; import org.apache.iotdb.rpc.TSStatusCode; import org.apache.tsfile.read.common.block.TsBlock; public class ConfigTaskResult { + private TSStatus status; private TSStatusCode statusCode; private TsBlock resultSet; private DatasetHeader resultSetHeader; @@ -40,6 +42,15 @@ public class ConfigTaskResult { this.resultSetHeader = resultSetHeader; } + public ConfigTaskResult(final TSStatus status) { + this.status = status; + this.statusCode = TSStatusCode.representOf(status.getCode()); + } + + public TSStatus getStatus() { + return status; + } + public TSStatusCode getStatusCode() { return statusCode; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index b96dea27a66..d5dc521292e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -430,7 +430,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { "Failed to execute create database {} in config node, status is {}.", databaseSchemaStatement.getDatabasePath(), tsStatus); - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } } else { @@ -462,7 +462,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { databaseSchemaStatement.getDatabasePath(), tsStatus); } - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -535,7 +535,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { future.setException( new BatchProcessException(tsStatus.subStatus.toArray(new TSStatus[0]))); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -689,7 +689,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { udfName, className, executionStatus.getMessage()); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -716,7 +716,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { LOGGER.warn("[{}] Failed to drop function {}.", executionStatus, udfName); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -871,7 +871,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { executionStatus, createTriggerStatement.getTriggerName(), executionStatus.message); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -889,7 +889,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { final TSStatus executionStatus = client.dropTrigger(new TDropTriggerReq(triggerName)); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { LOGGER.warn("[{}] Failed to drop trigger {}.", executionStatus, triggerName); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1055,7 +1055,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { pluginName, className, executionStatus.getMessage()); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1082,7 +1082,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { "[{}] Failed to drop pipe plugin {}.", executionStatus, dropPipePluginStatement.getPluginName()); - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1133,7 +1133,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { taskName, setTTLStatement.getPath(), tsStatus); - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1166,7 +1166,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1195,7 +1195,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1221,7 +1221,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1241,7 +1241,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { + ignoredConfigItems + " because they are immutable or undefined."); if (req.getConfigs().isEmpty()) { - future.setException(new IoTDBException(warningTsStatus.message, warningTsStatus.code)); + future.setException(new IoTDBException(warningTsStatus)); return future; } } @@ -1264,7 +1264,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1317,7 +1317,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1345,7 +1345,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -1437,7 +1437,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TSStatus executionStatus = client.killQuery(queryId, dataNodeId); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1680,7 +1680,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { resp = client.showAINodes(); if (resp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(resp.getStatus().message, resp.getStatus().code)); + future.setException(new IoTDBException(resp.getStatus())); return future; } } catch (final ClientManagerException | TException e) { @@ -1701,7 +1701,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { ClusterTemplateManager.getInstance().createSchemaTemplate(createSchemaTemplateStatement); // Get response or throw exception if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1810,7 +1810,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1831,7 +1831,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { configNodeClient.dropSchemaTemplate(dropSchemaTemplateStatement.getTemplateName()); // Get response or throw exception if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1902,7 +1902,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -1953,7 +1953,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2018,7 +2018,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setConnectorAttributes(createPipeStatement.getConnectorAttributes()); final TSStatus tsStatus = configNodeClient.createPipe(req); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2190,7 +2190,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { req.setIsTableModel(alterPipeStatement.isTableModel()); final TSStatus tsStatus = configNodeClient.alterPipe(req); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2297,7 +2297,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setPipeName(startPipeStatement.getPipeName()) .setIsTableModel(startPipeStatement.isTableModel())); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2331,7 +2331,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setIfExistsCondition(dropPipeStatement.hasIfExistsCondition()) .setIsTableModel(dropPipeStatement.isTableModel())); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2365,7 +2365,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setPipeName(stopPipeStatement.getPipeName()) .setIsTableModel(stopPipeStatement.isTableModel())); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2453,7 +2453,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setIfExistsCondition(dropSubscriptionStatement.hasIfExistsCondition()) .setIsTableModel(dropSubscriptionStatement.isTableModel())); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2524,7 +2524,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setTopicAttributes(topicAttributes); final TSStatus tsStatus = configNodeClient.createTopic(req); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2550,7 +2550,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { .setTopicName(dropTopicStatement.getTopicName()) .setIsTableModel(dropTopicStatement.isTableModel())); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2626,7 +2626,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { future.setException( new BatchProcessException(tsStatus.subStatus.toArray(new TSStatus[0]))); } else { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -2664,7 +2664,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2749,7 +2749,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } while (TSStatusCode.OVERLAP_WITH_EXISTING_TASK.getStatusCode() == tsStatus.getCode()); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -2825,7 +2825,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { future.setException( new BatchProcessException(tsStatus.subStatus.toArray(new TSStatus[0]))); } else { - future.setException(new IoTDBException(tsStatus.getMessage(), tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -2911,7 +2911,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { TimePartitionUtils.getTimePartitionSlot(getRegionIdStatement.getEndTimeStamp())); resp = configNodeClient.getRegionId(tGetRegionIdReq); if (resp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(resp.getStatus().message, resp.getStatus().code)); + future.setException(new IoTDBException(resp.getStatus())); return future; } } catch (final Exception e) { @@ -2934,7 +2934,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { getSeriesSlotListStatement.getPartitionType()); resp = configNodeClient.getSeriesSlotList(tGetSeriesSlotListReq); if (resp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(resp.getStatus().message, resp.getStatus().code)); + future.setException(new IoTDBException(resp.getStatus())); return future; } } catch (final Exception e) { @@ -2969,7 +2969,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } resp = configNodeClient.getTimeSlotList(tGetTimeSlotListReq); if (resp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(resp.getStatus().message, resp.getStatus().code)); + future.setException(new IoTDBException(resp.getStatus())); return future; } } catch (final Exception e) { @@ -3004,7 +3004,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } resp = configNodeClient.countTimeSlotList(tCountTimeSlotListReq); if (resp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(resp.getStatus().message, resp.getStatus().code)); + future.setException(new IoTDBException(resp.getStatus())); return future; } } catch (final Exception e) { @@ -3027,7 +3027,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { migrateRegionTask.getModel()); final TSStatus status = configNodeClient.migrateRegion(tMigrateRegionReq); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(status.message, status.code)); + future.setException(new IoTDBException(status)); return future; } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -3195,7 +3195,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { reconstructRegionTask.getModel()); final TSStatus status = configNodeClient.reconstructRegion(req); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(status.message, status.code)); + future.setException(new IoTDBException(status)); return future; } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -3218,7 +3218,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { extendRegionTask.getModel()); final TSStatus status = configNodeClient.extendRegion(req); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(status.message, status.code)); + future.setException(new IoTDBException(status)); return future; } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -3241,7 +3241,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { removeRegionTask.getModel()); final TSStatus status = configNodeClient.removeRegion(req); if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException(new IoTDBException(status.message, status.code)); + future.setException(new IoTDBException(status)); return future; } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); @@ -3279,7 +3279,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { context.getSession() == null ? null : context.getSession().getUserName()); final TSStatus executionStatus = client.createCQ(tCreateCQReq); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -3296,7 +3296,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TSStatus executionStatus = client.dropCQ(new TDropCQReq(cqId)); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -3313,8 +3313,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TShowCQResp showCQResp = client.showCQ(); if (showCQResp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException( - new IoTDBException(showCQResp.getStatus().message, showCQResp.getStatus().code)); + future.setException(new IoTDBException(showCQResp.getStatus())); return future; } // convert cqList and buildTsBlock @@ -3334,7 +3333,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { final TCreateModelReq req = new TCreateModelReq(modelId, uri); final TSStatus status = client.createModel(req); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != status.getCode()) { - future.setException(new IoTDBException(status.message, status.code)); + future.setException(new IoTDBException(status)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -3351,7 +3350,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) { final TSStatus executionStatus = client.dropModel(new TDropModelReq(modelId)); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -3372,8 +3371,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } final TShowModelResp showModelResp = client.showModel(req); if (showModelResp.getStatus().getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { - future.setException( - new IoTDBException(showModelResp.getStatus().message, showModelResp.getStatus().code)); + future.setException(new IoTDBException(showModelResp.getStatus())); return future; } // convert model info list and buildTsBlock @@ -3411,7 +3409,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { req.setTimeRanges(timeRanges); final TSStatus executionStatus = client.createTraining(req); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != executionStatus.getCode()) { - future.setException(new IoTDBException(executionStatus.message, executionStatus.code)); + future.setException(new IoTDBException(executionStatus)); } else { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } @@ -3443,7 +3441,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -3493,7 +3491,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { if (tsStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) { future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } return future; } @@ -3666,7 +3664,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { "Failed to execute delete database {} in config node, status is {}.", dropDB.getDbName().getValue(), tsStatus); - future.setException(new IoTDBException(tsStatus.message, tsStatus.getCode())); + future.setException(new IoTDBException(tsStatus)); } } catch (final ClientManagerException | TException e) { future.setException(e); @@ -3705,7 +3703,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode())); } } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } } catch (final ClientManagerException | TException e) { future.setException(e); @@ -3738,7 +3736,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { unsetDatabaseIfNotExist( databaseSchema.getName(), SessionManager.getInstance().getCurrSession()); } else { - future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + future.setException(new IoTDBException(tsStatus)); } } catch (final ClientManagerException | TException e) { future.setException(e); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/ClusterTemplateManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/ClusterTemplateManager.java index 18229858ceb..7a5eb3b2a61 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/ClusterTemplateManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/ClusterTemplateManager.java @@ -25,6 +25,7 @@ import org.apache.iotdb.commons.client.exception.ClientManagerException; import org.apache.iotdb.commons.consensus.ConfigRegionId; import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.exception.IoTDBException; +import org.apache.iotdb.commons.exception.IoTDBRuntimeException; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.exception.runtime.SchemaExecutionException; import org.apache.iotdb.commons.path.PartialPath; @@ -171,8 +172,7 @@ public class ClusterTemplateManager implements ITemplateManager { templatesList.add(template); }); } else { - throw new RuntimeException( - new IoTDBException(resp.getStatus().getMessage(), resp.getStatus().getCode())); + throw new IoTDBRuntimeException(resp.getStatus()); } } catch (ClientManagerException | TException e) { throw new RuntimeException( @@ -193,7 +193,7 @@ public class ClusterTemplateManager implements ITemplateManager { template.deserialize(ByteBuffer.wrap(templateBytes)); return template; } else { - throw new IoTDBException(resp.status.getMessage(), resp.status.getCode()); + throw new IoTDBException(resp.status); } } catch (ClientManagerException | TException e) { throw new RuntimeException( @@ -233,7 +233,7 @@ public class ClusterTemplateManager implements ITemplateManager { name, path, tsStatus); - throw new IoTDBException(tsStatus.getMessage(), tsStatus.getCode()); + throw new IoTDBException(tsStatus); } } catch (Exception e) { throw new RuntimeException(e); @@ -261,7 +261,7 @@ public class ClusterTemplateManager implements ITemplateManager { }); } } else { - throw new IoTDBException(resp.status.getMessage(), resp.status.getCode()); + throw new IoTDBException(resp.status); } } catch (Exception e) { throw new RuntimeException(e); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ErrorHandlingUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ErrorHandlingUtils.java index e035a4f52bb..f8c709e5773 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ErrorHandlingUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/ErrorHandlingUtils.java @@ -26,7 +26,6 @@ import org.apache.iotdb.commons.exception.QuerySchemaFetchFailedException; import org.apache.iotdb.db.exception.BatchProcessException; import org.apache.iotdb.db.exception.QueryInBatchStatementException; import org.apache.iotdb.db.exception.StorageGroupNotReadyException; -import org.apache.iotdb.db.exception.ainode.ModelException; import org.apache.iotdb.db.exception.query.QueryProcessException; import org.apache.iotdb.db.exception.query.QueryTimeoutRuntimeException; import org.apache.iotdb.db.exception.sql.SemanticException; @@ -43,6 +42,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Arrays; +import java.util.Objects; import java.util.concurrent.ExecutionException; import static org.apache.iotdb.commons.utils.StatusUtils.needRetry; @@ -166,7 +166,9 @@ public class ErrorHandlingUtils { || t instanceof QuerySchemaFetchFailedException) { return RpcUtils.getStatus(TSStatusCode.PLAN_FAILED_NETWORK_PARTITION, rootCause.getMessage()); } else if (t instanceof IoTDBException) { - return RpcUtils.getStatus(((IoTDBException) t).getErrorCode(), rootCause.getMessage()); + return Objects.nonNull(((IoTDBException) t).getStatus()) + ? ((IoTDBException) t).getStatus() + : RpcUtils.getStatus(((IoTDBException) t).getErrorCode(), rootCause.getMessage()); } else if (t instanceof TsFileRuntimeException) { return RpcUtils.getStatus(TSStatusCode.TSFILE_PROCESSOR_ERROR, rootCause.getMessage()); } else if (t instanceof SemanticException) { @@ -176,9 +178,9 @@ public class ErrorHandlingUtils { } return RpcUtils.getStatus(TSStatusCode.SEMANTIC_ERROR, rootCause.getMessage()); } else if (t instanceof IoTDBRuntimeException) { - return RpcUtils.getStatus(((IoTDBRuntimeException) t).getErrorCode(), t.getMessage()); - } else if (t instanceof ModelException) { - return RpcUtils.getStatus(((ModelException) t).getStatusCode(), rootCause.getMessage()); + return Objects.nonNull(((IoTDBRuntimeException) t).getStatus()) + ? ((IoTDBRuntimeException) t).getStatus() + : RpcUtils.getStatus(((IoTDBRuntimeException) t).getErrorCode(), t.getMessage()); } if (t instanceof RuntimeException && rootCause instanceof IoTDBException) { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBException.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBException.java index 3fca9bc6210..8227f3ea8ee 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBException.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBException.java @@ -20,6 +20,8 @@ package org.apache.iotdb.commons.exception; +import org.apache.iotdb.common.rpc.thrift.TSStatus; + public class IoTDBException extends Exception { private static final long serialVersionUID = 8480450962311247736L; @@ -31,6 +33,8 @@ public class IoTDBException extends Exception { */ private final boolean isUserException; + private TSStatus status; + public IoTDBException(String message, int errorCode) { super(message); this.errorCode = errorCode; @@ -61,6 +65,13 @@ public class IoTDBException extends Exception { this.isUserException = isUserException; } + public IoTDBException(final TSStatus status) { + super(status.message); + this.errorCode = status.getCode(); + this.status = status; + this.isUserException = false; + } + public boolean isUserException() { return isUserException; } @@ -68,4 +79,8 @@ public class IoTDBException extends Exception { public int getErrorCode() { return errorCode; } + + public TSStatus getStatus() { + return status; + } } diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBRuntimeException.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBRuntimeException.java index 160ae8b6d82..68950c3fc81 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBRuntimeException.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/exception/IoTDBRuntimeException.java @@ -20,6 +20,8 @@ package org.apache.iotdb.commons.exception; +import org.apache.iotdb.common.rpc.thrift.TSStatus; + public class IoTDBRuntimeException extends RuntimeException { protected int errorCode; @@ -29,6 +31,8 @@ public class IoTDBRuntimeException extends RuntimeException { */ protected boolean isUserException = false; + private TSStatus status; + public IoTDBRuntimeException(String message, int errorCode) { super(message); this.errorCode = errorCode; @@ -63,6 +67,13 @@ public class IoTDBRuntimeException extends RuntimeException { this.isUserException = isUserException; } + public IoTDBRuntimeException(final TSStatus status) { + super(status.message); + this.errorCode = status.getCode(); + this.status = status; + this.isUserException = false; + } + public boolean isUserException() { return isUserException; } @@ -70,4 +81,8 @@ public class IoTDBRuntimeException extends RuntimeException { public int getErrorCode() { return errorCode; } + + public TSStatus getStatus() { + return status; + } }