You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2020/11/13 01:42:53 UTC

[iotdb] branch cluster_new updated: Add auto create createMultiTimeSeriesPlan

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

jiangtian pushed a commit to branch cluster_new
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/cluster_new by this push:
     new 7185305  Add auto create createMultiTimeSeriesPlan
     new 13e97942 Merge pull request #1992 from LebronAl/cluster_new_fix_auto_createMultiTimeseriesPlan
7185305 is described below

commit 718530557ec87d1dac3c648c93a5bbd32e13c4de
Author: LebronAl <TX...@gmail.com>
AuthorDate: Tue Nov 10 12:31:32 2020 +0800

    Add auto create createMultiTimeSeriesPlan
---
 .../apache/iotdb/cluster/metadata/CMManager.java   | 45 +++++++++-----
 .../iotdb/cluster/query/ClusterPlanRouter.java     | 11 ++--
 .../cluster/server/member/MetaGroupMember.java     | 70 +++++++++++++---------
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  | 19 ++++--
 .../qp/physical/sys/CreateMultiTimeSeriesPlan.java |  9 +--
 .../org/apache/iotdb/db/service/TSServiceImpl.java | 58 +++++-------------
 6 files changed, 112 insertions(+), 100 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
index ed26526..d556c36 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
@@ -84,7 +84,6 @@ import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
 import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.dataset.ShowTimeSeriesResult;
-import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.SchemaUtils;
 import org.apache.iotdb.db.utils.TypeInferenceUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
@@ -392,13 +391,37 @@ public class CMManager extends MManager {
    */
   public void createSchema(PhysicalPlan plan) throws MetadataException {
     // try to set storage group
-    PartialPath deviceId;
+    List<PartialPath> deviceIds;
+    // only handle InsertPlan, CreateTimeSeriesPlan and CreateMultiTimeSeriesPlan currently
     if (plan instanceof InsertPlan) {
-      deviceId = ((InsertPlan) plan).getDeviceId();
+      deviceIds = Collections.singletonList(((InsertPlan) plan).getDeviceId());
+    } else if (plan instanceof CreateTimeSeriesPlan) {
+      deviceIds = Collections.singletonList(((CreateTimeSeriesPlan) plan).getPath());
     } else {
-      deviceId = ((CreateTimeSeriesPlan) plan).getPath();
+      deviceIds = plan.getPaths().stream().distinct().collect(Collectors.toList());
     }
 
+    for (PartialPath deviceId : deviceIds) {
+      createStorageGroup(deviceId);
+    }
+
+    if (plan instanceof InsertPlan) {
+      // try to create timeseries
+      boolean isAutoCreateTimeseriesSuccess = createTimeseries((InsertPlan) plan);
+      if (!isAutoCreateTimeseriesSuccess) {
+        throw new MetadataException(
+            "Failed to create timeseries from InsertPlan automatically."
+        );
+      }
+    }
+  }
+
+  /**
+   * Create storage group automatically for deviceId.
+   *
+   * @param deviceId
+   */
+  private void createStorageGroup(PartialPath deviceId) throws MetadataException {
     PartialPath storageGroupName = MetaUtils
         .getStorageGroupPathByLevel(deviceId, IoTDBDescriptor.getInstance()
             .getConfig().getDefaultStorageGroupLevel());
@@ -414,15 +437,6 @@ public class CMManager extends MManager {
               setStorageGroupResult.getCode(), storageGroupName)
       );
     }
