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

Reply via email to