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 9030734573 [IOTDB-4511] Fix NPE while deleting timeseries with 
template (#7445)
9030734573 is described below

commit 90307345737aa2e1a2f87fbea0bc63822fb0586c
Author: Marcos_Zyk <[email protected]>
AuthorDate: Tue Sep 27 14:33:09 2022 +0800

    [IOTDB-4511] Fix NPE while deleting timeseries with template (#7445)
    
    [IOTDB-4511] Fix NPE while deleting timeseries with template (#7445)
---
 .../iotdb/db/it/schema/IoTDBSchemaTemplateIT.java  | 56 ++++++++++++++++++++++
 .../db/metadata/mtree/MTreeBelowSGMemoryImpl.java  | 16 +++++++
 .../db/metadata/mtree/traverser/Traverser.java     |  4 ++
 .../schemaregion/SchemaRegionMemoryImpl.java       | 10 ++--
 4 files changed, 80 insertions(+), 6 deletions(-)

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 64136d935f..19216a4228 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
@@ -35,6 +35,7 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -362,4 +363,59 @@ public class IoTDBSchemaTemplateIT {
     statement.execute("CREATE SCHEMA TEMPLATE t1 (s1 INT64, s2 DOUBLE)");
     statement.execute("CREATE SCHEMA TEMPLATE t2 aligned (s1 INT64, s2 
DOUBLE)");
   }
+
+  @Test
+  public void testDeleteTimeSeriesWhenUsingTemplate() throws SQLException {
+    // set schema template
+    statement.execute("SET SCHEMA TEMPLATE t1 TO root.sg1.d1");
+    statement.execute("SET SCHEMA TEMPLATE t2 TO root.sg1.d2");
+
+    statement.execute("CREATE TIMESERIES root.sg3.d1.s1 INT64");
+
+    // set using schema template
+    statement.execute("INSERT INTO root.sg1.d1(time,s1) VALUES (1,1)");
+    statement.execute("INSERT INTO root.sg1.d2(time,s1) ALIGNED VALUES (1,1)");
+    statement.execute("INSERT INTO root.sg3.d1(time,s1) VALUES (1,1)");
+
+    Set<String> expectedResult = new 
HashSet<>(Collections.singletonList("1,1,1,1,"));
+
+    try (ResultSet resultSet = statement.executeQuery("SELECT s1 FROM 
root.**")) {
+      while (resultSet.next()) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 1; i <= 4; i++) {
+          stringBuilder.append(resultSet.getString(i)).append(",");
+        }
+        String actualResult = stringBuilder.toString();
+        Assert.assertTrue(expectedResult.contains(actualResult));
+        expectedResult.remove(actualResult);
+      }
+    }
+    Assert.assertTrue(expectedResult.isEmpty());
+
+    statement.execute("DELETE TIMESERIES root.**.s1");
+
+    expectedResult =
+        new HashSet<>(
+            Arrays.asList("root.sg1.d1.s1,INT64,RLE,SNAPPY", 
"root.sg1.d2.s1,INT64,RLE,SNAPPY"));
+
+    try (ResultSet resultSet = statement.executeQuery("SHOW TIMESERIES 
root.**.s1")) {
+      while (resultSet.next()) {
+        String actualResult =
+            resultSet.getString("timeseries")
+                + ","
+                + resultSet.getString("dataType")
+                + ","
+                + resultSet.getString("encoding")
+                + ","
+                + resultSet.getString("compression");
+        Assert.assertTrue(expectedResult.contains(actualResult));
+        expectedResult.remove(actualResult);
+      }
+    }
+    Assert.assertTrue(expectedResult.isEmpty());
+
+    //    try (ResultSet resultSet = statement.executeQuery("SELECT s1 FROM 
root.**")) {
+    //      Assert.assertFalse(resultSet.next());
+    //    }
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
index 1544d57fd2..e235871255 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/MTreeBelowSGMemoryImpl.java
@@ -464,6 +464,7 @@ public class MTreeBelowSGMemoryImpl implements 
IMTreeBelowSG {
           }
         };
     collector.setResultSet(result);
+    collector.setShouldTraverseTemplate(false);
     collector.traverse();
     return result;
   }
@@ -1077,6 +1078,21 @@ public class MTreeBelowSGMemoryImpl implements 
IMTreeBelowSG {
     return leafMNodes;
   }
 
+  public List<IMeasurementMNode> getMatchedMeasurementMNode(PartialPath 
pathPattern)
+      throws MetadataException {
+    List<IMeasurementMNode> result = new ArrayList<>();
+    MeasurementCollector<List<IMeasurementMNode>> collector =
+        new MeasurementCollector<List<IMeasurementMNode>>(storageGroupMNode, 
pathPattern, store) {
+          @Override
+          protected void collectMeasurement(IMeasurementMNode node) throws 
MetadataException {
+            result.add(node);
+          }
+        };
+    collector.setShouldTraverseTemplate(false);
+    collector.traverse();
+    return result;
+  }
+
   // endregion
 
   // region Interfaces and Implementation for Template check and query
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
index bbf5d292ae..1bc8bf9ffd 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/traverser/Traverser.java
@@ -478,6 +478,10 @@ public abstract class Traverser {
     this.isPrefixMatch = isPrefixMatch;
   }
 
+  public void setShouldTraverseTemplate(boolean shouldTraverseTemplate) {
+    this.shouldTraverseTemplate = shouldTraverseTemplate;
+  }
+
   /**
    * @param currentNode the node need to get the full path of
    * @return full path from traverse start node to the current node
diff --git 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
index 7b9b718640..f56c2cfda3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/metadata/schemaregion/SchemaRegionMemoryImpl.java
@@ -847,15 +847,14 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
   public int constructSchemaBlackList(PathPatternTree patternTree) throws 
MetadataException {
     int preDeletedNum = 0;
     for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
-      for (PartialPath path : mtree.getMeasurementPaths(pathPattern)) {
-        IMeasurementMNode measurementMNode = mtree.getMeasurementMNode(path);
+      for (IMeasurementMNode measurementMNode : 
mtree.getMatchedMeasurementMNode(pathPattern)) {
         // Given pathPatterns may match one timeseries multi times, which may 
results in the
         // preDeletedNum larger than the actual num of timeseries. It doesn't 
matter since the main
         // purpose is to check whether there's timeseries to be deleted.
         preDeletedNum++;
         measurementMNode.setPreDeleted(true);
         try {
-          writeToMLog(new PreDeleteTimeSeriesPlan(path));
+          writeToMLog(new 
PreDeleteTimeSeriesPlan(measurementMNode.getPartialPath()));
         } catch (IOException e) {
           throw new MetadataException(e);
         }
@@ -872,11 +871,10 @@ public class SchemaRegionMemoryImpl implements 
ISchemaRegion {
   @Override
   public void rollbackSchemaBlackList(PathPatternTree patternTree) throws 
MetadataException {
     for (PartialPath pathPattern : patternTree.getAllPathPatterns()) {
-      for (PartialPath path : mtree.getMeasurementPaths(pathPattern)) {
-        IMeasurementMNode measurementMNode = mtree.getMeasurementMNode(path);
+      for (IMeasurementMNode measurementMNode : 
mtree.getMatchedMeasurementMNode(pathPattern)) {
         measurementMNode.setPreDeleted(false);
         try {
-          writeToMLog(new RollbackPreDeleteTimeSeriesPlan(path));
+          writeToMLog(new 
RollbackPreDeleteTimeSeriesPlan(measurementMNode.getPartialPath()));
         } catch (IOException e) {
           throw new MetadataException(e);
         }

Reply via email to