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

justinchen pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new e27a673dd30 [To dev/1.3] Pipe: Fixed the NPE caused by multiple errors 
(#16118)
e27a673dd30 is described below

commit e27a673dd30bc3424942681b0c32c7e5e2207c13
Author: Caideyipi <[email protected]>
AuthorDate: Fri Aug 22 18:20:41 2025 +0800

    [To dev/1.3] Pipe: Fixed the NPE caused by multiple errors (#16118)
    
    * Fixed the NPE caused by multiple errors (#16091)
    
    * partial
    
    * fix
    
    * partial
    
    * add-failure-hanlder
    
    (cherry picked from commit 490aab1341b520e4b1931b0de9a4af9540df7a6f)
    
    * fix
    
    * try fix
    
    * Revert "try fix"
    
    This reverts commit db493ae08d157b1d5466b99ef951dd124efbb188.
    
    * fix
    
    * fixup! fix
    
    * add ConfigExecution.java
    
    ---------
    
    Co-authored-by: VGalaxies <[email protected]>
---
 .../procedure/impl/cq/CreateCQProcedure.java       |   4 +-
 .../procedure/impl/schema/SetTTLProcedure.java     |   2 +-
 .../impl/schema/SetTemplateProcedure.java          |  12 +--
 .../impl/schema/UnsetTemplateProcedure.java        |   4 +-
 .../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 |   3 +-
 .../plan/execution/config/ConfigExecution.java     |  17 +++-
 .../plan/execution/config/ConfigTaskResult.java    |  11 +++
 .../config/executor/ClusterConfigTaskExecutor.java | 104 ++++++++++-----------
 .../template/ClusterTemplateManager.java           |  10 +-
 .../apache/iotdb/db/utils/ErrorHandlingUtils.java  |   9 +-
 .../iotdb/commons/exception/IoTDBException.java    |  17 ++++
 .../commons/exception/IoTDBRuntimeException.java   |  15 +++
 17 files changed, 137 insertions(+), 89 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 c0de568f877..d812e715a6c 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
@@ -165,9 +165,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())));
     }
   }
 
@@ -190,7 +188,7 @@ public class SetTemplateProcedure
           templateName,
           templateSetPath,
           status.getMessage());
-      setFailure(new ProcedureException(new 
IoTDBException(status.getMessage(), status.getCode())));
+      setFailure(new ProcedureException(new IoTDBException(status)));
     }
   }
 
@@ -364,7 +362,7 @@ public class SetTemplateProcedure
           templateName,
           templateSetPath,
           status.getMessage());
-      setFailure(new ProcedureException(new 
IoTDBException(status.getMessage(), status.getCode())));
+      setFailure(new ProcedureException(new IoTDBException(status)));
     }
   }
 
@@ -466,7 +464,7 @@ public class SetTemplateProcedure
           templateName,
           templateSetPath,
           status.getMessage());
-      setFailure(new ProcedureException(new 
IoTDBException(status.getMessage(), status.getCode())));
+      setFailure(new ProcedureException(new IoTDBException(status)));
     }
   }
 
@@ -525,7 +523,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 49e116c2ccd..f3afb667202 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/sync/AuthOperationProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/sync/AuthOperationProcedure.java
index 20cc759a74c..b643e6de23b 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 70333039957..5c7ca1c9603 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
@@ -313,7 +313,7 @@ public class ClusterAuthorityFetcher implements 
IAuthorityFetcher {
             "Failed to execute {} in config node, status is {}.",
             
AuthorType.values()[authorizerReq.getAuthorType()].toString().toLowerCase(Locale.ROOT),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -355,8 +355,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()));
     } catch (AuthException e) {
       future.setException(e);
     }
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 2c62d8a67ff..cf876d92882 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
@@ -263,8 +263,7 @@ public class PartitionCache {
                           userName, PrivilegeType.MANAGE_DATABASE.ordinal()),
                       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 0cfa03dbda4..34fa662d172 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
@@ -558,7 +558,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));
     }
   }
 
@@ -590,7 +590,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));
     }
   }
 
