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 960f00ba264 [To dev/1.3] Restore rollback for UnsetTemplateProcedure 
(#15088)
960f00ba264 is described below

commit 960f00ba264044c98faa7589fae9d5c6e0952fef
Author: Caideyipi <[email protected]>
AuthorDate: Mon Mar 24 11:54:00 2025 +0800

    [To dev/1.3] Restore rollback for UnsetTemplateProcedure (#15088)
---
 .../impl/schema/UnsetTemplateProcedure.java        | 74 ++++++++++++++++------
 .../impl/DataNodeInternalRPCServiceImpl.java       |  1 -
 .../template/TemplateInternalRPCUpdateType.java    |  1 -
 3 files changed, 56 insertions(+), 20 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 81405960885..5233bb7206e 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
@@ -144,9 +144,6 @@ public class UnsetTemplateProcedure
 
   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 (final ProcedureException e) {
@@ -217,21 +214,26 @@ public class UnsetTemplateProcedure
     }
     alreadyRollback = true;
     ProcedureException rollbackException;
-    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 {
+      executeRollbackInvalidateCache(env);
+      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()));
+      }
+    } catch (final ProcedureException e) {
+      rollbackException = e;
     }
     try {
       executeInvalidateCache(env);
@@ -244,6 +246,42 @@ 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.ROLLBACK_INVALIDATE_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"));
+      }
+    }
+  }
+
+  private ByteBuffer getAddTemplateSetInfo() {
+    if (this.addTemplateSetInfo == null) {
+      this.addTemplateSetInfo =
+          ByteBuffer.wrap(
+              TemplateInternalRPCUtil.generateAddTemplateSetInfoBytes(
+                  template, path.getFullPath()));
+    }
+
+    return addTemplateSetInfo;
+  }
+
   @Override
   protected boolean isRollbackSupported(final UnsetTemplateState 
unsetTemplateState) {
     return 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 c5e92c754ac..b90efed22ac 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
@@ -1933,7 +1933,6 @@ public class DataNodeInternalRPCServiceImpl implements 
IDataNodeRPCService.Iface
   @Override
   public TSStatus updateTemplate(final TUpdateTemplateReq req) {
     switch (TemplateInternalRPCUpdateType.getType(req.type)) {
-        // Reserved for rolling upgrade
       case ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO:
         
ClusterTemplateManager.getInstance().addTemplateSetInfo(req.getTemplateInfo());
         break;
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 ebe730114e2..77193913044 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,6 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 
 public enum TemplateInternalRPCUpdateType {
-  // Deprecated
   ROLLBACK_INVALIDATE_TEMPLATE_SET_INFO((byte) 0),
   INVALIDATE_TEMPLATE_SET_INFO((byte) 1),
   ADD_TEMPLATE_PRE_SET_INFO((byte) 2),

Reply via email to