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