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

jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 6efd4d9e508 [To dev/1.3] Fixed the concurrency bug of create 
timeseries / set(unset) template
6efd4d9e508 is described below

commit 6efd4d9e508e53e2feacfc0aaa02d37ab05a9a50
Author: Caideyipi <[email protected]>
AuthorDate: Thu Mar 13 09:09:56 2025 +0800

    [To dev/1.3] Fixed the concurrency bug of create timeseries / set(unset) 
template
---
 .../impl/schema/UnsetTemplateProcedure.java        | 146 ++++++++-------------
 .../template/NoTemplateOnMNodeException.java       |  34 -----
 .../impl/DataNodeInternalRPCServiceImpl.java       |  19 +--
 .../queryengine/plan/analyze/AnalyzeVisitor.java   |  42 ++----
 .../template/TemplateInternalRPCUpdateType.java    |   5 +-
 5 files changed, 83 insertions(+), 163 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
index d85d1bfb301..81405960885 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/UnsetTemplateProcedure.java
@@ -69,12 +69,15 @@ public class UnsetTemplateProcedure
   private transient ByteBuffer addTemplateSetInfo;
   private transient ByteBuffer invalidateTemplateSetInfo;
 
-  public UnsetTemplateProcedure(boolean isGeneratedByPipe) {
+  public UnsetTemplateProcedure(final boolean isGeneratedByPipe) {
     super(isGeneratedByPipe);
   }
 
   public UnsetTemplateProcedure(
-      String queryId, Template template, PartialPath path, boolean 
isGeneratedByPipe) {
+      final String queryId,
+      final Template template,
+      final PartialPath path,
+      final boolean isGeneratedByPipe) {
     super(isGeneratedByPipe);
     this.queryId = queryId;
     this.template = template;
@@ -82,9 +85,9 @@ public class UnsetTemplateProcedure
   }
 
   @Override
-  protected Flow executeFromState(ConfigNodeProcedureEnv env, 
UnsetTemplateState state)
+  protected Flow executeFromState(final ConfigNodeProcedureEnv env, final 
UnsetTemplateState state)
       throws ProcedureSuspendedException, ProcedureYieldException, 
InterruptedException {
-    long startTime = System.currentTimeMillis();
+    final long startTime = System.currentTimeMillis();
     try {
       switch (state) {
         case CONSTRUCT_BLACK_LIST:
@@ -127,8 +130,8 @@ public class UnsetTemplateProcedure
     }
   }
 
-  private void constructBlackList(ConfigNodeProcedureEnv env) {
-    TSStatus status =
+  private void constructBlackList(final ConfigNodeProcedureEnv env) {
+    final TSStatus status =
         env.getConfigManager()
             .getClusterSchemaManager()
             .preUnsetSchemaTemplate(template.getId(), path);
@@ -139,30 +142,33 @@ public class UnsetTemplateProcedure
     }
   }
 
-  private void invalidateCache(ConfigNodeProcedureEnv env) {
+  private void invalidateCache(final ConfigNodeProcedureEnv env) {
     try {
+      // Cannot roll back after cache invalidation
+      // Because we do not know whether there are time series successfully 
created
+      alreadyRollback = true;
       executeInvalidateCache(env);
       setNextState(UnsetTemplateState.CHECK_DATANODE_TEMPLATE_ACTIVATION);
-    } catch (ProcedureException e) {
+    } catch (final ProcedureException e) {
       setFailure(e);
     }
   }
 
-  private void executeInvalidateCache(ConfigNodeProcedureEnv env) throws 
ProcedureException {
-    Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+  private void executeInvalidateCache(final ConfigNodeProcedureEnv env) throws 
ProcedureException {
+    final Map<Integer, TDataNodeLocation> dataNodeLocationMap =
         
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
-    TUpdateTemplateReq invalidateTemplateSetInfoReq = new TUpdateTemplateReq();
+    final TUpdateTemplateReq invalidateTemplateSetInfoReq = new 
TUpdateTemplateReq();
     invalidateTemplateSetInfoReq.setType(
         TemplateInternalRPCUpdateType.INVALIDATE_TEMPLATE_SET_INFO.toByte());
     
invalidateTemplateSetInfoReq.setTemplateInfo(getInvalidateTemplateSetInfo());
-    DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus> clientHandler =
+    final DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus> 
clientHandler =
         new DataNodeAsyncRequestContext<>(
             CnToDnAsyncRequestType.UPDATE_TEMPLATE,
             invalidateTemplateSetInfoReq,
             dataNodeLocationMap);
     
CnToDnInternalServiceAsyncRequestManager.getInstance().sendAsyncRequestWithRetry(clientHandler);
-    Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
-    for (TSStatus status : statusMap.values()) {
+    final Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
+    for (final TSStatus status : statusMap.values()) {
       // all dataNodes must clear the related template cache
       if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         LOGGER.error(
@@ -174,14 +180,14 @@ public class UnsetTemplateProcedure
     }
   }
 
-  private boolean checkDataNodeTemplateActivation(ConfigNodeProcedureEnv env) {
-    PathPatternTree patternTree = new PathPatternTree();
+  private boolean checkDataNodeTemplateActivation(final ConfigNodeProcedureEnv 
env) {
+    final PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendPathPattern(path);
     patternTree.appendPathPattern(path.concatNode(MULTI_LEVEL_PATH_WILDCARD));
     try {
       return SchemaUtils.checkDataNodeTemplateActivation(
           env.getConfigManager(), patternTree, template);
-    } catch (MetadataException e) {
+    } catch (final MetadataException e) {
       setFailure(
           new ProcedureException(
               new MetadataException(
@@ -192,51 +198,45 @@ public class UnsetTemplateProcedure
     }
   }
 
-  private void unsetTemplate(ConfigNodeProcedureEnv env) {
-    TSStatus status =
+  private void unsetTemplate(final ConfigNodeProcedureEnv env) {
+    final TSStatus status =
         env.getConfigManager()
             .getClusterSchemaManager()
             .unsetSchemaTemplateInBlackList(template.getId(), path, 
isGeneratedByPipe);
-    if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-      setNextState(UnsetTemplateState.CLEAN_DATANODE_TEMPLATE_CACHE);
-    } else {
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       setFailure(new ProcedureException(new 
IoTDBException(status.getMessage(), status.getCode())));
     }
   }
 
   @Override
-  protected void rollbackState(ConfigNodeProcedureEnv env, UnsetTemplateState 
unsetTemplateState)
+  protected void rollbackState(
+      final ConfigNodeProcedureEnv env, final UnsetTemplateState 
unsetTemplateState)
       throws IOException, InterruptedException, ProcedureException {
     if (alreadyRollback) {
       return;
     }
     alreadyRollback = true;
     ProcedureException rollbackException;
-    try {
-      executeRollbackInvalidateCache(env);
-      TSStatus status =
-          env.getConfigManager()
-              .getClusterSchemaManager()
-              .rollbackPreUnsetSchemaTemplate(template.getId(), path);
-      if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-        return;
-      } else {
-        LOGGER.error(
-            "Failed to rollback pre unset template operation of template {} 
set on {}",
-            template.getName(),
-            path);
-        rollbackException =
-            new ProcedureException(
-                new MetadataException(
-                    "Rollback template pre unset failed because of" + 
status.getMessage()));
-      }
-    } catch (ProcedureException e) {
-      rollbackException = e;
+    final TSStatus status =
+        env.getConfigManager()
+            .getClusterSchemaManager()
+            .rollbackPreUnsetSchemaTemplate(template.getId(), path);
+    if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      return;
+    } else {
+      LOGGER.error(
+          "Failed to rollback pre unset template operation of template {} set 
on {}",
+          template.getName(),
+          path);
+      rollbackException =
+          new ProcedureException(
+              new MetadataException(
+                  "Rollback template pre unset failed because of" + 
status.getMessage()));
     }
     try {
       executeInvalidateCache(env);
       setFailure(rollbackException);
-    } catch (ProcedureException exception) {
+    } catch (final ProcedureException exception) {
       setFailure(
           new ProcedureException(
               new MetadataException(
@@ -244,43 +244,18 @@ public class UnsetTemplateProcedure
     }
   }
 
-  private void executeRollbackInvalidateCache(ConfigNodeProcedureEnv env)
-      throws ProcedureException {
-    Map<Integer, TDataNodeLocation> dataNodeLocationMap =
-        
env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
-    TUpdateTemplateReq rollbackTemplateSetInfoReq = new TUpdateTemplateReq();
-    rollbackTemplateSetInfoReq.setType(
-        TemplateInternalRPCUpdateType.ADD_TEMPLATE_SET_INFO.toByte());
-    rollbackTemplateSetInfoReq.setTemplateInfo(getAddTemplateSetInfo());
-    DataNodeAsyncRequestContext<TUpdateTemplateReq, TSStatus> clientHandler =
-        new DataNodeAsyncRequestContext<>(
-            CnToDnAsyncRequestType.UPDATE_TEMPLATE,
-            rollbackTemplateSetInfoReq,
-            dataNodeLocationMap);
-    
CnToDnInternalServiceAsyncRequestManager.getInstance().sendAsyncRequestWithRetry(clientHandler);
-    Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
-    for (TSStatus status : statusMap.values()) {
-      // all dataNodes must clear the related template cache
-      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-        LOGGER.error(
-            "Failed to rollback template cache of template {} set on {}", 
template.getName(), path);
-        throw new ProcedureException(new MetadataException("Rollback template 
cache failed"));
-      }
-    }
-  }
-
   @Override
-  protected boolean isRollbackSupported(UnsetTemplateState unsetTemplateState) 
{
+  protected boolean isRollbackSupported(final UnsetTemplateState 
unsetTemplateState) {
     return true;
   }
 
   @Override
-  protected UnsetTemplateState getState(int stateId) {
+  protected UnsetTemplateState getState(final int stateId) {
     return UnsetTemplateState.values()[stateId];
   }
 
   @Override
-  protected int getStateId(UnsetTemplateState unsetTemplateState) {
+  protected int getStateId(final UnsetTemplateState unsetTemplateState) {
     return unsetTemplateState.ordinal();
   }
 
@@ -309,17 +284,6 @@ public class UnsetTemplateProcedure
     return path;
   }
 
-  private ByteBuffer getAddTemplateSetInfo() {
-    if (this.addTemplateSetInfo == null) {
-      this.addTemplateSetInfo =
-          ByteBuffer.wrap(
-              TemplateInternalRPCUtil.generateAddTemplateSetInfoBytes(
-                  template, path.getFullPath()));
-    }
-
-    return addTemplateSetInfo;
-  }
-
   private ByteBuffer getInvalidateTemplateSetInfo() {
     if (this.invalidateTemplateSetInfo == null) {
       this.invalidateTemplateSetInfo =
@@ -331,7 +295,7 @@ public class UnsetTemplateProcedure
   }
 
   @Override
-  public void serialize(DataOutputStream stream) throws IOException {
+  public void serialize(final DataOutputStream stream) throws IOException {
     stream.writeShort(
         isGeneratedByPipe
             ? 
ProcedureType.PIPE_ENRICHED_UNSET_TEMPLATE_PROCEDURE.getTypeCode()
@@ -344,7 +308,7 @@ public class UnsetTemplateProcedure
   }
 
   @Override
-  public void deserialize(ByteBuffer byteBuffer) {
+  public void deserialize(final ByteBuffer byteBuffer) {
     super.deserialize(byteBuffer);
     queryId = ReadWriteIOUtils.readString(byteBuffer);
     template = new Template();
@@ -354,10 +318,14 @@ public class UnsetTemplateProcedure
   }
 
   @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-    UnsetTemplateProcedure that = (UnsetTemplateProcedure) o;
+  public boolean equals(final Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    final UnsetTemplateProcedure that = (UnsetTemplateProcedure) o;
     return Objects.equals(getProcId(), that.getProcId())
         && Objects.equals(getCurrentState(), that.getCurrentState())
         && Objects.equals(getCycles(), that.getCycles())
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
deleted file mode 100644
index 0f2a274235a..00000000000
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/exception/metadata/template/NoTemplateOnMNodeException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.exception.metadata.template;
-
-import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.rpc.TSStatusCode;
-
-public class NoTemplateOnMNodeException extends MetadataException {
-
-  public NoTemplateOnMNodeException(String path) {
-    super(
-        String.format("NO template on %s", path),
-        TSStatusCode.TEMPLATE_NOT_SET.getStatusCode(),
-        true);
-  }
-}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
index 20ef565ca54..5deebe5b3ab 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -1973,24 +1973,25 @@ public class DataNodeInternalRPCServiceImpl implements 
IDataNodeRPCService.Iface
   }
 
   @Override
-  public TSStatus updateTemplate(TUpdateTemplateReq req) {
+  public TSStatus updateTemplate(final TUpdateTemplateReq req) {
     switch (TemplateInternalRPCUpdateType.getType(req.type)) {
-      case ADD_TEMPLATE_SET_INFO:
+        // Reserved for rolling upgrade
+      case ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO:
+        
ClusterTemplateManager.getInstance().addTemplateSetInfo(req.getTemplateInfo());
+        break;
+      case INVALIDATE_TEMPLATE_SET_INFO:
+        
ClusterTemplateManager.getInstance().invalidateTemplateSetInfo(req.getTemplateInfo());
+        break;
+      case ADD_TEMPLATE_PRE_SET_INFO:
         DataNodeSchemaLockManager.getInstance()
             .takeWriteLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
         try {
-          
ClusterTemplateManager.getInstance().addTemplateSetInfo(req.getTemplateInfo());
+          
ClusterTemplateManager.getInstance().addTemplatePreSetInfo(req.getTemplateInfo());
         } finally {
           DataNodeSchemaLockManager.getInstance()
               .releaseWriteLock(SchemaLockType.TIMESERIES_VS_TEMPLATE);
         }
         break;
-      case INVALIDATE_TEMPLATE_SET_INFO:
-        
ClusterTemplateManager.getInstance().invalidateTemplateSetInfo(req.getTemplateInfo());
-        break;
-      case ADD_TEMPLATE_PRE_SET_INFO:
-        
ClusterTemplateManager.getInstance().addTemplatePreSetInfo(req.getTemplateInfo());
-        break;
       case COMMIT_TEMPLATE_SET_INFO:
         
ClusterTemplateManager.getInstance().commitTemplatePreSetInfo(req.getTemplateInfo());
         break;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
index fefba280c4c..cd9fd65cfd9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeVisitor.java
@@ -2570,7 +2570,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     analysis.setStatement(createTimeSeriesStatement);
 
     checkIsTemplateCompatible(
-        createTimeSeriesStatement.getPath(), 
createTimeSeriesStatement.getAlias(), context, true);
+        createTimeSeriesStatement.getPath(), 
createTimeSeriesStatement.getAlias(), context);
 
     PathPatternTree patternTree = new PathPatternTree();
     patternTree.appendFullPath(createTimeSeriesStatement.getPath());
@@ -2582,14 +2582,9 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
   }
 
   private void checkIsTemplateCompatible(
-      final PartialPath timeSeriesPath,
-      final String alias,
-      final MPPQueryContext context,
-      final boolean takeLock) {
-    if (takeLock) {
-      DataNodeSchemaLockManager.getInstance()
-          .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
-    }
+      final PartialPath timeSeriesPath, final String alias, final 
MPPQueryContext context) {
+    DataNodeSchemaLockManager.getInstance()
+        .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
     final Pair<Template, PartialPath> templateInfo =
         schemaFetcher.checkTemplateSetAndPreSetInfo(timeSeriesPath, alias);
     if (templateInfo != null) {
@@ -2603,12 +2598,9 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
       final PartialPath devicePath,
       final List<String> measurements,
       final List<String> aliasList,
-      final MPPQueryContext context,
-      final boolean takeLock) {
-    if (takeLock) {
-      DataNodeSchemaLockManager.getInstance()
-          .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
-    }
+      final MPPQueryContext context) {
+    DataNodeSchemaLockManager.getInstance()
+        .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
     for (int i = 0; i < measurements.size(); i++) {
       final Pair<Template, PartialPath> templateInfo =
           schemaFetcher.checkTemplateSetAndPreSetInfo(
@@ -2677,8 +2669,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         createAlignedTimeSeriesStatement.getDevicePath(),
         createAlignedTimeSeriesStatement.getMeasurements(),
         createAlignedTimeSeriesStatement.getAliasList(),
-        context,
-        true);
+        context);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
     for (String measurement : 
createAlignedTimeSeriesStatement.getMeasurements()) {
@@ -2705,8 +2696,7 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
         internalCreateTimeSeriesStatement.getDevicePath(),
         internalCreateTimeSeriesStatement.getMeasurements(),
         null,
-        context,
-        true);
+        context);
 
     PathPatternTree pathPatternTree = new PathPatternTree();
     for (String measurement : 
internalCreateTimeSeriesStatement.getMeasurements()) {
@@ -2732,12 +2722,10 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     analysis.setStatement(internalCreateMultiTimeSeriesStatement);
 
     final PathPatternTree pathPatternTree = new PathPatternTree();
-    DataNodeSchemaLockManager.getInstance()
-        .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
     for (final Map.Entry<PartialPath, Pair<Boolean, MeasurementGroup>> entry :
         internalCreateMultiTimeSeriesStatement.getDeviceMap().entrySet()) {
       checkIsTemplateCompatible(
-          entry.getKey(), entry.getValue().right.getMeasurements(), null, 
context, false);
+          entry.getKey(), entry.getValue().right.getMeasurements(), null, 
context);
       
pathPatternTree.appendFullPath(entry.getKey().concatNode(ONE_LEVEL_PATH_WILDCARD));
     }
 
@@ -2762,11 +2750,9 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     final List<PartialPath> timeseriesPathList = 
createMultiTimeSeriesStatement.getPaths();
     final List<String> aliasList = 
createMultiTimeSeriesStatement.getAliasList();
 
-    DataNodeSchemaLockManager.getInstance()
-        .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
     for (int i = 0; i < timeseriesPathList.size(); i++) {
       checkIsTemplateCompatible(
-          timeseriesPathList.get(i), aliasList == null ? null : 
aliasList.get(i), context, false);
+          timeseriesPathList.get(i), aliasList == null ? null : 
aliasList.get(i), context);
     }
 
     final PathPatternTree patternTree = new PathPatternTree();
@@ -4103,10 +4089,8 @@ public class AnalyzeVisitor extends 
StatementVisitor<Analysis, MPPQueryContext>
     }
     // Make sure all paths are not under any templates
     try {
-      DataNodeSchemaLockManager.getInstance()
-          .takeReadLock(context, SchemaLockType.TIMESERIES_VS_TEMPLATE);
-      for (PartialPath path : createLogicalViewStatement.getTargetPathList()) {
-        checkIsTemplateCompatible(path, null, context, false);
+      for (final PartialPath path : 
createLogicalViewStatement.getTargetPathList()) {
+        checkIsTemplateCompatible(path, null, context);
       }
     } catch (final Exception e) {
       analysis.setFinishQueryAfterAnalyze(true);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
index c273849e385..ebe730114e2 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/template/TemplateInternalRPCUpdateType.java
@@ -26,7 +26,8 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 
 public enum TemplateInternalRPCUpdateType {
-  ADD_TEMPLATE_SET_INFO((byte) 0),
+  // Deprecated
+  ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO((byte) 0),
   INVALIDATE_TEMPLATE_SET_INFO((byte) 1),
   ADD_TEMPLATE_PRE_SET_INFO((byte) 2),
   COMMIT_TEMPLATE_SET_INFO((byte) 3),
@@ -54,7 +55,7 @@ public enum TemplateInternalRPCUpdateType {
   public static TemplateInternalRPCUpdateType getType(byte type) {
     switch (type) {
       case 0:
-        return ADD_TEMPLATE_SET_INFO;
+        return ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO;
       case 1:
         return INVALIDATE_TEMPLATE_SET_INFO;
       case 2:

Reply via email to