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;
+  }
 }

Reply via email to