@@ -659,7 +659,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 28f9753e87a..350dd6394d9 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
@@ -457,8 +457,7 @@ public class QueryExecution implements IQueryExecution {
   private void dealWithException(Throwable t) throws IoTDBException {
     stateMachine.transitionToFailed(t);
     if (stateMachine.getFailureStatus() != null) {
-      throw new IoTDBException(
-          stateMachine.getFailureStatus().getMessage(), 
stateMachine.getFailureStatus().code);
+      throw new IoTDBException(stateMachine.getFailureStatus());
     } else if (stateMachine.getFailureException() != null) {
       Throwable rootCause = stateMachine.getFailureException();
       throw new IoTDBException(rootCause, 
TSStatusCode.EXECUTE_STATEMENT_ERROR.getStatusCode());
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 3076e87d5b4..a9d96961834 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
@@ -47,6 +47,7 @@ import javax.validation.constraints.NotNull;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -124,7 +125,10 @@ public class ConfigExecution implements IQueryExecution {
     ConfigTaskResult result;
     if (cause instanceof IoTDBException) {
       result =
-          new ConfigTaskResult(TSStatusCode.representOf(((IoTDBException) 
cause).getErrorCode()));
+          Objects.nonNull(((IoTDBException) cause).getStatus())
+              ? new ConfigTaskResult(((IoTDBException) cause).getStatus())
+              : new ConfigTaskResult(
+                  TSStatusCode.representOf(((IoTDBException) 
cause).getErrorCode()));
     } else if (cause instanceof StatementExecutionException) {
       result =
           new ConfigTaskResult(
@@ -158,14 +162,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 b128f3ba361..e633ad60735 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
@@ -349,7 +349,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 {
@@ -380,7 +380,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));
       }
@@ -451,7 +451,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));
@@ -576,7 +576,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));
       }
@@ -595,7 +595,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));
       }
@@ -750,7 +750,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));
       }
@@ -768,7 +768,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));
       }
@@ -915,7 +915,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));
       }
@@ -941,7 +941,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));
       }
@@ -989,7 +989,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));
       }
@@ -1022,7 +1022,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;
   }
@@ -1050,7 +1050,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;
   }
@@ -1078,7 +1078,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;
   }
@@ -1098,7 +1098,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;
       }
     }
@@ -1121,7 +1121,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;
   }
@@ -1174,7 +1174,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;
   }
@@ -1202,7 +1202,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;
   }
@@ -1285,7 +1285,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       final TSStatus executionStatus = client.killQuery(queryId, dataNodeId);
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != 
executionStatus.getCode()) {
         LOGGER.warn("Failed to kill query [{}], because {}", queryId, 
executionStatus.message);
-        future.setException(new IoTDBException(executionStatus.message, 
executionStatus.code));
+        future.setException(new IoTDBException(executionStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1486,7 +1486,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             "Failed to execute create device template {} in config node, 
status is {}.",
             createSchemaTemplateStatement.getName(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1600,7 +1600,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             deactivateTemplateStatement.getTemplateName(),
             deactivateTemplateStatement.getPathPatternList(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1625,7 +1625,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             "Failed to execute drop device template {} in config node, status 
is {}.",
             dropSchemaTemplateStatement.getTemplateName(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1700,7 +1700,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             "Failed to alter device template {} in config node, status is {}.",
             
alterSchemaTemplateStatement.getTemplateAlterInfo().getTemplateName(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1756,7 +1756,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             unsetSchemaTemplateStatement.getTemplateName(),
             unsetSchemaTemplateStatement.getPath(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1812,7 +1812,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             "Failed to create pipe {} in config node, status is {}.",
             createPipeStatement.getPipeName(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1957,7 +1957,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       final TSStatus tsStatus = configNodeClient.alterPipe(req);
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn("Failed to alter pipe {} in config node, status is {}.", 
pipeName, tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -1989,7 +1989,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn(
             "Failed to start pipe {}, status is {}.", 
startPipeStatement.getPipeName(), tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2025,7 +2025,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn(
             "Failed to drop pipe {}, status is {}.", 
dropPipeStatement.getPipeName(), tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2057,7 +2057,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn(
             "Failed to stop pipe {}, status is {}.", 
stopPipeStatement.getPipeName(), tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2141,7 +2141,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
                   
.setSubsciptionId(dropSubscriptionStatement.getSubscriptionId())
                   
.setIfExistsCondition(dropSubscriptionStatement.hasIfExistsCondition()));
       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));
       }
@@ -2209,7 +2209,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       final TSStatus tsStatus = configNodeClient.createTopic(req);
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn("Failed to create topic {} in config node, status is {}.", 
topicName, tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2236,7 +2236,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn(
             "Failed to drop topic {}, status is {}.", 
dropTopicStatement.getTopicName(), tsStatus);
-        future.setException(new IoTDBException(tsStatus.message, 
tsStatus.code));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2314,7 +2314,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));
@@ -2356,7 +2356,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             "Failed to execute delete view {}, status is {}.",
             deleteLogicalViewStatement.getPathPatternList(),
             tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2442,7 +2442,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
 
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) {
         LOGGER.warn("Failed to execute delete view {}, status is {}.", 
oldName, tsStatus);
-        future.setException(new IoTDBException(tsStatus.getMessage(), 
tsStatus.getCode()));
+        future.setException(new IoTDBException(tsStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2521,7 +2521,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));
@@ -2604,7 +2604,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 (Exception e) {
@@ -2627,7 +2627,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 (Exception e) {
@@ -2660,7 +2660,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 (Exception e) {
@@ -2693,7 +2693,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 (Exception e) {
@@ -2716,7 +2716,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
               migrateRegionStatement.getToId());
       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));
@@ -2854,7 +2854,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
               reconstructRegionStatement.getDataNodeId());
       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));
@@ -2876,7 +2876,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
               extendRegionStatement.getRegionIds(), 
extendRegionStatement.getDataNodeId());
       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));
@@ -2898,7 +2898,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
               removeRegionStatement.getRegionIds(), 
removeRegionStatement.getDataNodeId());
       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));
