This is an automated email from the ASF dual-hosted git repository.
zyk 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 e4823ec57a [IOTDB-3756]Support mount template and query mount info
(#6652)
e4823ec57a is described below
commit e4823ec57a8d27ff5af6c1d89c302c23864d46ef
Author: yunchan86 <[email protected]>
AuthorDate: Wed Jul 13 12:23:12 2022 +0800
[IOTDB-3756]Support mount template and query mount info (#6652)
[IOTDB-3756]Support mount template and query mount info #6652
---
.../consensus/request/ConfigPhysicalPlan.java | 8 ++
.../consensus/request/ConfigPhysicalPlanType.java | 4 +-
.../request/read/GetPathsSetTemplatePlan.java | 57 ++++++++
.../request/write/SetSchemaTemplatePlan.java | 65 +++++++++
.../consensus/response/PathInfoResp.java | 46 +++---
.../confignode/manager/ClusterSchemaManager.java | 36 +++++
.../iotdb/confignode/manager/ConfigManager.java | 22 +++
.../apache/iotdb/confignode/manager/IManager.java | 18 +++
.../confignode/persistence/ClusterSchemaInfo.java | 44 +++++-
.../persistence/executor/ConfigPlanExecutor.java | 6 +
.../persistence/schema/TemplateTable.java | 31 +++-
.../thrift/ConfigNodeRPCServiceProcessor.java | 12 ++
.../request/ConfigPhysicalPlanSerDeTest.java | 24 ++++
.../persistence/ClusterSchemaInfoTest.java | 49 +++++++
.../schemaregion/rocksdb/mnode/RMNode.java | 10 ++
.../apache/iotdb/db/client/ConfigNodeClient.java | 34 +++++
.../apache/iotdb/db/metadata/MetadataConstant.java | 3 +
.../idtable/entry/InsertMeasurementMNode.java | 10 ++
.../org/apache/iotdb/db/metadata/mnode/IMNode.java | 4 +
.../iotdb/db/metadata/mnode/InternalMNode.java | 14 ++
.../iotdb/db/metadata/mnode/MeasurementMNode.java | 15 +-
.../mtree/{MTreeAboveSG.java => ConfigMTree.java} | 160 ++++++++++++++++++---
.../db/metadata/schemaregion/SchemaEngine.java | 6 +-
.../storagegroup/StorageGroupSchemaManager.java | 6 +-
.../metadata/template/ClusterTemplateManager.java | 51 +++++++
.../db/metadata/template/ITemplateManager.java | 17 +++
.../iotdb/db/metadata/template/Template.java | 14 +-
.../iotdb/db/mpp/common/header/HeaderConstant.java | 6 +
.../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 20 +++
.../iotdb/db/mpp/plan/constant/StatementType.java | 2 +
.../plan/execution/config/ConfigTaskVisitor.java | 14 ++
.../execution/config/SetSchemaTemplateTask.java} | 37 ++---
.../execution/config/ShowPathSetTemplateTask.java | 69 +++++++++
.../config/executor/ClusterConfigTaskExecutor.java | 39 +++++
.../config/executor/IConfigTaskExecutor.java | 8 ++
.../executor/StandaloneConfigTaskExecutor.java | 26 ++++
.../iotdb/db/mpp/plan/parser/ASTVisitor.java | 23 +++
.../db/mpp/plan/statement/StatementVisitor.java | 12 ++
.../template/SetSchemaTemplateStatement.java | 74 ++++++++++
.../template/ShowPathSetTemplateStatement.java | 55 +++++++
...{MTreeAboveSGTest.java => ConfigMTreeTest.java} | 46 +++++-
.../iotdb/db/metadata/mtree/MTreeBelowSGTest.java | 4 +-
.../src/main/thrift/confignode.thrift | 13 ++
43 files changed, 1122 insertions(+), 92 deletions(-)
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
index cca5751dd1..426ea9b7b0 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlan.java
@@ -26,6 +26,7 @@ import
org.apache.iotdb.confignode.consensus.request.read.GetNodePathsPartitionP
import
org.apache.iotdb.confignode.consensus.request.read.GetNodesInSchemaTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetOrCreateDataPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetOrCreateSchemaPartitionPlan;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetRegionInfoListPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaTemplatePlan;
@@ -48,6 +49,7 @@ import
org.apache.iotdb.confignode.consensus.request.write.RemoveConfigNodePlan;
import org.apache.iotdb.confignode.consensus.request.write.RemoveDataNodePlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetDataReplicationFactorPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaReplicationFactorPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.SetTTLPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetTimePartitionIntervalPlan;
@@ -215,6 +217,12 @@ public abstract class ConfigPhysicalPlan implements
IConsensusRequest {
case ShowNodesInSchemaTemplate:
req = new GetNodesInSchemaTemplatePlan();
break;
+ case GetPathsSetTemplate:
+ req = new GetPathsSetTemplatePlan();
+ break;
+ case SetSchemaTemplate:
+ req = new SetSchemaTemplatePlan();
+ break;
case GetNodePathsPartition:
req = new GetNodePathsPartitionPlan();
break;
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
index ef27228538..f71767fe4a 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanType.java
@@ -71,5 +71,7 @@ public enum ConfigPhysicalPlanType {
CreateSchemaTemplate,
ShowSchemaTemplate,
ShowNodesInSchemaTemplate,
- UpdateRegionLocation;
+ UpdateRegionLocation,
+ SetSchemaTemplate,
+ GetPathsSetTemplate;
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetPathsSetTemplatePlan.java
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetPathsSetTemplatePlan.java
new file mode 100644
index 0000000000..717d222e62
--- /dev/null
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/read/GetPathsSetTemplatePlan.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.consensus.request.read;
+
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class GetPathsSetTemplatePlan extends ConfigPhysicalPlan {
+
+ private String name;
+
+ public GetPathsSetTemplatePlan() {
+ super(ConfigPhysicalPlanType.GetPathsSetTemplate);
+ }
+
+ public GetPathsSetTemplatePlan(String name) {
+ super(ConfigPhysicalPlanType.GetPathsSetTemplate);
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ protected void serializeImpl(DataOutputStream stream) throws IOException {
+ stream.writeInt(ConfigPhysicalPlanType.GetPathsSetTemplate.ordinal());
+ ReadWriteIOUtils.write(name, stream);
+ }
+
+ @Override
+ protected void deserializeImpl(ByteBuffer buffer) throws IOException {
+ this.name = ReadWriteIOUtils.readString(buffer);
+ }
+}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/SetSchemaTemplatePlan.java
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/SetSchemaTemplatePlan.java
new file mode 100644
index 0000000000..d800c9c462
--- /dev/null
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/SetSchemaTemplatePlan.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.consensus.request.write;
+
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlan;
+import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class SetSchemaTemplatePlan extends ConfigPhysicalPlan {
+
+ private String name;
+ private String path;
+
+ public SetSchemaTemplatePlan() {
+ super(ConfigPhysicalPlanType.SetSchemaTemplate);
+ }
+
+ public SetSchemaTemplatePlan(String name, String path) {
+ super(ConfigPhysicalPlanType.SetSchemaTemplate);
+ this.name = name;
+ this.path = path;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ protected void serializeImpl(DataOutputStream stream) throws IOException {
+ stream.writeInt(ConfigPhysicalPlanType.SetSchemaTemplate.ordinal());
+ ReadWriteIOUtils.write(name, stream);
+ ReadWriteIOUtils.write(path, stream);
+ }
+
+ @Override
+ protected void deserializeImpl(ByteBuffer buffer) throws IOException {
+ this.name = ReadWriteIOUtils.readString(buffer);
+ this.path = ReadWriteIOUtils.readString(buffer);
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/PathInfoResp.java
similarity index 60%
copy from
server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
copy to
confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/PathInfoResp.java
index d2abfe8eeb..db0d0c3e7b 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/consensus/response/PathInfoResp.java
@@ -17,33 +17,31 @@
* under the License.
*/
-package org.apache.iotdb.db.metadata.template;
+package org.apache.iotdb.confignode.consensus.response;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import org.apache.iotdb.consensus.common.DataSet;
import java.util.List;
-public interface ITemplateManager {
-
- /**
- * @param statement CreateSchemaTemplateStatement
- * @return TSStatus
- */
- TSStatus createSchemaTemplate(CreateSchemaTemplateStatement statement);
-
- /**
- * show schema templates
- *
- * @return List<Template>
- */
- List<Template> getAllTemplates();
-
- /**
- * show nodes in schema template xx
- *
- * @param name
- * @return Template
- */
- Template getTemplate(String name);
+public class PathInfoResp implements DataSet {
+
+ private TSStatus status;
+ private List<String> pathList;
+
+ public TSStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(TSStatus status) {
+ this.status = status;
+ }
+
+ public List<String> getPathList() {
+ return pathList;
+ }
+
+ public void setPathList(List<String> pathList) {
+ this.pathList = pathList;
+ }
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
index 6280bce6ca..4c2302d3a7 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ClusterSchemaManager.java
@@ -29,6 +29,7 @@ import
org.apache.iotdb.confignode.client.handlers.SetTTLHandler;
import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
import
org.apache.iotdb.confignode.consensus.request.read.CountStorageGroupPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetNodesInSchemaTemplatePlan;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
import
org.apache.iotdb.confignode.consensus.request.write.AdjustMaxRegionGroupCountPlan;
@@ -36,13 +37,16 @@ import
org.apache.iotdb.confignode.consensus.request.write.CreateSchemaTemplateP
import
org.apache.iotdb.confignode.consensus.request.write.DeleteStorageGroupPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetDataReplicationFactorPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaReplicationFactorPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.SetTTLPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetTimePartitionIntervalPlan;
+import org.apache.iotdb.confignode.consensus.response.PathInfoResp;
import org.apache.iotdb.confignode.consensus.response.TemplateInfoResp;
import org.apache.iotdb.confignode.exception.StorageGroupNotExistsException;
import org.apache.iotdb.confignode.persistence.ClusterSchemaInfo;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
import org.apache.iotdb.consensus.common.DataSet;
@@ -373,6 +377,38 @@ public class ClusterSchemaManager {
return resp;
}
+ /**
+ * mount template
+ *
+ * @param templateName
+ * @param path
+ * @return
+ */
+ public TSStatus setSchemaTemplate(String templateName, String path) {
+ SetSchemaTemplatePlan setSchemaTemplatePlan = new
SetSchemaTemplatePlan(templateName, path);
+ return getConsensusManager().write(setSchemaTemplatePlan).getStatus();
+ }
+
+ /**
+ * show path set template xx
+ *
+ * @param templateName
+ * @return
+ */
+ public TGetPathsSetTemplatesResp getPathsSetTemplate(String templateName) {
+ GetPathsSetTemplatePlan getPathsSetTemplatePlan = new
GetPathsSetTemplatePlan(templateName);
+ PathInfoResp pathInfoResp =
+ (PathInfoResp)
getConsensusManager().read(getPathsSetTemplatePlan).getDataset();
+ if (pathInfoResp.getStatus().getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ TGetPathsSetTemplatesResp resp = new TGetPathsSetTemplatesResp();
+ resp.setStatus(RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS));
+ resp.setPathList(pathInfoResp.getPathList());
+ return resp;
+ } else {
+ return new TGetPathsSetTemplatesResp(pathInfoResp.getStatus());
+ }
+ }
+
private NodeManager getNodeManager() {
return configManager.getNodeManager();
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index a3bed29e71..88e9964ac3 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -83,12 +83,14 @@ import
org.apache.iotdb.confignode.rpc.thrift.TCreateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionResp;
import org.apache.iotdb.confignode.rpc.thrift.TDataPartitionTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
import org.apache.iotdb.confignode.rpc.thrift.TRegionRouteMapResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaNodeManagementResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionTableResp;
+import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
import org.apache.iotdb.consensus.common.DataSet;
import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
@@ -993,4 +995,24 @@ public class ConfigManager implements IManager {
return new TGetTemplateResp().setStatus(status);
}
}
+
+ @Override
+ public TSStatus setSchemaTemplate(TSetSchemaTemplateReq req) {
+ TSStatus status = confirmLeader();
+ if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ return clusterSchemaManager.setSchemaTemplate(req.getName(),
req.getPath());
+ } else {
+ return status;
+ }
+ }
+
+ @Override
+ public TGetPathsSetTemplatesResp getPathsSetTemplate(String req) {
+ TSStatus status = confirmLeader();
+ if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ return clusterSchemaManager.getPathsSetTemplate(req);
+ } else {
+ return new TGetPathsSetTemplatesResp(status);
+ }
+ }
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
index 751292d956..23ce7c369e 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java
@@ -44,10 +44,12 @@ import
org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterReq;
import org.apache.iotdb.confignode.rpc.thrift.TConfigNodeRegisterResp;
import org.apache.iotdb.confignode.rpc.thrift.TCreateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
import org.apache.iotdb.confignode.rpc.thrift.TRegionRouteMapResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaNodeManagementResp;
+import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
import org.apache.iotdb.consensus.common.DataSet;
import org.apache.iotdb.db.mpp.common.schematree.PathPatternTree;
@@ -312,4 +314,20 @@ public interface IManager {
* @return
*/
TGetTemplateResp getTemplate(String req);
+
+ /**
+ * set schema template xx to xx-path
+ *
+ * @param req TSetSchemaTemplateReq
+ * @return TSStatus
+ */
+ TSStatus setSchemaTemplate(TSetSchemaTemplateReq req);
+
+ /**
+ * show paths set schema template xx
+ *
+ * @param req String
+ * @return TGetPathsSetTemplatesResp
+ */
+ TGetPathsSetTemplatesResp getPathsSetTemplate(String req);
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
index b910c8c00a..74620ce2ef 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfo.java
@@ -20,21 +20,25 @@ package org.apache.iotdb.confignode.persistence;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.snapshot.SnapshotProcessor;
import org.apache.iotdb.commons.utils.TestOnly;
import
org.apache.iotdb.confignode.consensus.request.read.CountStorageGroupPlan;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
import
org.apache.iotdb.confignode.consensus.request.write.AdjustMaxRegionGroupCountPlan;
import
org.apache.iotdb.confignode.consensus.request.write.CreateSchemaTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.write.DeleteStorageGroupPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetDataReplicationFactorPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaReplicationFactorPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.SetTTLPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetTimePartitionIntervalPlan;
import org.apache.iotdb.confignode.consensus.response.CountStorageGroupResp;
+import org.apache.iotdb.confignode.consensus.response.PathInfoResp;
import org.apache.iotdb.confignode.consensus.response.StorageGroupSchemaResp;
import org.apache.iotdb.confignode.consensus.response.TemplateInfoResp;
import org.apache.iotdb.confignode.exception.StorageGroupNotExistsException;
@@ -42,8 +46,9 @@ import
org.apache.iotdb.confignode.persistence.schema.TemplateTable;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
-import org.apache.iotdb.db.metadata.mtree.MTreeAboveSG;
+import org.apache.iotdb.db.metadata.mtree.ConfigMTree;
import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.tsfile.utils.Pair;
@@ -76,7 +81,7 @@ public class ClusterSchemaInfo implements SnapshotProcessor {
// StorageGroup read write lock
private final ReentrantReadWriteLock storageGroupReadWriteLock;
- private final MTreeAboveSG mTree;
+ private final ConfigMTree mTree;
private final String snapshotFileName = "cluster_schema.bin";
@@ -86,7 +91,7 @@ public class ClusterSchemaInfo implements SnapshotProcessor {
storageGroupReadWriteLock = new ReentrantReadWriteLock();
try {
- mTree = new MTreeAboveSG();
+ mTree = new ConfigMTree();
templateTable = new TemplateTable();
} catch (MetadataException e) {
LOGGER.error("Can't construct StorageGroupInfo", e);
@@ -597,6 +602,39 @@ public class ClusterSchemaInfo implements
SnapshotProcessor {
return result;
}
+ public synchronized TSStatus setSchemaTemplate(SetSchemaTemplatePlan
setSchemaTemplatePlan) {
+ PartialPath path;
+ try {
+ path = new PartialPath(setSchemaTemplatePlan.getPath());
+ } catch (IllegalPathException e) {
+ LOGGER.error(e.getMessage());
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+
+ try {
+ int templateId =
templateTable.getTemplate(setSchemaTemplatePlan.getName()).getId();
+ mTree.checkTemplateOnPath(path);
+ mTree.getNodeWithAutoCreate(path).setSchemaTemplateId(templateId);
+ return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+ } catch (MetadataException e) {
+ return RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ }
+
+ public PathInfoResp getPathsSetTemplate(GetPathsSetTemplatePlan
getPathsSetTemplatePlan) {
+ PathInfoResp pathInfoResp = new PathInfoResp();
+ TSStatus status;
+ try {
+ int templateId =
templateTable.getTemplate(getPathsSetTemplatePlan.getName()).getId();
+ pathInfoResp.setPathList(mTree.getPathsSetOnTemplate(templateId));
+ status = new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
+ } catch (MetadataException e) {
+ status = RpcUtils.getStatus(e.getErrorCode(), e.getMessage());
+ }
+ pathInfoResp.setStatus(status);
+ return pathInfoResp;
+ }
+
@TestOnly
public void clear() {
mTree.clear();
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
index b643f23d9d..fb43be7787 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/executor/ConfigPlanExecutor.java
@@ -29,6 +29,7 @@ import
org.apache.iotdb.confignode.consensus.request.read.GetDataNodeInfoPlan;
import org.apache.iotdb.confignode.consensus.request.read.GetDataPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetNodePathsPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetNodesInSchemaTemplatePlan;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetRegionInfoListPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaPartitionPlan;
import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
@@ -49,6 +50,7 @@ import
org.apache.iotdb.confignode.consensus.request.write.RemoveConfigNodePlan;
import org.apache.iotdb.confignode.consensus.request.write.RemoveDataNodePlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetDataReplicationFactorPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaReplicationFactorPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.SetTTLPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetTimePartitionIntervalPlan;
@@ -147,6 +149,8 @@ public class ConfigPlanExecutor {
case ShowNodesInSchemaTemplate:
GetNodesInSchemaTemplatePlan plan = (GetNodesInSchemaTemplatePlan) req;
return clusterSchemaInfo.getTemplate(plan.getTemplateName());
+ case GetPathsSetTemplate:
+ return clusterSchemaInfo.getPathsSetTemplate((GetPathsSetTemplatePlan)
req);
default:
throw new UnknownPhysicalPlanTypeException(req.getType());
}
@@ -216,6 +220,8 @@ public class ConfigPlanExecutor {
return
clusterSchemaInfo.createSchemaTemplate((CreateSchemaTemplatePlan) req);
case UpdateRegionLocation:
return partitionInfo.updateRegionLocation((UpdateRegionLocationPlan)
req);
+ case SetSchemaTemplate:
+ return clusterSchemaInfo.setSchemaTemplate((SetSchemaTemplatePlan)
req);
default:
throw new UnknownPhysicalPlanTypeException(req.getType());
}
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
index 9b16afb14a..dad4a2c01e 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/TemplateTable.java
@@ -20,11 +20,13 @@
package org.apache.iotdb.confignode.persistence.schema;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.utils.TestOnly;
import
org.apache.iotdb.confignode.consensus.request.write.CreateSchemaTemplatePlan;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.db.metadata.template.Template;
+import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -46,6 +48,7 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class TemplateTable {
@@ -55,28 +58,43 @@ public class TemplateTable {
// StorageGroup read write lock
private final ReentrantReadWriteLock templateReadWriteLock;
+ private final AtomicInteger templateIdGenerator;
private final Map<String, Template> templateMap = new ConcurrentHashMap<>();
private final String snapshotFileName = "template_info.bin";
public TemplateTable() throws IOException {
templateReadWriteLock = new ReentrantReadWriteLock();
+ templateIdGenerator = new AtomicInteger(0);
}
public TGetTemplateResp getMatchedTemplateByName(String name) {
TGetTemplateResp resp = new TGetTemplateResp();
try {
- templateReadWriteLock.readLock().lock();
- Template template = templateMap.get(name);
+ Template template = getTemplate(name);
resp.setStatus(new
TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()));
resp.setTemplate(Template.template2ByteBuffer(template));
+ } catch (MetadataException e) {
+ LOGGER.warn(e.getMessage());
+ resp.setStatus(RpcUtils.getStatus(e.getErrorCode(), e.getMessage()));
} catch (IOException e) {
LOGGER.warn("Error TemplateInfo name", e);
resp.setStatus(new
TSStatus(TSStatusCode.TEMPLATE_NOT_EXIST.getStatusCode()));
+ }
+ return resp;
+ }
+
+ public Template getTemplate(String name) throws MetadataException {
+ try {
+ templateReadWriteLock.readLock().lock();
+ Template template = templateMap.get(name);
+ if (template == null) {
+ throw new MetadataException(String.format("Template %s not exits",
name));
+ }
+ return templateMap.get(name);
} finally {
templateReadWriteLock.readLock().unlock();
}
- return resp;
}
public TGetAllTemplatesResp getAllTemplate() {
@@ -107,7 +125,7 @@ public class TemplateTable {
public TSStatus createTemplate(CreateSchemaTemplatePlan
createSchemaTemplatePlan) {
try {
- templateReadWriteLock.readLock().lock();
+ templateReadWriteLock.writeLock().lock();
Template template =
Template.byteBuffer2Template(ByteBuffer.wrap(createSchemaTemplatePlan.getTemplate()));
Template temp = this.templateMap.get(template.getName());
@@ -116,17 +134,19 @@ public class TemplateTable {
"Failed to create template, because template name {} is exists",
template.getName());
return new TSStatus(TSStatusCode.DUPLICATED_TEMPLATE.getStatusCode());
}
+ template.setId(templateIdGenerator.getAndIncrement());
this.templateMap.put(template.getName(), template);
return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode());
} catch (IOException | ClassNotFoundException e) {
LOGGER.warn("Error to create template", e);
return new TSStatus(TSStatusCode.CREATE_TEMPLATE_ERROR.getStatusCode());
} finally {
- templateReadWriteLock.readLock().unlock();
+ templateReadWriteLock.writeLock().unlock();
}
}
private void serialize(OutputStream outputStream) throws IOException {
+ ReadWriteIOUtils.write(templateIdGenerator.get(), outputStream);
ReadWriteIOUtils.write(templateMap.size(), outputStream);
for (Map.Entry<String, Template> entry : templateMap.entrySet()) {
serializeTemplate(entry.getValue(), outputStream);
@@ -144,6 +164,7 @@ public class TemplateTable {
private void deserialize(InputStream inputStream) throws IOException {
ByteBuffer byteBuffer = ByteBuffer.wrap(IOUtils.toByteArray(inputStream));
+ templateIdGenerator.set(ReadWriteIOUtils.readInt(byteBuffer));
int size = ReadWriteIOUtils.readInt(byteBuffer);
while (size > 0) {
Template template = deserializeTemplate(byteBuffer);
diff --git
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index 7cb5bcb462..f61f411619 100644
---
a/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++
b/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -82,6 +82,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDeleteStorageGroupReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteStorageGroupsReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TLoginReq;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
@@ -94,6 +95,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TSetDataReplicationFactorReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaReplicationFactorReq;
+import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -575,4 +577,14 @@ public class ConfigNodeRPCServiceProcessor implements
IConfigNodeRPCService.Ifac
public TGetTemplateResp getTemplate(String req) throws TException {
return configManager.getTemplate(req);
}
+
+ @Override
+ public TSStatus setSchemaTemplate(TSetSchemaTemplateReq req) throws
TException {
+ return configManager.setSchemaTemplate(req);
+ }
+
+ @Override
+ public TGetPathsSetTemplatesResp getPathsSetTemplate(String req) throws
TException {
+ return configManager.getPathsSetTemplate(req);
+ }
}
diff --git
a/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
b/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
index 981af7d1cb..ff4100d163 100644
---
a/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
+++
b/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -40,6 +40,7 @@ import
org.apache.iotdb.confignode.consensus.request.read.GetDataPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetNodesInSchemaTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetOrCreateDataPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetOrCreateSchemaPartitionPlan;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetRegionInfoListPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaPartitionPlan;
import
org.apache.iotdb.confignode.consensus.request.read.GetSchemaTemplatePlan;
@@ -58,6 +59,7 @@ import
org.apache.iotdb.confignode.consensus.request.write.RegisterDataNodePlan;
import
org.apache.iotdb.confignode.consensus.request.write.RemoveConfigNodePlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetDataReplicationFactorPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaReplicationFactorPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.request.write.SetTTLPlan;
import
org.apache.iotdb.confignode.consensus.request.write.SetTimePartitionIntervalPlan;
@@ -657,4 +659,26 @@ public class ConfigPhysicalPlanSerDeTest {
getNodesInSchemaTemplatePlan0.serializeToByteBuffer());
Assert.assertEquals(getNodesInSchemaTemplatePlan0,
getNodesInSchemaTemplatePlan1);
}
+
+ @Test
+ public void SetSchemaTemplatePlanTest() throws IOException {
+ SetSchemaTemplatePlan setSchemaTemplatePlanPlan0 =
+ new SetSchemaTemplatePlan("template_name_test", "root.in.sg.dw");
+ SetSchemaTemplatePlan setSchemaTemplatePlanPlan1 =
+ (SetSchemaTemplatePlan)
+
ConfigPhysicalPlan.Factory.create(setSchemaTemplatePlanPlan0.serializeToByteBuffer());
+ Assert.assertEquals(
+
setSchemaTemplatePlanPlan0.getName().equalsIgnoreCase(setSchemaTemplatePlanPlan1.getName()),
+
setSchemaTemplatePlanPlan0.getPath().equals(setSchemaTemplatePlanPlan1.getPath()));
+ }
+
+ @Test
+ public void ShowPathSetTemplatePlanTest() throws IOException {
+ GetPathsSetTemplatePlan getPathsSetTemplatePlan0 =
+ new GetPathsSetTemplatePlan("template_name_test");
+ GetPathsSetTemplatePlan getPathsSetTemplatePlan1 =
+ (GetPathsSetTemplatePlan)
+
ConfigPhysicalPlan.Factory.create(getPathsSetTemplatePlan0.serializeToByteBuffer());
+ Assert.assertEquals(getPathsSetTemplatePlan0.getName(),
getPathsSetTemplatePlan1.getName());
+ }
}
diff --git
a/confignode/src/test/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfoTest.java
b/confignode/src/test/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfoTest.java
index 8b1f36e6c6..09855e60b0 100644
---
a/confignode/src/test/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfoTest.java
+++
b/confignode/src/test/java/org/apache/iotdb/confignode/persistence/ClusterSchemaInfoTest.java
@@ -21,9 +21,17 @@ package org.apache.iotdb.confignode.persistence;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.utils.PathUtils;
+import
org.apache.iotdb.confignode.consensus.request.read.GetPathsSetTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.read.GetStorageGroupPlan;
+import
org.apache.iotdb.confignode.consensus.request.write.CreateSchemaTemplatePlan;
+import
org.apache.iotdb.confignode.consensus.request.write.SetSchemaTemplatePlan;
import org.apache.iotdb.confignode.consensus.request.write.SetStorageGroupPlan;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
+import org.apache.iotdb.db.metadata.template.Template;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+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;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
@@ -34,6 +42,7 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@@ -96,4 +105,44 @@ public class ClusterSchemaInfoTest {
clusterSchemaInfo.getMatchedStorageGroupSchemas(getStorageGroupReq).getSchemaMap();
Assert.assertEquals(testMap, reloadResult);
}
+
+ @Test
+ public void testSetTemplate() throws IllegalPathException, IOException {
+ String templateName = "template_name";
+ Template template = new
Template(newCreateSchemaTemplateStatement(templateName));
+ CreateSchemaTemplatePlan createSchemaTemplatePlan =
+ new
CreateSchemaTemplatePlan(Template.template2ByteBuffer(template).array());
+ clusterSchemaInfo.createSchemaTemplate(createSchemaTemplatePlan);
+
+ clusterSchemaInfo.setSchemaTemplate(
+ new SetSchemaTemplatePlan(templateName, "root.test1.template"));
+ clusterSchemaInfo.setSchemaTemplate(
+ new SetSchemaTemplatePlan(templateName, "root.test2.template"));
+ clusterSchemaInfo.setSchemaTemplate(
+ new SetSchemaTemplatePlan(templateName, "root.test3.template"));
+
+ List<String> pathList =
+ clusterSchemaInfo
+ .getPathsSetTemplate(new GetPathsSetTemplatePlan(templateName))
+ .getPathList();
+ Assert.assertEquals(3, pathList.size());
+ Assert.assertTrue(pathList.contains("root.test1.template"));
+ Assert.assertTrue(pathList.contains("root.test2.template"));
+ Assert.assertTrue(pathList.contains("root.test3.template"));
+ }
+
+ private CreateSchemaTemplateStatement
newCreateSchemaTemplateStatement(String name) {
+ List<List<String>> measurements =
+ Arrays.asList(
+ Arrays.asList(name + "_" + "temperature"), Arrays.asList(name +
"_" + "status"));
+ List<List<TSDataType>> dataTypes =
+ Arrays.asList(Arrays.asList(TSDataType.FLOAT),
Arrays.asList(TSDataType.BOOLEAN));
+ List<List<TSEncoding>> encodings =
+ Arrays.asList(Arrays.asList(TSEncoding.RLE),
Arrays.asList(TSEncoding.PLAIN));
+ List<List<CompressionType>> compressors =
+ Arrays.asList(Arrays.asList(CompressionType.SNAPPY),
Arrays.asList(CompressionType.SNAPPY));
+ CreateSchemaTemplateStatement createSchemaTemplateStatement =
+ new CreateSchemaTemplateStatement(name, measurements, dataTypes,
encodings, compressors);
+ return createSchemaTemplateStatement;
+ }
}
diff --git
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
index aea541e7b9..dfa16aa90a 100644
---
a/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
+++
b/schema-engine-rocksdb/src/main/java/org/apache/iotdb/db/metadata/schemaregion/rocksdb/mnode/RMNode.java
@@ -153,6 +153,16 @@ public abstract class RMNode implements IMNode {
return false;
}
+ @Override
+ public int getSchemaTemplateId() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void setSchemaTemplateId(int schemaTemplateId) {
+ throw new UnsupportedOperationException();
+ }
+
@Override
public boolean isStorageGroup() {
return false;
diff --git
a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
index a337aa710e..de84d29349 100644
--- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
+++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java
@@ -54,6 +54,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TDeleteStorageGroupReq;
import org.apache.iotdb.confignode.rpc.thrift.TDeleteStorageGroupsReq;
import org.apache.iotdb.confignode.rpc.thrift.TDropFunctionReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
import org.apache.iotdb.confignode.rpc.thrift.TLoginReq;
import org.apache.iotdb.confignode.rpc.thrift.TPermissionInfoResp;
@@ -66,6 +67,7 @@ import
org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionResp;
import org.apache.iotdb.confignode.rpc.thrift.TSchemaPartitionTableResp;
import org.apache.iotdb.confignode.rpc.thrift.TSetDataReplicationFactorReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaReplicationFactorReq;
+import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq;
import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowDataNodesResp;
@@ -890,6 +892,38 @@ public class ConfigNodeClient
throw new TException(MSG_RECONNECTION_FAIL);
}
+ @Override
+ public TSStatus setSchemaTemplate(TSetSchemaTemplateReq req) throws
TException {
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TSStatus tsStatus = client.setSchemaTemplate(req);
+ if (!updateConfigNodeLeader(tsStatus)) {
+ return tsStatus;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ reconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
+ }
+
+ @Override
+ public TGetPathsSetTemplatesResp getPathsSetTemplate(String req) throws
TException {
+ for (int i = 0; i < RETRY_NUM; i++) {
+ try {
+ TGetPathsSetTemplatesResp tGetPathsSetTemplatesResp =
client.getPathsSetTemplate(req);
+ if (!updateConfigNodeLeader(tGetPathsSetTemplatesResp.getStatus())) {
+ return tGetPathsSetTemplatesResp;
+ }
+ } catch (TException e) {
+ configLeader = null;
+ }
+ reconnect();
+ }
+ throw new TException(MSG_RECONNECTION_FAIL);
+ }
+
public static class Factory extends BaseClientFactory<PartitionRegionId,
ConfigNodeClient> {
public Factory(
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
index f4974cc67e..fe9dc43a4b 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MetadataConstant.java
@@ -55,6 +55,9 @@ public class MetadataConstant {
public static final String[] ALL_RESULT_NODES = new String[] {"root", "**"};
public static final PartialPath ALL_MATCH_PATTERN = new PartialPath(new
String[] {"root", "**"});
+ public static final int NON_TEMPLATE = -1;
+ public static final int ALL_TEMPLATE = -2;
+
public static final byte INTERNAL_MNODE_TYPE = 0;
public static final byte STORAGE_GROUP_MNODE_TYPE = 1;
public static final byte MEASUREMENT_MNODE_TYPE = 2;
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
index abd844f820..2ce29d882e 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/idtable/entry/InsertMeasurementMNode.java
@@ -220,6 +220,16 @@ public class InsertMeasurementMNode implements
IMeasurementMNode {
throw new UnsupportedOperationException("insert measurement mnode doesn't
support this method");
}
+ @Override
+ public int getSchemaTemplateId() {
+ throw new UnsupportedOperationException("insert measurement mnode doesn't
support this method");
+ }
+
+ @Override
+ public void setSchemaTemplateId(int schemaTemplateId) {
+ throw new UnsupportedOperationException("insert measurement mnode doesn't
support this method");
+ }
+
@Override
public boolean isStorageGroup() {
throw new UnsupportedOperationException("insert measurement mnode doesn't
support this method");
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
index 4ecee98267..4f8f7b5887 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
@@ -78,6 +78,10 @@ public interface IMNode extends Serializable {
void setSchemaTemplate(Template schemaTemplate);
+ int getSchemaTemplateId();
+
+ void setSchemaTemplateId(int schemaTemplateId);
+
boolean isStorageGroup();
boolean isEntity();
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index 99dde9ab9e..f5daa4392e 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -27,6 +27,8 @@ import org.apache.iotdb.db.qp.physical.sys.MNodePlan;
import java.io.IOException;
+import static org.apache.iotdb.db.metadata.MetadataConstant.NON_TEMPLATE;
+
/**
* This class is the implementation of Metadata Node. One MNode instance
represents one node in the
* Metadata Tree
@@ -45,6 +47,8 @@ public class InternalMNode extends MNode {
protected transient volatile IMNodeContainer children = null;
// schema template
+ protected int schemaTemplateId = NON_TEMPLATE;
+
protected Template schemaTemplate = null;
private volatile boolean useTemplate = false;
@@ -201,6 +205,16 @@ public class InternalMNode extends MNode {
return null;
}
+ @Override
+ public int getSchemaTemplateId() {
+ return schemaTemplateId;
+ }
+
+ @Override
+ public void setSchemaTemplateId(int schemaTemplateId) {
+ this.schemaTemplateId = schemaTemplateId;
+ }
+
@Override
public Template getSchemaTemplate() {
return schemaTemplate;
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
index 5863e3aa31..9103d96c87 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MeasurementMNode.java
@@ -227,14 +227,25 @@ public class MeasurementMNode extends MNode implements
IMeasurementMNode {
@Override
public Template getSchemaTemplate() {
MeasurementMNode.logger.warn(
- "current node {} is a MeasurementMNode, can not get Device Template",
name);
+ "current node {} is a MeasurementMNode, can not get Schema Template",
name);
throw new RuntimeException(
- String.format("current node %s is a MeasurementMNode, can not get
Device Template", name));
+ String.format("current node %s is a MeasurementMNode, can not get
Schema Template", name));
}
@Override
public void setSchemaTemplate(Template schemaTemplate) {}
+ @Override
+ public int getSchemaTemplateId() {
+ MeasurementMNode.logger.warn(
+ "current node {} is a MeasurementMNode, can not get Schema Template",
name);
+ throw new RuntimeException(
+ String.format("current node %s is a MeasurementMNode, can not get
Schema Template", name));
+ }
+
+ @Override
+ public void setSchemaTemplateId(int schemaTemplateId) {}
+
@Override
public void setUseTemplate(boolean useTemplate) {}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSG.java
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
similarity index 82%
rename from
server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSG.java
rename to
server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
index aac868a21a..994096de16 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSG.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
@@ -25,7 +25,6 @@ import
org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.utils.ThriftConfigNodeSerDeUtils;
-import org.apache.iotdb.db.exception.metadata.PathAlreadyExistException;
import org.apache.iotdb.db.exception.metadata.StorageGroupAlreadySetException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.metadata.LocalSchemaProcessor;
@@ -33,12 +32,13 @@ import org.apache.iotdb.db.metadata.mnode.IMNode;
import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
import org.apache.iotdb.db.metadata.mnode.InternalMNode;
import org.apache.iotdb.db.metadata.mnode.StorageGroupMNode;
+import org.apache.iotdb.db.metadata.mnode.iterator.IMNodeIterator;
import org.apache.iotdb.db.metadata.mtree.store.MemMTreeStore;
+import
org.apache.iotdb.db.metadata.mtree.traverser.collector.CollectorTraverser;
import
org.apache.iotdb.db.metadata.mtree.traverser.collector.MNodeAboveSGCollector;
import
org.apache.iotdb.db.metadata.mtree.traverser.collector.StorageGroupCollector;
import org.apache.iotdb.db.metadata.mtree.traverser.counter.CounterTraverser;
import
org.apache.iotdb.db.metadata.mtree.traverser.counter.StorageGroupCounter;
-import org.apache.iotdb.db.metadata.template.Template;
import org.apache.iotdb.db.metadata.utils.MetaFormatUtils;
import org.apache.iotdb.tsfile.utils.Pair;
import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
@@ -62,20 +62,23 @@ import java.util.TreeSet;
import static
org.apache.iotdb.commons.conf.IoTDBConstant.ONE_LEVEL_PATH_WILDCARD;
import static org.apache.iotdb.commons.conf.IoTDBConstant.PATH_ROOT;
+import static org.apache.iotdb.db.metadata.MetadataConstant.ALL_RESULT_NODES;
+import static org.apache.iotdb.db.metadata.MetadataConstant.ALL_TEMPLATE;
import static
org.apache.iotdb.db.metadata.MetadataConstant.INTERNAL_MNODE_TYPE;
+import static org.apache.iotdb.db.metadata.MetadataConstant.NON_TEMPLATE;
import static
org.apache.iotdb.db.metadata.MetadataConstant.STORAGE_GROUP_MNODE_TYPE;
-// Since the MTreeAboveSG is all stored in memory, thus it is not restricted
to manage MNode through
+// Since the ConfigMTree is all stored in memory, thus it is not restricted to
manage MNode through
// MTreeStore.
-public class MTreeAboveSG {
+public class ConfigMTree {
- private final Logger logger = LoggerFactory.getLogger(MTreeAboveSG.class);
+ private final Logger logger = LoggerFactory.getLogger(ConfigMTree.class);
private IMNode root;
// this store is only used for traverser invoking
private MemMTreeStore store;
- public MTreeAboveSG() throws MetadataException {
+ public ConfigMTree() throws MetadataException {
store = new MemMTreeStore(new PartialPath(PATH_ROOT), false);
root = store.getRoot();
}
@@ -87,6 +90,8 @@ public class MTreeAboveSG {
}
}
+ // region Storage Group Management
+
/**
* Set storage group. Make sure check seriesPath before setting storage group
*
@@ -99,23 +104,17 @@ public class MTreeAboveSG {
throw new IllegalPathException(path.getFullPath());
}
IMNode cur = root;
- Template upperTemplate = cur.getSchemaTemplate();
int i = 1;
// e.g., path = root.a.b.sg, create internal nodes for a, b
while (i < nodeNames.length - 1) {
IMNode temp = cur.getChild(nodeNames[i]);
if (temp == null) {
- if (cur.isUseTemplate() && upperTemplate.hasSchema(nodeNames[i])) {
- throw new PathAlreadyExistException(
- cur.getPartialPath().concatNode(nodeNames[i]).getFullPath());
- }
cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
} else if (temp.isStorageGroup()) {
// before set storage group, check whether the storage group already
exists
throw new StorageGroupAlreadySetException(temp.getFullPath());
}
cur = cur.getChild(nodeNames[i]);
- upperTemplate = cur.getSchemaTemplate() == null ? upperTemplate :
cur.getSchemaTemplate();
i++;
}
@@ -130,10 +129,6 @@ public class MTreeAboveSG {
throw new StorageGroupAlreadySetException(path.getFullPath(), true);
}
} else {
- if (cur.isUseTemplate() && upperTemplate.hasSchema(nodeNames[i])) {
- throw new PathAlreadyExistException(
- cur.getPartialPath().concatNode(nodeNames[i]).getFullPath());
- }
IStorageGroupMNode storageGroupMNode =
new StorageGroupMNode(
cur, nodeNames[i],
CommonDescriptor.getInstance().getConfig().getDefaultTTL());
@@ -463,6 +458,24 @@ public class MTreeAboveSG {
throw new StorageGroupAlreadySetException(path.getFullPath(), true);
}
+ // endregion
+
+ // region MTree Node Management
+
+ public IMNode getNodeWithAutoCreate(PartialPath path) {
+ String[] nodeNames = path.getNodes();
+ IMNode cur = root;
+ IMNode child;
+ for (int i = 1; i < nodeNames.length; i++) {
+ child = cur.getChild(nodeNames[i]);
+ if (child == null) {
+ child = cur.addChild(nodeNames[i], new InternalMNode(cur,
nodeNames[i]));
+ }
+ cur = child;
+ }
+ return cur;
+ }
+
/**
* Get all paths of nodes in the given level matching the given path. If
using prefix match, the
* path pattern is used to match prefix path.
@@ -555,12 +568,113 @@ public class MTreeAboveSG {
}
}
+ // endregion
+
+ // region Template Management
+
+ /**
+ * check whether there is template on given path and the subTree has
template return true,
+ * otherwise false
+ */
+ public void checkTemplateOnPath(PartialPath path) throws MetadataException {
+ String[] nodeNames = path.getNodes();
+ IMNode cur = root;
+ IMNode child;
+
+ if (cur.getSchemaTemplateId() != NON_TEMPLATE) {
+ throw new MetadataException("Template already exists on " +
cur.getFullPath());
+ }
+
+ for (int i = 1; i < nodeNames.length; i++) {
+ child = cur.getChild(nodeNames[i]);
+ if (child == null) {
+ return;
+ }
+ cur = child;
+ if (cur.getSchemaTemplateId() != NON_TEMPLATE) {
+ throw new MetadataException("Template already exists on " +
cur.getFullPath());
+ }
+ if (cur.isMeasurement()) {
+ return;
+ }
+ }
+
+ checkTemplateOnSubtree(cur);
+ }
+
+ // traverse all the descendant of the given path node
+ private void checkTemplateOnSubtree(IMNode node) throws MetadataException {
+ if (node.isMeasurement()) {
+ return;
+ }
+ IMNode child;
+ IMNodeIterator iterator = store.getChildrenIterator(node);
+ while (iterator.hasNext()) {
+ child = iterator.next();
+
+ if (child.isMeasurement()) {
+ continue;
+ }
+ if (child.getSchemaTemplateId() != NON_TEMPLATE) {
+ throw new MetadataException("Template already exists on " +
child.getFullPath());
+ }
+ checkTemplateOnSubtree(child);
+ }
+ }
+
+ public List<String> getPathsSetOnTemplate(int templateId) throws
MetadataException {
+ List<String> resSet = new ArrayList<>();
+ CollectorTraverser<Set<String>> setTemplatePaths =
+ new CollectorTraverser<Set<String>>(root, new
PartialPath(ALL_RESULT_NODES), store) {
+ @Override
+ protected boolean processInternalMatchedMNode(IMNode node, int idx,
int level) {
+ // will never get here, implement for placeholder
+ return false;
+ }
+
+ @Override
+ protected boolean processFullMatchedMNode(IMNode node, int idx, int
level)
+ throws MetadataException {
+ // shall not traverse nodes inside template
+ if (!node.getPartialPath().equals(getCurrentPartialPath(node))) {
+ return true;
+ }
+
+ // if node not set template, go on traversing
+ if (node.getSchemaTemplateId() != NON_TEMPLATE) {
+ // if set template, and equals to target or target for all, add
to result
+ if (templateId == ALL_TEMPLATE || templateId ==
node.getSchemaTemplateId()) {
+ resSet.add(node.getFullPath());
+ }
+ // descendants of the node cannot set another template, exit
from this branch
+ return true;
+ }
+ return false;
+ }
+ };
+ setTemplatePaths.traverse();
+ return resSet;
+ }
+
+ // endregion
+
+ // region Serialization and Deserialization
+
public void serialize(OutputStream outputStream) throws IOException {
serializeInternalNode((InternalMNode) this.root, outputStream);
}
private void serializeInternalNode(InternalMNode node, OutputStream
outputStream)
throws IOException {
+ serializeChildren(node, outputStream);
+
+ ReadWriteIOUtils.write(INTERNAL_MNODE_TYPE, outputStream);
+ ReadWriteIOUtils.write(node.getName(), outputStream);
+ ReadWriteIOUtils.write(node.getSchemaTemplateId(), outputStream);
+ ReadWriteIOUtils.write(node.getChildren().size(), outputStream);
+ }
+
+ private void serializeChildren(InternalMNode node, OutputStream
outputStream) throws IOException {
for (IMNode child : node.getChildren().values()) {
if (child.isStorageGroup()) {
serializeStorageGroupNode((StorageGroupMNode) child, outputStream);
@@ -568,16 +682,15 @@ public class MTreeAboveSG {
serializeInternalNode((InternalMNode) child, outputStream);
}
}
-
- ReadWriteIOUtils.write(INTERNAL_MNODE_TYPE, outputStream);
- ReadWriteIOUtils.write(node.getName(), outputStream);
- ReadWriteIOUtils.write(node.getChildren().size(), outputStream);
}
private void serializeStorageGroupNode(
StorageGroupMNode storageGroupNode, OutputStream outputStream) throws
IOException {
+ serializeChildren(storageGroupNode, outputStream);
+
ReadWriteIOUtils.write(STORAGE_GROUP_MNODE_TYPE, outputStream);
ReadWriteIOUtils.write(storageGroupNode.getName(), outputStream);
+ ReadWriteIOUtils.write(storageGroupNode.getSchemaTemplateId(),
outputStream);
ThriftConfigNodeSerDeUtils.serializeTStorageGroupSchema(
storageGroupNode.getStorageGroupSchema(), outputStream);
}
@@ -626,15 +739,20 @@ public class MTreeAboveSG {
}
private InternalMNode deserializeInternalMNode(InputStream inputStream)
throws IOException {
- return new InternalMNode(null, ReadWriteIOUtils.readString(inputStream));
+ InternalMNode internalMNode = new InternalMNode(null,
ReadWriteIOUtils.readString(inputStream));
+ internalMNode.setSchemaTemplateId(ReadWriteIOUtils.readInt(inputStream));
+ return internalMNode;
}
private StorageGroupMNode deserializeStorageGroupMNode(InputStream
inputStream)
throws IOException {
StorageGroupMNode storageGroupMNode =
new StorageGroupMNode(null, ReadWriteIOUtils.readString(inputStream));
+
storageGroupMNode.setSchemaTemplateId(ReadWriteIOUtils.readInt(inputStream));
storageGroupMNode.setStorageGroupSchema(
ThriftConfigNodeSerDeUtils.deserializeTStorageGroupSchema(inputStream));
return storageGroupMNode;
}
+
+ // endregion
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaEngine.java
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaEngine.java
index f92497cb56..46e5903514 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaEngine.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaEngine.java
@@ -33,7 +33,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.exception.metadata.StorageGroupAlreadySetException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
-import org.apache.iotdb.db.metadata.mtree.MTreeAboveSG;
+import org.apache.iotdb.db.metadata.mtree.ConfigMTree;
import org.apache.iotdb.db.metadata.rescon.SchemaResourceManager;
import org.apache.iotdb.db.metadata.visitor.SchemaExecutionVisitor;
import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
@@ -62,7 +62,7 @@ public class SchemaEngine {
private static final IoTDBConfig config =
IoTDBDescriptor.getInstance().getConfig();
- private MTreeAboveSG sharedPrefixTree;
+ private ConfigMTree sharedPrefixTree;
private Map<SchemaRegionId, ISchemaRegion> schemaRegionMap;
private SchemaEngineMode schemaRegionStoredMode;
@@ -103,7 +103,7 @@ public class SchemaEngine {
SchemaResourceManager.initSchemaResource();
schemaRegionMap = new ConcurrentHashMap<>();
- sharedPrefixTree = new MTreeAboveSG();
+ sharedPrefixTree = new ConfigMTree();
Map<PartialPath, List<SchemaRegionId>> schemaRegionInfo =
initSchemaRegion();
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
index fe44e56bf4..d1b6fe516e 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/storagegroup/StorageGroupSchemaManager.java
@@ -27,7 +27,7 @@ import
org.apache.iotdb.db.exception.metadata.StorageGroupAlreadySetException;
import org.apache.iotdb.db.exception.metadata.StorageGroupNotSetException;
import org.apache.iotdb.db.metadata.LocalSchemaProcessor;
import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
-import org.apache.iotdb.db.metadata.mtree.MTreeAboveSG;
+import org.apache.iotdb.db.metadata.mtree.ConfigMTree;
import org.apache.iotdb.db.qp.physical.PhysicalPlan;
import org.apache.iotdb.db.qp.physical.sys.DeleteStorageGroupPlan;
import org.apache.iotdb.db.qp.physical.sys.SetStorageGroupPlan;
@@ -55,7 +55,7 @@ public class StorageGroupSchemaManager implements
IStorageGroupSchemaManager {
private StorageGroupLogWriter logWriter;
- private MTreeAboveSG mtree;
+ private ConfigMTree mtree;
private boolean isRecover = true;
@@ -75,7 +75,7 @@ public class StorageGroupSchemaManager implements
IStorageGroupSchemaManager {
public synchronized void init() throws MetadataException, IOException {
isRecover = true;
- mtree = new MTreeAboveSG();
+ mtree = new ConfigMTree();
recoverLog();
logWriter = new StorageGroupLogWriter(config.getSchemaDir(),
STORAGE_GROUP_LOG);
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
b/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
index 08beb9ef48..3664cae6ca 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/template/ClusterTemplateManager.java
@@ -24,9 +24,12 @@ import org.apache.iotdb.commons.client.IClientManager;
import org.apache.iotdb.commons.consensus.PartitionRegionId;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.confignode.rpc.thrift.TCreateSchemaTemplateReq;
import org.apache.iotdb.confignode.rpc.thrift.TGetAllTemplatesResp;
+import org.apache.iotdb.confignode.rpc.thrift.TGetPathsSetTemplatesResp;
import org.apache.iotdb.confignode.rpc.thrift.TGetTemplateResp;
+import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq;
import org.apache.iotdb.db.client.ConfigNodeClient;
import org.apache.iotdb.db.client.ConfigNodeInfo;
import org.apache.iotdb.db.client.DataNodeClientPoolFactory;
@@ -158,4 +161,52 @@ public class ClusterTemplateManager implements
ITemplateManager {
}
return template;
}
+
+ @Override
+ public void setSchemaTemplate(String name, PartialPath path) {
+ try (ConfigNodeClient configNodeClient =
+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
+ TSetSchemaTemplateReq req = new TSetSchemaTemplateReq();
+ req.setName(name);
+ req.setPath(path.getFullPath());
+ TSStatus tsStatus = configNodeClient.setSchemaTemplate(req);
+ if (tsStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ throw new RuntimeException(new IoTDBException(tsStatus.getMessage(),
tsStatus.getCode()));
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(
+ new IoTDBException(
+ "get schema template error.",
TSStatusCode.UNDEFINED_TEMPLATE.getStatusCode()));
+ }
+ }
+
+ @Override
+ public List<PartialPath> getPathsSetTemplate(String name) {
+ List<PartialPath> listPath = new ArrayList<PartialPath>();
+ try (ConfigNodeClient configNodeClient =
+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
+ TGetPathsSetTemplatesResp resp =
configNodeClient.getPathsSetTemplate(name);
+ if (resp.getStatus().getCode() ==
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+ if (resp.getPathList() != null) {
+ resp.getPathList().stream()
+ .forEach(
+ item -> {
+ try {
+ listPath.add(new PartialPath(item));
+ } catch (IllegalPathException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+ } else {
+ throw new RuntimeException(
+ new IoTDBException(resp.status.getMessage(),
resp.status.getCode()));
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(
+ new IoTDBException(
+ "get path set template error.",
TSStatusCode.UNDEFINED_TEMPLATE.getStatusCode()));
+ }
+ return listPath;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
b/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
index d2abfe8eeb..049f835917 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
@@ -20,6 +20,7 @@
package org.apache.iotdb.db.metadata.template;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
+import org.apache.iotdb.commons.path.PartialPath;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
import java.util.List;
@@ -46,4 +47,20 @@ public interface ITemplateManager {
* @return Template
*/
Template getTemplate(String name);
+
+ /**
+ * mount template
+ *
+ * @param name templateName
+ * @param path mount path
+ */
+ void setSchemaTemplate(String name, PartialPath path);
+
+ /**
+ * get info of mounted template
+ *
+ * @param name
+ * @return
+ */
+ List<PartialPath> getPathsSetTemplate(String name);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
index ba5928bbcd..df93713dcd 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/template/Template.java
@@ -65,6 +65,8 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class Template implements Serializable {
+
+ private int id;
private String name;
private Map<String, IMNode> directNodes;
private boolean isDirectAligned;
@@ -157,6 +159,14 @@ public class Template implements Serializable {
statement.getCompressors()));
}
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
public String getName() {
return name;
}
@@ -675,8 +685,9 @@ public class Template implements Serializable {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new
DataOutputStream(byteArrayOutputStream);
- SerializeUtils.serialize(name, dataOutputStream);
try {
+ dataOutputStream.writeInt(id);
+ SerializeUtils.serialize(name, dataOutputStream);
dataOutputStream.writeInt(schemaMap.size());
for (Map.Entry<String, IMeasurementSchema> entry : schemaMap.entrySet())
{
SerializeUtils.serialize(entry.getKey(), dataOutputStream);
@@ -689,6 +700,7 @@ public class Template implements Serializable {
}
public void deserialize(ByteBuffer buffer) {
+ id = buffer.getInt();
name = SerializeUtils.deserializeString(buffer);
int schemaSize = buffer.getInt();
schemaMap = new HashMap<>(schemaSize);
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
index 616072b1a0..b7bbeff924 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/common/header/HeaderConstant.java
@@ -50,6 +50,7 @@ public class HeaderConstant {
public static final String COLUMN_CHILDPATHS = "child paths";
public static final String COLUMN_CHILDNODES = "child nodes";
public static final String COLUMN_VERSION = "version";
+ public static final String COLUMN_PATHS = "paths";
// column names for count statement
public static final String COLUMN_COLUMN = "column";
@@ -122,6 +123,9 @@ public class HeaderConstant {
// dataset header for show schma template
public static final DatasetHeader showSchemaTemplate;
+ // dataset header for show path set template
+ public static final DatasetHeader showPathSetTemplate;
+
static {
countStorageGroupHeader =
new DatasetHeader(
@@ -273,5 +277,7 @@ public class HeaderConstant {
new ColumnHeader(COLUMN_TIMESERIES_ENCODING, TSDataType.TEXT),
new ColumnHeader(COLUMN_TIMESERIES_COMPRESSION,
TSDataType.TEXT)),
true);
+ showPathSetTemplate =
+ new DatasetHeader(Arrays.asList(new ColumnHeader(COLUMN_PATHS,
TSDataType.TEXT)), true);
}
}
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 83554d8ccb..3148c41769 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
@@ -79,7 +79,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ShowVersionStatement;
@@ -1461,4 +1463,22 @@ public class AnalyzeVisitor extends
StatementVisitor<Analysis, MPPQueryContext>
groupByTimeComponent.getEndTime());
}
}
+
+ @Override
+ public Analysis visitSetSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement, MPPQueryContext
context) {
+ context.setQueryType(QueryType.WRITE);
+ Analysis analysis = new Analysis();
+ analysis.setStatement(setSchemaTemplateStatement);
+ return analysis;
+ }
+
+ @Override
+ public Analysis visitShowPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement,
MPPQueryContext context) {
+ Analysis analysis = new Analysis();
+ analysis.setStatement(showPathSetTemplateStatement);
+ analysis.setRespDatasetHeader(HeaderConstant.showPathSetTemplate);
+ return analysis;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
index cd94366880..e2f1a3c79e 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/constant/StatementType.java
@@ -131,6 +131,8 @@ public enum StatementType {
DROP_TEMPLATE,
SHOW_SCHEMA_TEMPLATE,
SHOW_NODES_IN_SCHEMA_TEMPLATE,
+ SET_SCHEMA_TEMPLATE,
+ SHOW_PATH_SET_SCHEMA_TEMPLATE,
SHOW_QUERY_RESOURCE,
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
index 0b1f6107fa..920a721352 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java
@@ -36,7 +36,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.FlushStatement;
@@ -151,6 +153,18 @@ public class ConfigTaskVisitor
return new ShowSchemaTemplateTask(showSchemaTemplateStatement);
}
+ @Override
+ public IConfigTask visitSetSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement, TaskContext
context) {
+ return new SetSchemaTemplateTask(setSchemaTemplateStatement);
+ }
+
+ @Override
+ public IConfigTask visitShowPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement, TaskContext
context) {
+ return new ShowPathSetTemplateTask(showPathSetTemplateStatement);
+ }
+
@Override
public IConfigTask visitShowDataNodes(
ShowDataNodesStatement showDataNodesStatement, TaskContext context) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetSchemaTemplateTask.java
similarity index 54%
copy from
server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
copy to
server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetSchemaTemplateTask.java
index d2abfe8eeb..101f2264d4 100644
---
a/server/src/main/java/org/apache/iotdb/db/metadata/template/ITemplateManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/SetSchemaTemplateTask.java
@@ -17,33 +17,24 @@
* under the License.
*/
-package org.apache.iotdb.db.metadata.template;
+package org.apache.iotdb.db.mpp.plan.execution.config;
-import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
-import java.util.List;
+import com.google.common.util.concurrent.ListenableFuture;
-public interface ITemplateManager {
+public class SetSchemaTemplateTask implements IConfigTask {
- /**
- * @param statement CreateSchemaTemplateStatement
- * @return TSStatus
- */
- TSStatus createSchemaTemplate(CreateSchemaTemplateStatement statement);
+ private final SetSchemaTemplateStatement setSchemaTemplateStatement;
- /**
- * show schema templates
- *
- * @return List<Template>
- */
- List<Template> getAllTemplates();
+ public SetSchemaTemplateTask(SetSchemaTemplateStatement
setSchemaTemplateStatement) {
+ this.setSchemaTemplateStatement = setSchemaTemplateStatement;
+ }
- /**
- * show nodes in schema template xx
- *
- * @param name
- * @return Template
- */
- Template getTemplate(String name);
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
+ throws InterruptedException {
+ return configTaskExecutor.setSchemaTemplate(setSchemaTemplateStatement);
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowPathSetTemplateTask.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowPathSetTemplateTask.java
new file mode 100644
index 0000000000..f1ba3d66e1
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ShowPathSetTemplateTask.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.execution.config;
+
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.common.header.DatasetHeader;
+import org.apache.iotdb.db.mpp.common.header.HeaderConstant;
+import
org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
+import org.apache.iotdb.rpc.TSStatusCode;
+import org.apache.iotdb.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.iotdb.tsfile.utils.Binary;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
+
+import java.util.List;
+
+public class ShowPathSetTemplateTask implements IConfigTask {
+
+ private final ShowPathSetTemplateStatement showPathSetTemplateStatement;
+
+ public ShowPathSetTemplateTask(ShowPathSetTemplateStatement
showPathSetTemplateStatement) {
+ this.showPathSetTemplateStatement = showPathSetTemplateStatement;
+ }
+
+ @Override
+ public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor
configTaskExecutor)
+ throws InterruptedException {
+ return
configTaskExecutor.showPathSetTemplate(showPathSetTemplateStatement);
+ }
+
+ public static void buildTSBlock(
+ List<PartialPath> listPath, SettableFuture<ConfigTaskResult> future) {
+ TsBlockBuilder builder =
+ new
TsBlockBuilder(HeaderConstant.showPathSetTemplate.getRespDataTypes());
+ try {
+ if (listPath != null) {
+ // template.get
+ for (PartialPath path : listPath) {
+ builder.getTimeColumnBuilder().writeLong(0L);
+ builder.getColumnBuilder(0).writeBinary(new
Binary(path.getFullPath()));
+ builder.declarePosition();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ DatasetHeader datasetHeader = HeaderConstant.showPathSetTemplate;
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS,
builder.build(), datasetHeader));
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index 1ff880d900..ee8c02b9ce 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -49,6 +49,7 @@ import
org.apache.iotdb.db.mpp.plan.execution.config.SetStorageGroupTask;
import org.apache.iotdb.db.mpp.plan.execution.config.ShowClusterTask;
import org.apache.iotdb.db.mpp.plan.execution.config.ShowDataNodesTask;
import
org.apache.iotdb.db.mpp.plan.execution.config.ShowNodesInSchemaTemplateTask;
+import org.apache.iotdb.db.mpp.plan.execution.config.ShowPathSetTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.ShowRegionTask;
import org.apache.iotdb.db.mpp.plan.execution.config.ShowSchemaTemplateTask;
import org.apache.iotdb.db.mpp.plan.execution.config.ShowStorageGroupTask;
@@ -62,7 +63,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.rpc.TSStatusCode;
@@ -440,4 +443,40 @@ public class ClusterConfigTaskExecutor implements
IConfigTaskExecutor {
}
return future;
}
+
+ @Override
+ public SettableFuture<ConfigTaskResult> setSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ String templateName = setSchemaTemplateStatement.getTemplateName();
+ PartialPath path = setSchemaTemplateStatement.getPath();
+ try (ConfigNodeClient configNodeClient =
+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
+ // Send request to some API server
+ ClusterTemplateManager.getInstance().setSchemaTemplate(templateName,
path);
+ // build TSBlock
+ future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS));
+ } catch (Exception e) {
+ future.setException(e);
+ }
+ return future;
+ }
+
+ @Override
+ public SettableFuture<ConfigTaskResult> showPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ String templateName = showPathSetTemplateStatement.getTemplateName();
+ try (ConfigNodeClient configNodeClient =
+
CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.partitionRegionId)) {
+ // Send request to some API server
+ List<PartialPath> listPath =
+
ClusterTemplateManager.getInstance().getPathsSetTemplate(templateName);
+ // build TSBlock
+ ShowPathSetTemplateTask.buildTSBlock(listPath, future);
+ } catch (Exception e) {
+ future.setException(e);
+ }
+ return future;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
index ed2eba46a5..d4ab1b0b56 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java
@@ -30,7 +30,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import com.google.common.util.concurrent.SettableFuture;
@@ -76,4 +78,10 @@ public interface IConfigTaskExecutor {
SettableFuture<ConfigTaskResult> showNodesInSchemaTemplate(
ShowNodesInSchemaTemplateStatement showNodesInSchemaTemplateStatement);
+
+ SettableFuture<ConfigTaskResult> setSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement);
+
+ SettableFuture<ConfigTaskResult> showPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
index e4badb3c1a..22fb605292 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/StandaloneConfigTaskExecutor.java
@@ -42,7 +42,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowRegionStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStorageGroupStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.StatementExecutionException;
@@ -333,4 +335,28 @@ public class StandaloneConfigTaskExecutor implements
IConfigTaskExecutor {
"Executing show nodes in schema template is not supported")));
return future;
}
+
+ @Override
+ public SettableFuture<ConfigTaskResult> setSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ future.setException(
+ new StatementExecutionException(
+ RpcUtils.getStatus(
+ TSStatusCode.EXECUTE_STATEMENT_ERROR,
+ "Executing set schema template is not supported")));
+ return future;
+ }
+
+ @Override
+ public SettableFuture<ConfigTaskResult> showPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement) {
+ SettableFuture<ConfigTaskResult> future = SettableFuture.create();
+ future.setException(
+ new StatementExecutionException(
+ RpcUtils.getStatus(
+ TSStatusCode.EXECUTE_STATEMENT_ERROR,
+ "Executing show path set template is not supported")));
+ return future;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
index f04d2516f7..d5911284ab 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java
@@ -105,7 +105,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -2482,4 +2484,25 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
new ShowNodesInSchemaTemplateStatement(templateName);
return showNodesInSchemaTemplateStatement;
}
+
+ @Override
+ public Statement
visitSetSchemaTemplate(IoTDBSqlParser.SetSchemaTemplateContext ctx) {
+ String templateName = ctx.templateName.children.get(0).getText();
+ String path = ctx.getText();
+ SetSchemaTemplateStatement statement = null;
+ try {
+ statement = new SetSchemaTemplateStatement(templateName, path);
+ } catch (IllegalPathException e) {
+ throw new SQLParserException("set template: path error.");
+ }
+ return statement;
+ }
+
+ @Override
+ public Statement visitShowPathsSetSchemaTemplate(
+ IoTDBSqlParser.ShowPathsSetSchemaTemplateContext ctx) {
+ String templateName = ctx.templateName.children.get(0).getText();
+ ShowPathSetTemplateStatement statement = new
ShowPathSetTemplateStatement(templateName);
+ return statement;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
index f9da937bff..3137f958d8 100644
---
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java
@@ -57,7 +57,9 @@ import
org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTTLStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowTimeSeriesStatement;
import org.apache.iotdb.db.mpp.plan.statement.metadata.UnSetTTLStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowNodesInSchemaTemplateStatement;
+import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowPathSetTemplateStatement;
import
org.apache.iotdb.db.mpp.plan.statement.metadata.template.ShowSchemaTemplateStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.AuthorStatement;
import org.apache.iotdb.db.mpp.plan.statement.sys.ExplainStatement;
@@ -283,4 +285,14 @@ public abstract class StatementVisitor<R, C> {
ShowSchemaTemplateStatement showSchemaTemplateStatement, C context) {
return visitStatement(showSchemaTemplateStatement, context);
}
+
+ public R visitSetSchemaTemplate(
+ SetSchemaTemplateStatement setSchemaTemplateStatement, C context) {
+ return visitStatement(setSchemaTemplateStatement, context);
+ }
+
+ public R visitShowPathSetTemplate(
+ ShowPathSetTemplateStatement showPathSetTemplateStatement, C context) {
+ return visitStatement(showPathSetTemplateStatement, context);
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/SetSchemaTemplateStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/SetSchemaTemplateStatement.java
new file mode 100644
index 0000000000..e89ca88b48
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/SetSchemaTemplateStatement.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.statement.metadata.template;
+
+import org.apache.iotdb.commons.exception.IllegalPathException;
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
+
+public class SetSchemaTemplateStatement extends ShowStatement implements
IConfigStatement {
+
+ private String templateName;
+ private PartialPath path;
+
+ public SetSchemaTemplateStatement(String templateName, PartialPath path) {
+ super();
+ statementType = StatementType.SET_SCHEMA_TEMPLATE;
+ this.templateName = templateName;
+ this.path = path;
+ }
+
+ public SetSchemaTemplateStatement(String templateName, String path) throws
IllegalPathException {
+ super();
+ statementType = StatementType.SET_SCHEMA_TEMPLATE;
+ this.templateName = templateName;
+ this.path = new PartialPath(path);
+ }
+
+ public String getTemplateName() {
+ return templateName;
+ }
+
+ public void setTemplateName(String templateName) {
+ this.templateName = templateName;
+ }
+
+ public PartialPath getPath() {
+ return path;
+ }
+
+ public void setPath(PartialPath path) {
+ this.path = path;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitSetSchemaTemplate(this, context);
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.WRITE;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/ShowPathSetTemplateStatement.java
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/ShowPathSetTemplateStatement.java
new file mode 100644
index 0000000000..18b751e067
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/template/ShowPathSetTemplateStatement.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.mpp.plan.statement.metadata.template;
+
+import org.apache.iotdb.db.mpp.plan.analyze.QueryType;
+import org.apache.iotdb.db.mpp.plan.constant.StatementType;
+import org.apache.iotdb.db.mpp.plan.statement.IConfigStatement;
+import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
+import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowStatement;
+
+public class ShowPathSetTemplateStatement extends ShowStatement implements
IConfigStatement {
+
+ private String templateName;
+
+ public ShowPathSetTemplateStatement(String templateName) {
+ super();
+ statementType = StatementType.SHOW_PATH_SET_SCHEMA_TEMPLATE;
+ this.templateName = templateName;
+ }
+
+ public String getTemplateName() {
+ return templateName;
+ }
+
+ public void setTemplateName(String templateName) {
+ this.templateName = templateName;
+ }
+
+ @Override
+ public <R, C> R accept(StatementVisitor<R, C> visitor, C context) {
+ return visitor.visitShowPathSetTemplate(this, context);
+ }
+
+ @Override
+ public QueryType getQueryType() {
+ return QueryType.READ;
+ }
+}
diff --git
a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSGTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
similarity index 92%
rename from
server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSGTest.java
rename to
server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
index ce9467808a..41909061d0 100644
---
a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeAboveSGTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
import org.apache.iotdb.db.metadata.LocalSchemaProcessor;
+import org.apache.iotdb.db.metadata.mnode.IMNode;
import org.apache.iotdb.db.metadata.mnode.IStorageGroupMNode;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.apache.iotdb.tsfile.utils.Pair;
@@ -46,14 +47,14 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-public class MTreeAboveSGTest {
+public class ConfigMTreeTest {
- private MTreeAboveSG root;
+ private ConfigMTree root;
@Before
public void setUp() throws Exception {
EnvironmentUtils.envSetUp();
- root = new MTreeAboveSG();
+ root = new ConfigMTree();
}
@After
@@ -320,7 +321,7 @@ public class MTreeAboveSGTest {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
root.serialize(outputStream);
- MTreeAboveSG newTree = new MTreeAboveSG();
+ ConfigMTree newTree = new ConfigMTree();
ByteArrayInputStream inputStream = new
ByteArrayInputStream(outputStream.toByteArray());
newTree.deserialize(inputStream);
@@ -341,4 +342,41 @@ public class MTreeAboveSGTest {
Assert.assertEquals(
1, newTree.getMatchedStorageGroups(new PartialPath("root.*.*.sg"),
false).size());
}
+
+ @Test
+ public void testSetTemplate() throws IllegalPathException {
+ PartialPath path = new PartialPath("root.a.template0");
+ try {
+ root.checkTemplateOnPath(path);
+ } catch (MetadataException e) {
+ fail();
+ }
+
+ IMNode node = root.getNodeWithAutoCreate(path);
+ node.setSchemaTemplateId(0);
+
+ try {
+ root.checkTemplateOnPath(path);
+ fail();
+ } catch (MetadataException ignore) {
+ }
+
+ path = new PartialPath("root.a.b.template0");
+ node = root.getNodeWithAutoCreate(path);
+ node.setSchemaTemplateId(0);
+
+ try {
+ root.checkTemplateOnPath(path);
+ fail();
+ } catch (MetadataException ignore) {
+ }
+
+ try {
+ List<String> pathList = root.getPathsSetOnTemplate(0);
+ Assert.assertTrue(pathList.contains("root.a.template0"));
+ Assert.assertTrue(pathList.contains("root.a.b.template0"));
+ } catch (MetadataException e) {
+ fail();
+ }
+ }
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGTest.java
b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGTest.java
index d73efa9157..a7f4e388ca 100644
---
a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGTest.java
+++
b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGTest.java
@@ -57,7 +57,7 @@ import static org.junit.Assert.fail;
public abstract class MTreeBelowSGTest {
- MTreeAboveSG root;
+ ConfigMTree root;
IMTreeBelowSG storageGroup;
Set<IMTreeBelowSG> usedMTree = new HashSet<>();
@@ -70,7 +70,7 @@ public abstract class MTreeBelowSGTest {
public void setUp() throws Exception {
setConfig();
EnvironmentUtils.envSetUp();
- root = new MTreeAboveSG();
+ root = new ConfigMTree();
}
@After
diff --git a/thrift-confignode/src/main/thrift/confignode.thrift
b/thrift-confignode/src/main/thrift/confignode.thrift
index 460436671a..2f4965b54d 100644
--- a/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/thrift-confignode/src/main/thrift/confignode.thrift
@@ -296,6 +296,15 @@ struct TGetTemplateResp {
2: optional binary template
}
+struct TSetSchemaTemplateReq {
+ 1: required string name
+ 2: required string path
+}
+struct TGetPathsSetTemplatesResp {
+ 1: required common.TSStatus status
+ 2: optional list<string> pathList
+}
+
service IConfigNodeRPCService {
/* DataNode */
@@ -417,5 +426,9 @@ service IConfigNodeRPCService {
TGetTemplateResp getTemplate(string req)
+ common.TSStatus setSchemaTemplate(TSetSchemaTemplateReq req)
+
+ TGetPathsSetTemplatesResp getPathsSetTemplate(string req)
+
}