You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2022/10/11 06:42:09 UTC

[iotdb] branch master updated: [IOTDB-4571] Add doc in IPartitionFetcher and fix incorrect use. (#7519)

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

qiaojialin 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 8e22f87805 [IOTDB-4571] Add doc in IPartitionFetcher and fix incorrect use. (#7519)
8e22f87805 is described below

commit 8e22f878050e35d25e0fce2fca9ec4d60faadbd3
Author: ZhangHongYin <46...@users.noreply.github.com>
AuthorDate: Tue Oct 11 14:42:02 2022 +0800

    [IOTDB-4571] Add doc in IPartitionFetcher and fix incorrect use. (#7519)
---
 .../iotdb/commons/partition/DataPartition.java     | 21 ++++---
 .../resources/conf/iotdb-datanode.properties       |  2 +
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java | 16 +++++
 .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java  | 70 ++++++++--------------
 .../mpp/plan/analyze/ClusterPartitionFetcher.java  | 33 ----------
 .../mpp/plan/analyze/FakePartitionFetcherImpl.java |  5 --
 .../db/mpp/plan/analyze/IPartitionFetcher.java     | 42 ++++++++++---
 .../plan/analyze/StandalonePartitionFetcher.java   |  5 --
 .../db/mpp/plan/analyze/cache/PartitionCache.java  |  2 +-
 .../db/mpp/plan/execution/QueryExecution.java      | 30 +++++++---
 .../plan/statement/crud/LoadTsFileStatement.java   |  2 +
 11 files changed, 110 insertions(+), 118 deletions(-)

diff --git a/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java b/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java
index ae9c37942e..4164fc716b 100644
--- a/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java
+++ b/node-commons/src/main/java/org/apache/iotdb/commons/partition/DataPartition.java
@@ -112,19 +112,18 @@ public class DataPartition extends Partition {
     // TODO return the latest dataRegionReplicaSet for each time partition
     String storageGroup = getStorageGroupByDevice(deviceName);
     TSeriesPartitionSlot seriesPartitionSlot = calculateDeviceGroupId(deviceName);
-    try {
-      List<TRegionReplicaSet> regions =
-          dataPartitionMap.get(storageGroup).get(seriesPartitionSlot).entrySet().stream()
-              .filter(entry -> entry.getKey().equals(timePartitionSlot))
-              .flatMap(entry -> entry.getValue().stream())
-              .collect(Collectors.toList());
-      // IMPORTANT TODO: (xingtanzjr) need to handle the situation for write operation that there
-      // are more than 1 Regions for one timeSlot
-      return regions.get(0);
-    } catch (NullPointerException exception) {
+    if (!dataPartitionMap.containsKey(storageGroup)) {
       throw new RuntimeException(
-          "Failed to auto create storage group because enable_auto_create_schema is FALSE.");
+          "Storage group not exists and failed to create automatically because enable_auto_create_schema is FALSE.");
     }
+    List<TRegionReplicaSet> regions =
+        dataPartitionMap.get(storageGroup).get(seriesPartitionSlot).entrySet().stream()
+            .filter(entry -> entry.getKey().equals(timePartitionSlot))
+            .flatMap(entry -> entry.getValue().stream())
+            .collect(Collectors.toList());
+    // IMPORTANT TODO: (xingtanzjr) need to handle the situation for write operation that there
+    // are more than 1 Regions for one timeSlot
+    return regions.get(0);
   }
 
   private String getStorageGroupByDevice(String deviceName) {
diff --git a/server/src/assembly/resources/conf/iotdb-datanode.properties b/server/src/assembly/resources/conf/iotdb-datanode.properties
index 43eee16851..06a40a8757 100644
--- a/server/src/assembly/resources/conf/iotdb-datanode.properties
+++ b/server/src/assembly/resources/conf/iotdb-datanode.properties
@@ -748,6 +748,8 @@ timestamp_precision=ms
 ####################
 
 # Whether creating schema automatically is enabled
+# If true, then create storage group and timeseries automatically when not exists in insertion
+# Or else, user need to create storage group and timeseries before insertion.
 # Datatype: boolean
 # enable_auto_create_schema=true
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
index 757bfa42fb..e3c70fbbf2 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analysis.java
@@ -68,6 +68,10 @@ public class Analysis {
 
   private boolean finishQueryAfterAnalyze;
 
+  // potential fail message when finishQueryAfterAnalyze is true. If failMessage is NULL, means no
+  // fail.
+  private String failMessage;
+
   /////////////////////////////////////////////////////////////////////////////////////////////////
   // Query Analysis (used in ALIGN BY TIME)
   /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -286,6 +290,18 @@ public class Analysis {
     this.finishQueryAfterAnalyze = finishQueryAfterAnalyze;
   }
 
+  public boolean isFailed() {
+    return failMessage != null;
+  }
+
+  public String getFailMessage() {
+    return failMessage;
+  }
+
+  public void setFailMessage(String failMessage) {
+    this.failMessage = failMessage;
+  }
+
   public void setDeviceViewInputIndexesMap(Map<String, List<Integer>> deviceViewInputIndexesMap) {
     this.deviceViewInputIndexesMap = deviceViewInputIndexesMap;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index b973187067..25fa7a2538 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.commons.partition.SchemaPartition;
 import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
+import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResourceStatus;
@@ -150,6 +151,7 @@ import static org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant.COLUMN_
 public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> {
 
   private static final Logger logger = LoggerFactory.getLogger(Analyzer.class);
+  private static final IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
 
   private final IPartitionFetcher partitionFetcher;
   private final ISchemaFetcher schemaFetcher;
@@ -1232,15 +1234,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     dataPartitionQueryParam.setDevicePath(insertTabletStatement.getDevicePath().getFullPath());
     dataPartitionQueryParam.setTimePartitionSlotList(insertTabletStatement.getTimePartitionSlots());
 
-    DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(
-            Collections.singletonList(dataPartitionQueryParam));
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(insertTabletStatement);
-    analysis.setDataPartitionInfo(dataPartition);
-
-    return analysis;
+    return getAnalysisForWriting(
+        insertTabletStatement, Collections.singletonList(dataPartitionQueryParam));
   }
 
   @Override
@@ -1251,15 +1246,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     dataPartitionQueryParam.setDevicePath(insertRowStatement.getDevicePath().getFullPath());
     dataPartitionQueryParam.setTimePartitionSlotList(insertRowStatement.getTimePartitionSlots());
 
-    DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(
-            Collections.singletonList(dataPartitionQueryParam));
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(insertRowStatement);
-    analysis.setDataPartitionInfo(dataPartition);
-
-    return analysis;
+    return getAnalysisForWriting(
+        insertRowStatement, Collections.singletonList(dataPartitionQueryParam));
   }
 
   @Override
@@ -1283,14 +1271,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       dataPartitionQueryParams.add(dataPartitionQueryParam);
     }
 
-    DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(dataPartitionQueryParams);
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(insertRowsStatement);
-    analysis.setDataPartitionInfo(dataPartition);
-
-    return analysis;
+    return getAnalysisForWriting(insertRowsStatement, dataPartitionQueryParams);
   }
 
   @Override
@@ -1315,14 +1296,7 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       dataPartitionQueryParams.add(dataPartitionQueryParam);
     }
 
-    DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(dataPartitionQueryParams);
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(insertMultiTabletsStatement);
-    analysis.setDataPartitionInfo(dataPartition);
-
-    return analysis;
+    return getAnalysisForWriting(insertMultiTabletsStatement, dataPartitionQueryParams);
   }
 
   @Override
@@ -1336,15 +1310,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
     dataPartitionQueryParam.setTimePartitionSlotList(
         insertRowsOfOneDeviceStatement.getTimePartitionSlots());
 
-    DataPartition dataPartition =
-        partitionFetcher.getOrCreateDataPartition(
-            Collections.singletonList(dataPartitionQueryParam));
-
-    Analysis analysis = new Analysis();
-    analysis.setStatement(insertRowsOfOneDeviceStatement);
-    analysis.setDataPartitionInfo(dataPartition);
-
-    return analysis;
+    return getAnalysisForWriting(
+        insertRowsOfOneDeviceStatement, Collections.singletonList(dataPartitionQueryParam));
   }
 
   @Override