-    if (plan instanceof InsertPlan) {
-      // try to create timeseries
-      boolean isAutoCreateTimeseriesSuccess = createTimeseries((InsertPlan) plan);
-      if (!isAutoCreateTimeseriesSuccess) {
-        throw new MetadataException(
-            "Failed to create timeseries from InsertPlan automatically."
-        );
-      }
-    }
   }
 
   /**
@@ -1036,7 +1050,7 @@ public class CMManager extends MManager {
     if (offset > 0 && result.size() > offset) {
       skippedOffset = offset;
       result = result.subList(offset, result.size());
-    } else if (offset > 0){
+    } else if (offset > 0) {
       skippedOffset = result.size();
       result = Collections.emptyList();
     }
@@ -1327,7 +1341,8 @@ public class CMManager extends MManager {
     return resultBinary;
   }
 
-  public GetAllPathsResult getAllPaths(List<String> paths, boolean withAlias) throws MetadataException {
+  public GetAllPathsResult getAllPaths(List<String> paths, boolean withAlias)
+      throws MetadataException {
     List<String> retPaths = new ArrayList<>();
     List<String> alias = null;
     if (withAlias) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanRouter.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanRouter.java
index d4e64b5..8fb6a88 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanRouter.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanRouter.java
@@ -298,15 +298,18 @@ public class ClusterPlanRouter {
 
   @SuppressWarnings("SuspiciousSystemArraycopy")
   private Map<PhysicalPlan, PartitionGroup> splitAndRoutePlan(CreateMultiTimeSeriesPlan plan)
-    throws MetadataException {
+      throws MetadataException {
     Map<PhysicalPlan, PartitionGroup> result = new HashMap<>();
     Map<PartitionGroup, PhysicalPlan> groupHoldPlan = new HashMap<>();
 
     for (int i = 0; i < plan.getPaths().size(); i++) {
       PartialPath path = plan.getPaths().get(i);
+      if (plan.getResults().containsKey(i)) {
+        continue;
+      }
       PartitionGroup partitionGroup =
-        partitionTable.partitionByPathTime(path, 0);
-      CreateMultiTimeSeriesPlan subPlan = null;
+          partitionTable.partitionByPathTime(path, 0);
+      CreateMultiTimeSeriesPlan subPlan;
       if (groupHoldPlan.get(partitionGroup) == null) {
         subPlan = new CreateMultiTimeSeriesPlan();
         subPlan.setPaths(new ArrayList<>());
@@ -347,7 +350,7 @@ public class ClusterPlanRouter {
       if (plan.getAttributes() != null) {
         subPlan.getAttributes().add(plan.getAttributes().get(i));
       }
-      subPlan.getIndexes().add(plan.getIndexes().get(i));
+      subPlan.getIndexes().add(i);
     }
 
     for (Map.Entry<PartitionGroup, PhysicalPlan> entry : groupHoldPlan.entrySet()) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
index cd41a73..9c05497 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
@@ -44,6 +44,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -1437,12 +1438,13 @@ public class MetaGroupMember extends RaftMember {
 
     // the storage group is not found locally
     if (planGroupMap == null || planGroupMap.isEmpty()) {
-      if ((plan instanceof InsertPlan || plan instanceof CreateTimeSeriesPlan)
+      if ((plan instanceof InsertPlan || plan instanceof CreateTimeSeriesPlan
+          || plan instanceof CreateMultiTimeSeriesPlan)
           && ClusterDescriptor.getInstance().getConfig().isEnableAutoCreateSchema()) {
         logger.debug("{}: No associated storage group found for {}, auto-creating", name, plan);
         try {
           ((CMManager) IoTDB.metaManager).createSchema(plan);
-          return executeNonQueryPlan(plan);
+          return processPartitionedPlan(plan);
         } catch (MetadataException e) {
           logger.error(
               String.format("Failed to set storage group or create timeseries, because %s", e));
@@ -1485,7 +1487,7 @@ public class MetaGroupMember extends RaftMember {
    */
   private TSStatus forwardPlan(Map<PhysicalPlan, PartitionGroup> planGroupMap, PhysicalPlan plan) {
     // the error codes from the groups that cannot execute the plan
-    TSStatus status = null;
+    TSStatus status;
     if (planGroupMap.size() == 1) {
       status = forwardToSingleGroup(planGroupMap.entrySet().iterator().next());
     } else {
@@ -1530,7 +1532,7 @@ public class MetaGroupMember extends RaftMember {
    * @param planGroupMap sub-plan -> data group pairs
    */
   private TSStatus forwardMultiSubPlan(Map<PhysicalPlan, PartitionGroup> planGroupMap,
-                                           PhysicalPlan parentPlan) {
+      PhysicalPlan parentPlan) {
     List<String> errorCodePartitionGroups = new ArrayList<>();
     TSStatus tmpStatus;
     TSStatus[] subStatus = null;
@@ -1538,33 +1540,20 @@ public class MetaGroupMember extends RaftMember {
     boolean isBatchFailure = false;
     EndPoint endPoint = null;
     int totalRowNum = 0;
-    // for we put the result to right position for CreateMultiTimeSeriesPlan
-    Map<Integer, Integer> indexToPos = new HashMap<>();
-    if (parentPlan instanceof InsertTabletPlan) {
-      totalRowNum = ((InsertTabletPlan) parentPlan).getRowCount();
-    } else if (parentPlan instanceof CreateMultiTimeSeriesPlan) {
-      totalRowNum = ((CreateMultiTimeSeriesPlan) parentPlan).getIndexes().size();
-
-      // index -> pos in the indexs array
-      for (int i = 0; i < totalRowNum; i++) {
-        indexToPos.put(((CreateMultiTimeSeriesPlan) parentPlan).getIndexes().get(i), i);
-      }
-    }
     // send sub-plans to each belonging data group and collect results
     for (Map.Entry<PhysicalPlan, PartitionGroup> entry : planGroupMap.entrySet()) {
       tmpStatus = forwardToSingleGroup(entry);
       logger.debug("{}: from {},{},{}", name, entry.getKey(), entry.getValue(), tmpStatus);
       noFailure =
-        (tmpStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) && noFailure;
+          (tmpStatus.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) && noFailure;
       isBatchFailure = (tmpStatus.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode())
-        || isBatchFailure;
-      if (parentPlan instanceof InsertTabletPlan) {
-        if (tmpStatus.isSetRedirectNode() &&
-          ((InsertTabletPlan) entry.getKey()).getMaxTime() == ((InsertTabletPlan) parentPlan).getMaxTime()) {
-          endPoint = tmpStatus.getRedirectNode();
-        }
-      }
+          || isBatchFailure;
       if (tmpStatus.getCode() == TSStatusCode.MULTIPLE_ERROR.getStatusCode()) {
+        if (parentPlan instanceof InsertTabletPlan) {
+          totalRowNum = ((InsertTabletPlan) parentPlan).getRowCount();
+        } else if (parentPlan instanceof CreateMultiTimeSeriesPlan) {
+          totalRowNum = ((CreateMultiTimeSeriesPlan) parentPlan).getIndexes().size();
+        }
         if (subStatus == null) {
           subStatus = new TSStatus[totalRowNum];
           Arrays.fill(subStatus, RpcUtils.SUCCESS_STATUS);
@@ -1572,23 +1561,46 @@ public class MetaGroupMember extends RaftMember {
         // set the status from one group to the proper positions of the overall status
         if (parentPlan instanceof InsertTabletPlan) {
           PartitionUtils.reordering((InsertTabletPlan) entry.getKey(), subStatus,
-            tmpStatus.subStatus.toArray(new TSStatus[]{}));
+              tmpStatus.subStatus.toArray(new TSStatus[]{}));
         } else if (parentPlan instanceof CreateMultiTimeSeriesPlan) {
           CreateMultiTimeSeriesPlan subPlan = (CreateMultiTimeSeriesPlan) entry.getKey();
           for (int i = 0; i < subPlan.getIndexes().size(); i++) {
-            subStatus[indexToPos.get(subPlan.getIndexes().get(i))] = tmpStatus.subStatus.get(i);
+            subStatus[subPlan.getIndexes().get(i)] = tmpStatus.subStatus.get(i);
           }
         }
       }
       if (tmpStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         // execution failed, record the error message
         errorCodePartitionGroups.add(String.format("[%s@%s:%s:%s]",
-          tmpStatus.getCode(), entry.getValue().getHeader(),
-          tmpStatus.getMessage(), tmpStatus.subStatus));
+            tmpStatus.getCode(), entry.getValue().getHeader(),
+            tmpStatus.getMessage(), tmpStatus.subStatus));
+      }
+      if (parentPlan instanceof InsertTabletPlan) {
+        if (tmpStatus.isSetRedirectNode() &&
+            ((InsertTabletPlan) entry.getKey()).getMaxTime() == ((InsertTabletPlan) parentPlan)
+                .getMaxTime()) {
+          endPoint = tmpStatus.getRedirectNode();
+        }
+      }
+    }
+
+    if (parentPlan instanceof CreateMultiTimeSeriesPlan) {
+      if (!((CreateMultiTimeSeriesPlan) parentPlan).getResults().isEmpty()) {
+        if (subStatus == null) {
+          subStatus = new TSStatus[totalRowNum];
+          Arrays.fill(subStatus, RpcUtils.SUCCESS_STATUS);
+        }
+        noFailure = false;
+        isBatchFailure = true;
+        for (Entry<Integer, TSStatus> integerTSStatusEntry : ((CreateMultiTimeSeriesPlan) parentPlan)
+            .getResults().entrySet()) {
+          subStatus[integerTSStatusEntry.getKey()] = integerTSStatusEntry.getValue();
+        }
       }
     }
 
-    return concludeFinalStatus(noFailure, endPoint, isBatchFailure, subStatus, errorCodePartitionGroups);
+    return concludeFinalStatus(noFailure, endPoint, isBatchFailure, subStatus,
+        errorCodePartitionGroups);
   }
 
   private TSStatus concludeFinalStatus(boolean noFailure, EndPoint endPoint,
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 6527957..8674d49 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -129,6 +129,7 @@ import org.apache.iotdb.db.utils.AuthUtils;
 import org.apache.iotdb.db.utils.FileLoaderUtils;
 import org.apache.iotdb.db.utils.UpgradeUtils;
 import org.apache.iotdb.rpc.RpcUtils;
+import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
 import org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
@@ -863,7 +864,7 @@ public class PlanExecutor implements IPlanExecutor {
       throw new QueryProcessException(e);
     }
   }
-  
+
   protected MNode getSeriesSchemas(InsertPlan insertPlan)
       throws MetadataException {
     return IoTDB.metaManager
@@ -1021,9 +1022,12 @@ public class PlanExecutor implements IPlanExecutor {
     return true;
   }
 
-  private boolean createMultiTimeSeries(CreateMultiTimeSeriesPlan multiPlan) {
-    Map<Integer, Exception> results = new HashMap<>(multiPlan.getPaths().size());
+  private boolean createMultiTimeSeries(CreateMultiTimeSeriesPlan multiPlan)
+      throws BatchProcessException {
     for (int i = 0; i < multiPlan.getPaths().size(); i++) {
+      if (multiPlan.getResults().containsKey(i)) {
+        continue;
+      }
       CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(
           multiPlan.getPaths().get(i),
           multiPlan.getDataTypes().get(i),
@@ -1035,12 +1039,15 @@ public class PlanExecutor implements IPlanExecutor {
           multiPlan.getAlias() == null ? null : multiPlan.getAlias().get(i));
       try {
         createTimeSeries(plan);
+        multiPlan.getResults().put(i, RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
       } catch (QueryProcessException e) {
-        results.put(multiPlan.getIndexes().get(i), e);
-        logger.debug("meet error while processing create timeseries. ", e);
+        multiPlan.getResults().put(i, RpcUtils
+            .getStatus(e.getErrorCode(), e.getMessage()));
       }
     }
-    multiPlan.setResults(results);
+    if (!multiPlan.getResults().isEmpty()) {
+      throw new BatchProcessException(multiPlan.getResults().values().toArray(new TSStatus[0]));
+    }
     return true;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
index 8ae4a65..f16f810 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateMultiTimeSeriesPlan.java
@@ -22,14 +22,15 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.TreeMap;
 import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+import org.apache.iotdb.service.rpc.thrift.TSStatus;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -51,7 +52,7 @@ public class CreateMultiTimeSeriesPlan extends PhysicalPlan {
   /*
    ** record the result of creation of time series
    */
-  private Map<Integer, Exception> results = new HashMap<>();
+  private Map<Integer, TSStatus> results = new TreeMap<>();
   private List<Integer> indexes;
 
   public CreateMultiTimeSeriesPlan() {
@@ -132,11 +133,11 @@ public class CreateMultiTimeSeriesPlan extends PhysicalPlan {
     this.indexes = indexes;
   }
 
-  public Map<Integer, Exception> getResults() {
+  public Map<Integer, TSStatus> getResults() {
     return results;
   }
 
-  public void setResults(Map<Integer, Exception> results) {
+  public void setResults(Map<Integer, TSStatus> results) {
     this.results = results;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index ba4a252..70a01c2 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -49,10 +49,10 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.cost.statistic.Measurement;
 import org.apache.iotdb.db.cost.statistic.Operation;
-import org.apache.iotdb.db.exception.BatchProcessException;
 import org.apache.iotdb.db.engine.cache.ChunkCache;
 import org.apache.iotdb.db.engine.cache.ChunkMetadataCache;
 import org.apache.iotdb.db.engine.cache.TimeSeriesMetadataCache;
+import org.apache.iotdb.db.exception.BatchProcessException;
 import org.apache.iotdb.db.exception.QueryInBatchStatementException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -1598,10 +1598,7 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         auditLogger.debug("Session-{} create {} timeseries, the first is {}", currSessionId.get(),
             req.getPaths().size(), req.getPaths().get(0));
       }
-      boolean hasFailed = false;
-      List<TSStatus> statusList = new ArrayList<>(req.paths.size());
-      CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan();
-      CreateMultiTimeSeriesPlan createMultiTimeSeriesPlan = new CreateMultiTimeSeriesPlan();
+      CreateMultiTimeSeriesPlan multiPlan = new CreateMultiTimeSeriesPlan();
 
       List<PartialPath> paths = new ArrayList<>(req.paths.size());
       List<TSDataType> dataTypes = new ArrayList<>(req.paths.size());
@@ -1624,18 +1621,15 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         attributes = new ArrayList<>(req.paths.size());
       }
 
-      // record the result of creation of time series
-      List<Integer> indexes = new ArrayList<>(req.paths.size());
-
+      // for authority check
+      CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan();
       for (int i = 0; i < req.paths.size(); i++) {
         plan.setPath(new PartialPath(req.paths.get(i)));
 
         TSStatus status = checkAuthority(plan, req.getSessionId());
         if (status != null) {
           // not authorized
-          hasFailed = true;
-          statusList.add(status);
-          continue;
+          multiPlan.getResults().put(i, status);
         }
 
         paths.add(new PartialPath(req.paths.get(i)));
@@ -1654,39 +1648,19 @@ public class TSServiceImpl implements TSIService.Iface, ServerContext {
         if (attributes != null) {
           attributes.add(req.attributesList.get(i));
         }
-
-        indexes.add(i);
-        statusList.add(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS, ""));
-      }
-
-      createMultiTimeSeriesPlan.setPaths(paths);
-      createMultiTimeSeriesPlan.setDataTypes(dataTypes);
-      createMultiTimeSeriesPlan.setEncodings(encodings);
-      createMultiTimeSeriesPlan.setCompressors(compressors);
-      createMultiTimeSeriesPlan.setAlias(alias);
-      createMultiTimeSeriesPlan.setProps(props);
-      createMultiTimeSeriesPlan.setTags(tags);
-      createMultiTimeSeriesPlan.setAttributes(attributes);
-      createMultiTimeSeriesPlan.setIndexes(indexes);
-
-      TSStatus status = executeNonQueryPlan(createMultiTimeSeriesPlan);
-
-      if (!createMultiTimeSeriesPlan.getResults().isEmpty()) {
-        hasFailed = true;
-        for (Map.Entry<Integer, Exception> entry : createMultiTimeSeriesPlan.getResults()
-            .entrySet()) {
-          statusList.set(entry.getKey(),
-              RpcUtils
-                  .getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, entry.getValue().getMessage()));
-        }
       }
 
-      if (hasFailed) {
-        logger.debug("Create multiple timeseries failed!");
-        return RpcUtils.getStatus(statusList);
-      } else {
-        return status;
-      }
+      multiPlan.setPaths(paths);
+      multiPlan.setDataTypes(dataTypes);
+      multiPlan.setEncodings(encodings);
+      multiPlan.setCompressors(compressors);
+      multiPlan.setAlias(alias);
+      multiPlan.setProps(props);
+      multiPlan.setTags(tags);
+      multiPlan.setAttributes(attributes);
+      multiPlan.setIndexes(new ArrayList<>());
+
+      return executeNonQueryPlan(multiPlan);
     } catch (Exception e) {
       logger.error("meet error when create multi timeseries", e);
     }