@@ -2940,7 +2940,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             executionStatus,
             createContinuousQueryStatement.getCqId(),
             executionStatus.message);
-        future.setException(new IoTDBException(executionStatus.message, 
executionStatus.code));
+        future.setException(new IoTDBException(executionStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2958,7 +2958,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       final TSStatus executionStatus = client.dropCQ(new TDropCQReq(cqId));
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != 
executionStatus.getCode()) {
         LOGGER.warn("[{}] Failed to drop continuous query {}.", 
executionStatus, cqId);
-        future.setException(new IoTDBException(executionStatus.message, 
executionStatus.code));
+        future.setException(new IoTDBException(executionStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -2975,8 +2975,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
@@ -3003,7 +3002,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
             status,
             createModelStatement.getModelName(),
             status.message);
-        future.setException(new IoTDBException(status.message, status.code));
+        future.setException(new IoTDBException(status));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -3021,7 +3020,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       final TSStatus executionStatus = client.dropModel(new 
TDropModelReq(modelName));
       if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != 
executionStatus.getCode()) {
         LOGGER.warn("[{}] Failed to drop model {}.", executionStatus, 
modelName);
-        future.setException(new IoTDBException(executionStatus.message, 
executionStatus.code));
+        future.setException(new IoTDBException(executionStatus));
       } else {
         future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
       }
@@ -3042,8 +3041,7 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
       }
       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
@@ -3094,7 +3092,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;
   }
@@ -3144,7 +3142,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;
   }
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 4459f29ed6b..0350b7883e0 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 785395af8fb..987eaaf1019 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
@@ -41,6 +41,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;
@@ -153,7 +154,9 @@ public class ErrorHandlingUtils {
       return RpcUtils.getStatus(
           TSStatusCode.QUERY_NOT_ALLOWED, INFO_NOT_ALLOWED_IN_BATCH_ERROR + 
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) {
@@ -163,7 +166,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());
+      return Objects.nonNull(((IoTDBRuntimeException) t).getStatus())
+          ? ((IoTDBRuntimeException) t).getStatus()
+          : RpcUtils.getStatus(((IoTDBRuntimeException) t).getErrorCode(), 
t.getMessage());
     } else if (t instanceof ModelException) {
       return RpcUtils.getStatus(((ModelException) t).getStatusCode(), 
rootCause.getMessage());
     } else if (t instanceof MemoryNotEnoughException) {
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..d52ab223007 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,10 @@
 
 package org.apache.iotdb.commons.exception;
 
+import org.apache.iotdb.common.rpc.thrift.TSStatus;
+
+import org.apache.thrift.annotation.Nullable;
+
 public class IoTDBException extends Exception {
 
   private static final long serialVersionUID = 8480450962311247736L;
@@ -31,6 +35,8 @@ public class IoTDBException extends Exception {
    */
   private final boolean isUserException;
 
+  private @Nullable TSStatus status;
+
   public IoTDBException(String message, int errorCode) {
     super(message);
     this.errorCode = errorCode;
@@ -61,6 +67,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 +81,8 @@ public class IoTDBException extends Exception {
   public int getErrorCode() {
     return errorCode;
   }
+
+  public @Nullable 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 3d58f7d606b..f28fb0cd9ec 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;
@@ -56,6 +60,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;
   }
@@ -63,4 +74,8 @@ public class IoTDBRuntimeException extends RuntimeException {
   public int getErrorCode() {
     return errorCode;
   }
+
+  public TSStatus getStatus() {
+    return status;
+  }
 }

Reply via email to