You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2023/07/06 09:02:32 UTC

[iotdb] branch rel/1.2 updated: [To rel/1.2] Fix error when deactivating empty template

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

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


The following commit(s) were added to refs/heads/rel/1.2 by this push:
     new f43f767d573 [To rel/1.2] Fix error when deactivating empty template
f43f767d573 is described below

commit f43f767d5732752e46010830d8b589f438d9039a
Author: Chen YZ <43...@users.noreply.github.com>
AuthorDate: Thu Jul 6 17:02:26 2023 +0800

    [To rel/1.2] Fix error when deactivating empty template
---
 .../impl/schema/DeactivateTemplateProcedure.java   | 73 +++++++++++-----------
 .../iotdb/db/it/schema/IoTDBSchemaTemplateIT.java  | 23 +++++++
 2 files changed, 60 insertions(+), 36 deletions(-)

diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
index 9c3f7b6a2f4..bf967b71c83 100644
--- a/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
+++ b/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/schema/DeactivateTemplateProcedure.java
@@ -71,11 +71,11 @@ public class DeactivateTemplateProcedure
   private String queryId;
   private Map<PartialPath, List<Template>> templateSetInfo;
 
-  private transient String requestMessage;
+  private String requestMessage; // transient
   // generate from templateSetInfo by concat pattern and measurement in template
-  private transient PathPatternTree timeSeriesPatternTree;
-  private transient ByteBuffer timeSeriesPatternTreeBytes;
-  private transient Map<String, List<Integer>> dataNodeRequest;
+  private PathPatternTree timeSeriesPatternTree; // transient
+  private ByteBuffer timeSeriesPatternTreeBytes; // transient
+  private Map<String, List<Integer>> dataNodeRequest; // transient
 
   public DeactivateTemplateProcedure() {
     super();
@@ -188,21 +188,26 @@ public class DeactivateTemplateProcedure
   }
 
   private void invalidateCache(ConfigNodeProcedureEnv env) {
-    Map<Integer, TDataNodeLocation> dataNodeLocationMap =
-        env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
-    AsyncClientHandler<TInvalidateMatchedSchemaCacheReq, TSStatus> clientHandler =
-        new AsyncClientHandler<>(
-            DataNodeRequestType.INVALIDATE_MATCHED_SCHEMA_CACHE,
-            new TInvalidateMatchedSchemaCacheReq(timeSeriesPatternTreeBytes),
-            dataNodeLocationMap);
-    AsyncDataNodeClientPool.getInstance().sendAsyncRequestToDataNodeWithRetry(clientHandler);
-    Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
-    for (TSStatus status : statusMap.values()) {
-      // all dataNodes must clear the related schema cache
-      if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
-        LOGGER.error("Failed to invalidate schema cache of template timeseries {}", requestMessage);
-        setFailure(new ProcedureException(new MetadataException("Invalidate schema cache failed")));
-        return;
+    // if no target timeseres, return directly
+    if (!timeSeriesPatternTree.isEmpty()) {
+      Map<Integer, TDataNodeLocation> dataNodeLocationMap =
+          env.getConfigManager().getNodeManager().getRegisteredDataNodeLocations();
+      AsyncClientHandler<TInvalidateMatchedSchemaCacheReq, TSStatus> clientHandler =
+          new AsyncClientHandler<>(
+              DataNodeRequestType.INVALIDATE_MATCHED_SCHEMA_CACHE,
+              new TInvalidateMatchedSchemaCacheReq(timeSeriesPatternTreeBytes),
+              dataNodeLocationMap);
+      AsyncDataNodeClientPool.getInstance().sendAsyncRequestToDataNodeWithRetry(clientHandler);
+      Map<Integer, TSStatus> statusMap = clientHandler.getResponseMap();
+      for (TSStatus status : statusMap.values()) {
+        // all dataNodes must clear the related schema cache
+        if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+          LOGGER.error(
+              "Failed to invalidate schema cache of template timeseries {}", requestMessage);
+          setFailure(
+              new ProcedureException(new MetadataException("Invalidate schema cache failed")));
+          return;
+        }
       }
     }
 
@@ -210,27 +215,23 @@ public class DeactivateTemplateProcedure
   }
 
   private void deleteData(ConfigNodeProcedureEnv env) {
-
     Map<TConsensusGroupId, TRegionReplicaSet> relatedDataRegionGroup =
         env.getConfigManager().getRelatedDataRegionGroup(timeSeriesPatternTree);
 
-    // target timeseries has no data
-    if (relatedDataRegionGroup.isEmpty()) {
-      setNextState(DeactivateTemplateState.DEACTIVATE_TEMPLATE);
-      return;
+    // target timeseries has no data or no target timeseres, return directly
+    if (!relatedDataRegionGroup.isEmpty() && !timeSeriesPatternTree.isEmpty()) {
+      DeactivateTemplateRegionTaskExecutor<TDeleteDataForDeleteSchemaReq> deleteDataTask =
+          new DeactivateTemplateRegionTaskExecutor<>(
+              "delete data",
+              env,
+              relatedDataRegionGroup,
+              true,
+              DataNodeRequestType.DELETE_DATA_FOR_DELETE_SCHEMA,
+              ((dataNodeLocation, consensusGroupIdList) ->
+                  new TDeleteDataForDeleteSchemaReq(
+                      new ArrayList<>(consensusGroupIdList), timeSeriesPatternTreeBytes)));
+      deleteDataTask.execute();
     }
-
-    DeactivateTemplateRegionTaskExecutor<TDeleteDataForDeleteSchemaReq> deleteDataTask =
-        new DeactivateTemplateRegionTaskExecutor<>(
-            "delete data",
-            env,
-            relatedDataRegionGroup,
-            true,
-            DataNodeRequestType.DELETE_DATA_FOR_DELETE_SCHEMA,
-            ((dataNodeLocation, consensusGroupIdList) ->
-                new TDeleteDataForDeleteSchemaReq(
-                    new ArrayList<>(consensusGroupIdList), timeSeriesPatternTreeBytes)));
-    deleteDataTask.execute();
     setNextState(DeactivateTemplateState.DEACTIVATE_TEMPLATE);
   }
 
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
index c4b0c199ba3..4037a4d696f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/schema/IoTDBSchemaTemplateIT.java
@@ -828,4 +828,27 @@ public class IoTDBSchemaTemplateIT extends AbstractSchemaIT {
       }
     }
   }
+
+  @Test
+  public void testActivateAndDropEmptyTemplate() throws Exception {
+    try (Connection connection = EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.execute("CREATE SCHEMA TEMPLATE e_t;");
+      statement.execute("SET SCHEMA TEMPLATE e_t TO root.sg1.t.d1;");
+      statement.execute("insert into root.sg1.t.d2(timestamp,s1) values(now(),false);");
+      statement.execute("CREATE TIMESERIES OF SCHEMA TEMPLATE ON root.sg1.t.d1;");
+      try (ResultSet resultSet = statement.executeQuery("show nodes in schema template e_t")) {
+        Assert.assertFalse(resultSet.next());
+      }
+      try (ResultSet resultSet = statement.executeQuery("show paths set schema template e_t")) {
+        Assert.assertTrue(resultSet.next());
+        Assert.assertFalse(resultSet.next());
+      }
+      statement.execute("DEACTIVATE SCHEMA TEMPLATE FROM root.sg1.t.d1;");
+      statement.execute("UNSET SCHEMA TEMPLATE e_t FROM root.sg1.t.d1;");
+      try (ResultSet resultSet = statement.executeQuery("show paths set schema template e_t")) {
+        Assert.assertFalse(resultSet.next());
+      }
+    }
+  }
 }