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

jackietien 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 0ee458e991f Added retry for insertion when fetch table schema failed 
due to connection error & Improved the retry mechanism of client rpc
0ee458e991f is described below

commit 0ee458e991f80fc77ad74738834d25d5bb64ece8
Author: Caideyipi <[email protected]>
AuthorDate: Fri Mar 28 14:13:47 2025 +0800

    Added retry for insertion when fetch table schema failed due to connection 
error & Improved the retry mechanism of client rpc
---
 .../it/db/it/IoTDBAuthenticationTableIT.java       |   4 +-
 .../protocol/thrift/impl/ClientRPCServiceImpl.java | 111 +++++++++++----------
 .../metadata/fetcher/TableDeviceSchemaFetcher.java |   7 +-
 .../plan/scheduler/AsyncSendPlanNodeHandler.java   |   2 +-
 .../apache/iotdb/db/utils/ErrorHandlingUtils.java  |   3 +-
 .../apache/iotdb/commons/utils/StatusUtils.java    |   5 +
 6 files changed, 76 insertions(+), 56 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java
index 78c53614a84..d0458601ec9 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBAuthenticationTableIT.java
@@ -225,7 +225,7 @@ public class IoTDBAuthenticationTableIT {
           fail("Should have thrown an exception");
         } catch (StatementExecutionException e) {
           assertEquals(
-              "301: [EXECUTE_STATEMENT_ERROR(301)] Exception occurred: 
insertTablet failed. Access Denied: No permissions for this operation, please 
add privilege CREATE ON 汉化.table2",
+              "803: Access Denied: No permissions for this operation, please 
add privilege CREATE ON 汉化.table2",
               e.getMessage());
         }
         sessionRoot.executeNonQueryStatement("GRANT CREATE ON DATABASE \"汉化\" 
TO USER userA");
@@ -265,7 +265,7 @@ public class IoTDBAuthenticationTableIT {
           fail("Should have thrown an exception");
         } catch (StatementExecutionException e) {
           assertEquals(
-              "301: [EXECUTE_STATEMENT_ERROR(301)] Exception occurred: 
insertTablet failed. Access Denied: No permissions for this operation, please 
add privilege ALTER ON 汉化.table2",
+              "803: Access Denied: No permissions for this operation, please 
add privilege ALTER ON 汉化.table2",
               e.getMessage());
         }
         sessionRoot.executeNonQueryStatement("GRANT ALTER ON TABLE table2 TO 
USER userA");
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index 121f37bf2ea..75581413082 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -222,7 +222,6 @@ import static 
org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil
 import static org.apache.iotdb.db.utils.CommonUtils.getContentOfRequest;
 import static 
org.apache.iotdb.db.utils.CommonUtils.getContentOfTSFastLastDataQueryForOneDeviceReq;
 import static org.apache.iotdb.db.utils.ErrorHandlingUtils.onIoTDBException;
-import static 
org.apache.iotdb.db.utils.ErrorHandlingUtils.onNpeOrUnexpectedException;
 import static org.apache.iotdb.db.utils.ErrorHandlingUtils.onQueryException;
 import static 
org.apache.iotdb.db.utils.QueryDataSetUtils.convertTsBlockByFetchSize;
 import static org.apache.iotdb.rpc.RpcUtils.TIME_PRECISION;
@@ -1365,8 +1364,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
           zoneId != null ? zoneId.toString() : "Unknown time zone");
     } catch (Exception e) {
       return new TSGetTimeZoneResp(
-          onNpeOrUnexpectedException(
-              e, OperationType.GET_TIME_ZONE, 
TSStatusCode.GENERATE_TIME_ZONE_ERROR),
+          onQueryException(
+              e, OperationType.GET_TIME_ZONE.getName(), 
TSStatusCode.GENERATE_TIME_ZONE_ERROR),
           "Unknown time zone");
     }
   }
@@ -1377,8 +1376,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       SESSION_MANAGER.getCurrSession().setZoneId(ZoneId.of(req.timeZone));
       return RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS);
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.SET_TIME_ZONE, TSStatusCode.SET_TIME_ZONE_ERROR);
+      return onQueryException(
+          e, OperationType.SET_TIME_ZONE.getName(), 
TSStatusCode.SET_TIME_ZONE_ERROR);
     }
   }
 
@@ -1436,8 +1435,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.SET_STORAGE_GROUP, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.SET_STORAGE_GROUP, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.SET_STORAGE_GROUP.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     }
   }
 