@@ -1417,12 +1384,23 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
       params.add(dataPartitionQueryParam);
     }
 
-    DataPartition dataPartition = partitionFetcher.getOrCreateDataPartition(params);
+    return getAnalysisForWriting(loadTsFileStatement, params);
+  }
 
+  /** get analysis according to statement and params */
+  private Analysis getAnalysisForWriting(
+      Statement statement, List<DataPartitionQueryParam> dataPartitionQueryParams) {
     Analysis analysis = new Analysis();
-    analysis.setStatement(loadTsFileStatement);
-    analysis.setDataPartitionInfo(dataPartition);
+    analysis.setStatement(statement);
 
+    DataPartition dataPartition =
+        partitionFetcher.getOrCreateDataPartition(dataPartitionQueryParams);
+    if (dataPartition.isEmpty()) {
+      analysis.setFinishQueryAfterAnalyze(true);
+      analysis.setFailMessage(
+          "Storage group not exists and failed to create automatically because enable_auto_create_schema is FALSE.");
+    }
+    analysis.setDataPartitionInfo(dataPartition);
     return analysis;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
index c91fa1de6f..383595c5bd 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
@@ -170,7 +170,6 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
     }
   }
 
-  /** get data partition when query */
   @Override
   public DataPartition getDataPartition(
       Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
@@ -197,37 +196,6 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
     }
   }
 
