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/03/09 02:04:28 UTC

[iotdb] branch rel/1.1 updated: [To rel/1.1][IOTDB-5240] Fix ConfigMTree snapshot deserialization while using template (#9248)

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

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


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 14900b6970 [To rel/1.1][IOTDB-5240] Fix ConfigMTree snapshot deserialization while using template (#9248)
14900b6970 is described below

commit 14900b69700f4cd1513539a290a6c8238806627b
Author: Marcos_Zyk <38...@users.noreply.github.com>
AuthorDate: Thu Mar 9 10:04:21 2023 +0800

    [To rel/1.1][IOTDB-5240] Fix ConfigMTree snapshot deserialization while using template (#9248)
---
 .../iotdb/db/metadata/mtree/ConfigMTree.java       | 37 ++++++++++++++--------
 .../iotdb/db/metadata/mtree/ConfigMTreeTest.java   |  3 ++
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
index 8c2649018c..1f08e42efb 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mtree/ConfigMTree.java
@@ -636,19 +636,23 @@ public class ConfigMTree {
 
   public void deserialize(InputStream inputStream) throws IOException {
     byte type = ReadWriteIOUtils.readByte(inputStream);
-    if (type != STORAGE_GROUP_MNODE_TYPE) {
-      logger.error("Wrong node type. Cannot deserialize MTreeAboveSG from given buffer");
-      return;
-    }
 
-    StorageGroupMNode storageGroupMNode = deserializeStorageGroupMNode(inputStream);
+    String name = null;
+    int childNum = 0;
+    Stack<Pair<InternalMNode, Boolean>> stack = new Stack<>();
+    StorageGroupMNode storageGroupMNode;
     InternalMNode internalMNode;
 
-    Stack<InternalMNode> stack = new Stack<>();
-    stack.push(storageGroupMNode);
-
-    String name = storageGroupMNode.getName();
-    int childNum = 0;
+    if (type == STORAGE_GROUP_MNODE_TYPE) {
+      storageGroupMNode = deserializeStorageGroupMNode(inputStream);
+      name = storageGroupMNode.getName();
+      stack.push(new Pair<>(storageGroupMNode, true));
+    } else {
+      internalMNode = deserializeInternalMNode(inputStream);
+      childNum = ReadWriteIOUtils.readInt(inputStream);
+      name = internalMNode.getName();
+      stack.push(new Pair<>(internalMNode, false));
+    }
 
     while (!PATH_ROOT.equals(name)) {
       type = ReadWriteIOUtils.readByte(inputStream);
@@ -656,17 +660,22 @@ public class ConfigMTree {
         case INTERNAL_MNODE_TYPE:
           internalMNode = deserializeInternalMNode(inputStream);
           childNum = ReadWriteIOUtils.readInt(inputStream);
+          boolean hasDB = false;
           while (childNum > 0) {
-            internalMNode.addChild(stack.pop());
+            hasDB = stack.peek().right;
+            internalMNode.addChild(stack.pop().left);
             childNum--;
           }
-          stack.push(internalMNode);
+          stack.push(new Pair<>(internalMNode, hasDB));
           name = internalMNode.getName();
           break;
         case STORAGE_GROUP_MNODE_TYPE:
           storageGroupMNode = deserializeStorageGroupMNode(inputStream);
           childNum = 0;
-          stack.push(storageGroupMNode);
+          while (!stack.isEmpty() && !stack.peek().right) {
+            storageGroupMNode.addChild(stack.pop().left);
+          }
+          stack.push(new Pair<>(storageGroupMNode, true));
           name = storageGroupMNode.getName();
           break;
         default:
@@ -674,7 +683,7 @@ public class ConfigMTree {
           return;
       }
     }
-    this.root = stack.peek();
+    this.root = stack.peek().left;
   }
 
   private InternalMNode deserializeInternalMNode(InputStream inputStream) throws IOException {
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
index ee4a8a3689..53bb7e3432 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/mtree/ConfigMTreeTest.java
@@ -261,6 +261,7 @@ public class ConfigMTreeTest {
       storageGroupMNode.setDataReplicationFactor(i);
       storageGroupMNode.setSchemaReplicationFactor(i);
       storageGroupMNode.setTimePartitionInterval(i);
+      root.getNodeWithAutoCreate(pathList[i].concatNode("a")).setSchemaTemplateId(i);
     }
 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
@@ -277,6 +278,8 @@ public class ConfigMTreeTest {
       Assert.assertEquals(i, storageGroupSchema.getSchemaReplicationFactor());
       Assert.assertEquals(i, storageGroupSchema.getDataReplicationFactor());
       Assert.assertEquals(i, storageGroupSchema.getTimePartitionInterval());
+      Assert.assertEquals(
+          i, newTree.getNodeWithAutoCreate(pathList[i].concatNode("a")).getSchemaTemplateId());
     }
 
     Assert.assertEquals(