@@ -1477,8 +1476,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.CREATE_TIMESERIES, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.CREATE_TIMESERIES, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.CREATE_TIMESERIES.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -1527,8 +1526,10 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.CREATE_ALIGNED_TIMESERIES, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.CREATE_ALIGNED_TIMESERIES, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e,
+          OperationType.CREATE_ALIGNED_TIMESERIES.getName(),
+          TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -1576,8 +1577,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.CREATE_MULTI_TIMESERIES, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.CREATE_MULTI_TIMESERIES, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.CREATE_MULTI_TIMESERIES.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -1616,8 +1617,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.DELETE_TIMESERIES, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.DELETE_TIMESERIES, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.DELETE_TIMESERIES.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -1659,8 +1660,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.DELETE_STORAGE_GROUPS, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.DELETE_STORAGE_GROUPS, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.DELETE_STORAGE_GROUPS.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -1931,8 +1932,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_RECORDS, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_RECORDS, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_RECORDS.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_RECORDS,
@@ -2000,8 +2001,10 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_RECORDS_OF_ONE_DEVICE, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_RECORDS_OF_ONE_DEVICE, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e,
+          OperationType.INSERT_RECORDS_OF_ONE_DEVICE.getName(),
+          TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_RECORDS_OF_ONE_DEVICE,
@@ -2069,9 +2072,9 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       return onIoTDBException(
           e, OperationType.INSERT_STRING_RECORDS_OF_ONE_DEVICE, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
+      return onQueryException(
           e,
-          OperationType.INSERT_STRING_RECORDS_OF_ONE_DEVICE,
+          OperationType.INSERT_STRING_RECORDS_OF_ONE_DEVICE.getName(),
           TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
@@ -2153,8 +2156,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_RECORD, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_RECORD, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_RECORD.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_RECORD, StatementType.INSERT.name(), 
System.nanoTime() - t1);
@@ -2210,8 +2213,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_TABLETS, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_TABLETS, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_TABLETS.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_TABLETS,
@@ -2287,8 +2290,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_TABLET, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_TABLET, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_TABLET.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_TABLET, StatementType.BATCH_INSERT.name(), 
System.nanoTime() - t1);
@@ -2352,8 +2355,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_STRING_RECORDS, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_STRING_RECORDS, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_STRING_RECORDS.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_STRING_RECORDS,
@@ -2438,8 +2441,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.DELETE_DATA, e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.DELETE_DATA, TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.DELETE_DATA.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2502,8 +2505,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.CREATE_SCHEMA_TEMPLATE, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.CREATE_SCHEMA_TEMPLATE, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.CREATE_SCHEMA_TEMPLATE.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2563,8 +2566,10 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       return executeTemplateQueryStatement(statement, req, resp);
     } catch (Exception e) {
       resp.setStatus(
-          onNpeOrUnexpectedException(
-              e, OperationType.EXECUTE_QUERY_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR));
+          onQueryException(
+              e,
+              OperationType.EXECUTE_QUERY_STATEMENT.getName(),
+              TSStatusCode.EXECUTE_STATEMENT_ERROR));
       return resp;
     } finally {
       SESSION_MANAGER.updateIdleTime();
@@ -2585,8 +2590,10 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       return resp;
     } catch (Exception e) {
       resp.setStatus(
-          onNpeOrUnexpectedException(
-              e, OperationType.EXECUTE_QUERY_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR));
+          onQueryException(
+              e,
+              OperationType.EXECUTE_QUERY_STATEMENT.getName(),
+              TSStatusCode.EXECUTE_STATEMENT_ERROR));
       return resp;
     } finally {
       SESSION_MANAGER.updateIdleTime();
@@ -2624,8 +2631,10 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
       }
     } catch (Exception e) {
       resp.setStatus(
-          onNpeOrUnexpectedException(
-              e, OperationType.EXECUTE_QUERY_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR));
+          onQueryException(
+              e,
+              OperationType.EXECUTE_QUERY_STATEMENT.getName(),
+              TSStatusCode.EXECUTE_STATEMENT_ERROR));
       return resp;
     } finally {
       SESSION_MANAGER.updateIdleTime();
@@ -2747,8 +2756,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IllegalPathException e) {
       return onIoTDBException(e, OperationType.EXECUTE_STATEMENT, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.EXECUTE_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.EXECUTE_STATEMENT.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2795,8 +2804,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IllegalPathException e) {
       return onIoTDBException(e, OperationType.EXECUTE_STATEMENT, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.EXECUTE_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.EXECUTE_STATEMENT.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2838,8 +2847,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
 
       return result.status;
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.EXECUTE_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.EXECUTE_STATEMENT.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2884,8 +2893,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.EXECUTE_STATEMENT, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.EXECUTE_STATEMENT, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.EXECUTE_STATEMENT.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       SESSION_MANAGER.updateIdleTime();
     }
@@ -2986,8 +2995,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     } catch (IoTDBException e) {
       return onIoTDBException(e, OperationType.INSERT_STRING_RECORD, 
e.getErrorCode());
     } catch (Exception e) {
-      return onNpeOrUnexpectedException(
-          e, OperationType.INSERT_STRING_RECORD, 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
+      return onQueryException(
+          e, OperationType.INSERT_STRING_RECORD.getName(), 
TSStatusCode.EXECUTE_STATEMENT_ERROR);
     } finally {
       CommonUtils.addStatementExecutionLatency(
           OperationType.INSERT_STRING_RECORD, StatementType.INSERT.name(), 
System.nanoTime() - t1);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
index 0c17810684a..117699854e1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/fetcher/TableDeviceSchemaFetcher.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.relational.metadata.fetcher;
 
 import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
 import org.apache.iotdb.commons.schema.column.ColumnHeader;
 import org.apache.iotdb.commons.schema.filter.SchemaFilter;
 import org.apache.iotdb.commons.schema.filter.impl.singlechild.IdFilter;
@@ -42,6 +43,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Expression;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.FetchDevice;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ShowDevice;
 import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser;
+import org.apache.iotdb.db.queryengine.plan.scheduler.AsyncSendPlanNodeHandler;
 import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
 import org.apache.iotdb.rpc.TSStatusCode;
 
@@ -135,7 +137,10 @@ public class TableDeviceSchemaFetcher {
           tsBlock = coordinator.getQueryExecution(queryId).getBatchResult();
         } catch (final IoTDBException e) {
           t = e;
-          throw new RuntimeException("Fetch Table Device Schema failed. ", e);
+          throw AsyncSendPlanNodeHandler.needRetry(e)
+              ? new IoTDBRuntimeException(
+                  e.getCause(), 
TSStatusCode.SYNC_CONNECTION_ERROR.getStatusCode())
+              : new RuntimeException("Fetch Table Device Schema failed. ", e);
         }
         if (!tsBlock.isPresent() || tsBlock.get().isEmpty()) {
           break;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
index a98194fccc4..2d2e85eef44 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/scheduler/AsyncSendPlanNodeHandler.java
@@ -96,7 +96,7 @@ public class AsyncSendPlanNodeHandler implements 
AsyncMethodCallback<TSendBatchP
     }
   }
 
-  private boolean needRetry(Exception e) {
+  public static boolean needRetry(Exception e) {
     Throwable rootCause = ExceptionUtils.getRootCause(e);
     // 1. connection broken it means that the remote node may go offline
     // 2. or the method call is time out
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 49a8086d635..0a0d6f921d5 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
@@ -114,7 +114,8 @@ public class ErrorHandlingUtils {
             || status.getCode() == 
TSStatusCode.COLUMN_NOT_EXISTS.getStatusCode()
             || status.getCode() == 
TSStatusCode.COLUMN_ALREADY_EXISTS.getStatusCode()
             || status.getCode() == 
TSStatusCode.UDF_LOAD_CLASS_ERROR.getStatusCode()
-            || status.getCode() == 
TSStatusCode.PLAN_FAILED_NETWORK_PARTITION.getStatusCode()) {
+            || status.getCode() == 
TSStatusCode.PLAN_FAILED_NETWORK_PARTITION.getStatusCode()
+            || status.getCode() == 
TSStatusCode.SYNC_CONNECTION_ERROR.getStatusCode()) {
           LOGGER.info(message);
         } else {
           LOGGER.warn(message, e);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StatusUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StatusUtils.java
index 9a3a0b767b2..cd355b34d8c 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StatusUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/StatusUtils.java
@@ -66,6 +66,7 @@ public class StatusUtils {
     NEED_RETRY.add(TSStatusCode.LACK_PARTITION_ALLOCATION.getStatusCode());
     NEED_RETRY.add(TSStatusCode.NO_ENOUGH_DATANODE.getStatusCode());
     
NEED_RETRY.add(TSStatusCode.TOO_MANY_CONCURRENT_QUERIES_ERROR.getStatusCode());
+    NEED_RETRY.add(TSStatusCode.SYNC_CONNECTION_ERROR.getStatusCode());
   }
 
   /**
@@ -242,4 +243,8 @@ public class StatusUtils {
     return NEED_RETRY.contains(statusCode)
         || (COMMON_CONFIG.isRetryForUnknownErrors() && 
UNKNOWN_ERRORS.contains(statusCode));
   }
+
+  public static boolean isUnknownError(int statusCode) {
+    return UNKNOWN_ERRORS.contains(statusCode);
+  }
 }

Reply via email to