-  /** get data partition when write */
-  @Override
-  public DataPartition getDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams) {
-    try (ConfigNodeClient client =
-        configNodeClientManager.borrowClient(ConfigNodeInfo.partitionRegionId)) {
-      Map<String, List<DataPartitionQueryParam>> splitDataPartitionQueryParams =
-          splitDataPartitionQueryParam(dataPartitionQueryParams, false);
-      DataPartition dataPartition = partitionCache.getDataPartition(splitDataPartitionQueryParams);
-      if (null == dataPartition) {
-        TDataPartitionTableResp dataPartitionTableResp =
-            client.getDataPartitionTable(constructDataPartitionReq(splitDataPartitionQueryParams));
-
-        if (dataPartitionTableResp.getStatus().getCode()
-            == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-          dataPartition = parseDataPartitionResp(dataPartitionTableResp);
-          partitionCache.updateDataPartitionCache(dataPartitionTableResp.getDataPartitionTable());
-        } else {
-          throw new RuntimeException(
-              new IoTDBException(
-                  dataPartitionTableResp.getStatus().getMessage(),
-                  dataPartitionTableResp.getStatus().getCode()));
-        }
-      }
-      return dataPartition;
-    } catch (TException | IOException e) {
-      throw new StatementAnalyzeException(
-          "An error occurred when executing getDataPartition():" + e.getMessage());
-    }
-  }
-
-  /** get data partition when query */
   @Override
   public DataPartition getOrCreateDataPartition(
       Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
@@ -255,7 +223,6 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
     }
   }
 
-  /** get data partition when write */
   @Override
   public DataPartition getOrCreateDataPartition(
       List<DataPartitionQueryParam> dataPartitionQueryParams) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java
index 76012118d5..a799d5ac3b 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/FakePartitionFetcherImpl.java
@@ -209,11 +209,6 @@ public class FakePartitionFetcherImpl implements IPartitionFetcher {
     return dataPartition;
   }
 
-  @Override
-  public DataPartition getDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams) {
-    return null;
-  }
-
   @Override
   public DataPartition getOrCreateDataPartition(
       Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java
index a4287bcde0..55017ca382 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/IPartitionFetcher.java
@@ -30,28 +30,52 @@ import java.util.Map;
 
 public interface IPartitionFetcher {
 
+  /** Get schema partition without automatically create, used in write and query scenarios. */
   SchemaPartition getSchemaPartition(PathPatternTree patternTree);
 
+  /**
+   * Get or create schema partition, used in insertion with enable_auto_create_schema is true. if
+   * schemaPartition does not exist, then automatically create.
+   */
   SchemaPartition getOrCreateSchemaPartition(PathPatternTree patternTree);
 
+  /**
+   * Get data partition, used in query scenarios.
+   *
+   * @param sgNameToQueryParamsMap storage group name -> the list of DataPartitionQueryParams
+   */
+  DataPartition getDataPartition(Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap);
+
+  /**
+   * Get or create data partition, used in standalone write scenarios. if enableAutoCreateSchema is
+   * true and storage group/series/time slots not exists, then automatically create.
+   *
+   * @param sgNameToQueryParamsMap storage group name -> the list of DataPartitionQueryParams
+   */
+  DataPartition getOrCreateDataPartition(
+      Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap);
+
+  /**
+   * Get or create data partition, used in cluster write scenarios. if enableAutoCreateSchema is
+   * true and storage group/series/time slots not exists, then automatically create.
+   *
+   * @param dataPartitionQueryParams the list of DataPartitionQueryParams
+   */
+  DataPartition getOrCreateDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams);
+
+  /** Get schema partition and matched nodes according to path pattern tree. */
   default SchemaNodeManagementPartition getSchemaNodeManagementPartition(
       PathPatternTree patternTree) {
     return getSchemaNodeManagementPartitionWithLevel(patternTree, null);
   }
 
+  /** Get schema partition and matched nodes according to path pattern tree and node level. */
   SchemaNodeManagementPartition getSchemaNodeManagementPartitionWithLevel(
       PathPatternTree patternTree, Integer level);
 
-  DataPartition getDataPartition(Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap);
-
-  DataPartition getDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams);
-
-  DataPartition getOrCreateDataPartition(
-      Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap);
-
-  DataPartition getOrCreateDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams);
-
+  /** Update region cache in partition cache when receive request from config node */
   boolean updateRegionCache(TRegionRouteReq req);
 
