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