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