+  /** Invalid all partition cache */
   void invalidAllCache();
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
index 6f149e1b03..93e99b4ba8 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/StandalonePartitionFetcher.java
@@ -146,11 +146,6 @@ public class StandalonePartitionFetcher implements IPartitionFetcher {
     }
   }
 
-  @Override
-  public DataPartition getDataPartition(List<DataPartitionQueryParam> dataPartitionQueryParams) {
-    return null;
-  }
-
   @Override
   public DataPartition getOrCreateDataPartition(
       Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java
index 5fa061145a..be0e9b6e94 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java
@@ -327,7 +327,7 @@ public class PartitionCache {
         fetchStorageGroupAndUpdateCache(result, devicePaths);
         // second try to hit storage group in fast-fail way
         getStorageGroupMap(result, devicePaths, true);
-        if (!result.isSuccess() && isAutoCreate && config.isAutoCreateSchemaEnabled()) {
+        if (!result.isSuccess() && isAutoCreate) {
           // try to auto create storage group of failed device
           createStorageGroupAndUpdateCache(result, devicePaths);
           // third try to hit storage group in fast-fail way
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
index 160b702b3c..788403fb58 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/QueryExecution.java
@@ -165,8 +165,12 @@ public class QueryExecution implements IQueryExecution {
   public void start() {
     if (skipExecute()) {
       logger.info("[SkipExecute]");
-      constructResultForMemorySource();
-      stateMachine.transitionToRunning();
+      if (context.getQueryType() == QueryType.WRITE && analysis.isFailed()) {
+        stateMachine.transitionToFailed(new RuntimeException(analysis.getFailMessage()));
+      } else {
+        constructResultForMemorySource();
+        stateMachine.transitionToRunning();
+      }
       return;
     }
     long remainTime = context.getTimeOut() - (System.currentTimeMillis() - context.getStartTime());
@@ -473,11 +477,20 @@ public class QueryExecution implements IQueryExecution {
 
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
   private ExecutionResult getExecutionResult(QueryState state) {
-    TSStatusCode statusCode =
-        // For WRITE, the state should be FINISHED; For READ, the state could be RUNNING
-        state == QueryState.FINISHED || state == QueryState.RUNNING
-            ? TSStatusCode.SUCCESS_STATUS
-            : TSStatusCode.QUERY_PROCESS_ERROR;
+    TSStatusCode statusCode;
+    if (context.getQueryType() == QueryType.WRITE && analysis.isFailed()) {
+      // For WRITE, the state should be FINISHED
+      statusCode =
+          state == QueryState.FINISHED
+              ? TSStatusCode.SUCCESS_STATUS
+              : TSStatusCode.WRITE_PROCESS_ERROR;
+    } else {
+      // For READ, the state could be FINISHED and RUNNING
+      statusCode =
+          state == QueryState.FINISHED || state == QueryState.RUNNING
+              ? TSStatusCode.SUCCESS_STATUS
+              : TSStatusCode.QUERY_PROCESS_ERROR;
+    }
 
     TSStatus tsstatus = RpcUtils.getStatus(statusCode, stateMachine.getFailureMessage());
 
@@ -488,7 +501,8 @@ public class QueryExecution implements IQueryExecution {
     }
 
     // collect redirect info to client for writing
-    if (analysis.getStatement() instanceof InsertBaseStatement) {
+    if (analysis.getStatement() instanceof InsertBaseStatement
+        && !analysis.isFinishQueryAfterAnalyze()) {
       InsertBaseStatement insertStatement = (InsertBaseStatement) analysis.getStatement();
       List<TEndPoint> redirectNodeList;
       if (config.isClusterMode()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/LoadTsFileStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/LoadTsFileStatement.java
index b127df23df..efa386c241 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/LoadTsFileStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/LoadTsFileStatement.java
@@ -22,6 +22,7 @@ package org.apache.iotdb.db.mpp.plan.statement.crud;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
 import org.apache.iotdb.db.mpp.plan.statement.Statement;
 import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
@@ -51,6 +52,7 @@ public class LoadTsFileStatement extends Statement {
     this.autoCreateSchema = IoTDBDescriptor.getInstance().getConfig().isAutoCreateSchemaEnabled();
     this.tsFiles = new ArrayList<>();
     this.resources = new ArrayList<>();
+    this.statementType = StatementType.MULTI_BATCH_INSERT;
 
     if (file.isFile()) {
       tsFiles.add(file);