You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by zy...@apache.org on 2023/02/01 06:22:12 UTC
[iotdb] branch master updated: [IOTDB-5441] Fix NPE while fetch schema that is not in template used by related device (#8951)
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 2fc195c3a8 [IOTDB-5441] Fix NPE while fetch schema that is not in template used by related device (#8951)
2fc195c3a8 is described below
commit 2fc195c3a8f0a0516122c501ddf5d83cc976c144
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Wed Feb 1 14:22:07 2023 +0800
[IOTDB-5441] Fix NPE while fetch schema that is not in template used by related device (#8951)
---
.../iotdb/db/it/schema/IoTDBSchemaTemplateIT.java | 20 ++++++++++++++++++++
.../iotdb/db/metadata/mtree/traverser/Traverser.java | 17 +++++++++++++++--
2 files changed, 35 insertions(+), 2 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 99960f4781..c29b707022 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
@@ -486,6 +486,26 @@ public class IoTDBSchemaTemplateIT {
Assert.assertTrue(expectedResult.isEmpty());
}
+ @Test
+ public void testInsertDataWithMeasurementsBeyondTemplate() throws Exception {
+ // set schema template
+ statement.execute("SET SCHEMA TEMPLATE t1 TO root.sg1.d1");
+ // insert data and auto activate schema template
+ statement.execute("INSERT INTO root.sg1.d1(time,s1,s2) VALUES (1,1,1)");
+ // insert twice to make sure the timeseries in template has been cached
+ statement.execute("INSERT INTO root.sg1.d1(time,s1,s2) VALUES (2,1,1)");
+
+ // insert data with extra measurement s3 which should be checked by schema fetch and auto
+ // created
+ statement.execute("INSERT INTO root.sg1.d1(time,s1,s2,s3) VALUES (2,1,1,1)");
+
+ try (ResultSet resultSet = statement.executeQuery("count timeseries")) {
+ Assert.assertTrue(resultSet.next());
+ long resultRecord = resultSet.getLong(1);
+ Assert.assertEquals(3, resultRecord);
+ }
+ }
+
@Test
public void testUnsetTemplate() throws SQLException {
// set schema template
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 f05a7b930f..426d4d70ef 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
@@ -29,6 +29,9 @@ import org.apache.iotdb.db.metadata.mtree.store.IMTreeStore;
import org.apache.iotdb.db.metadata.mtree.store.ReentrantReadOnlyCachedMTreeStore;
import org.apache.iotdb.db.metadata.template.Template;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.Iterator;
import java.util.Map;
@@ -47,6 +50,8 @@ import static org.apache.iotdb.db.metadata.MetadataConstant.NON_TEMPLATE;
*/
public abstract class Traverser<R> extends AbstractTreeVisitor<IMNode, R> {
+ private static final Logger logger = LoggerFactory.getLogger(Traverser.class);
+
protected IMTreeStore store;
protected IMNode startNode;
@@ -96,6 +101,7 @@ public abstract class Traverser<R> extends AbstractTreeVisitor<IMNode, R> {
}
if (!isSuccess()) {
Throwable e = getFailure();
+ logger.warn(e.getMessage(), e);
throw new MetadataException(e.getMessage(), e);
}
}
@@ -106,8 +112,15 @@ public abstract class Traverser<R> extends AbstractTreeVisitor<IMNode, R> {
if (parent.isAboveDatabase()) {
child = parent.getChild(childName);
} else {
- if (parent.getSchemaTemplateId() != NON_TEMPLATE) {
- if (!skipPreDeletedSchema || !parent.getAsEntityMNode().isPreDeactivateTemplate()) {
+ if (parent.getSchemaTemplateId() != NON_TEMPLATE // the device is using template
+ && !(skipPreDeletedSchema
+ && parent
+ .getAsEntityMNode()
+ .isPreDeactivateTemplate())) { // the template should not skip
+ Template template = templateMap.get(parent.getSchemaTemplateId());
+ // if null, it means the template on this device is not covered in this query, refer to the
+ // mpp analyzing stage
+ if (template != null) {
child = templateMap.get(parent.getSchemaTemplateId()).getDirectNode(childName);
}
}