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 788b0bc9523 Refactor Device Node Implementation in SchemaRegion 
(#11661)
788b0bc9523 is described below

commit 788b0bc95238c3eb33c7ccfc93062fd632ed4c7c
Author: Marcos_Zyk <[email protected]>
AuthorDate: Wed Dec 6 22:26:08 2023 +0800

    Refactor Device Node Implementation in SchemaRegion (#11661)
---
 .../confignode/persistence/schema/ConfigMTree.java |   2 +-
 .../persistence/schema/mnode/IConfigMNode.java     |  28 ++
 .../schema/mnode/basic/ConfigBasicMNode.java       |  50 +---
 .../mnode/impl/ConfigBasicInternalMNode.java       |  37 +--
 .../mtree/impl/mem/MTreeBelowSGMemoryImpl.java     |  28 +-
 .../schemaregion/mtree/impl/mem/MemMTreeStore.java |  23 +-
 .../mtree/impl/mem/mnode/basic/BasicMNode.java     |  26 +-
 .../impl/mem/mnode/factory/MemMNodeFactory.java    |  11 +-
 .../impl/mem/mnode/impl/BasicInternalMNode.java    |  83 +++---
 .../impl/mem/mnode/impl/DatabaseDeviceMNode.java   |  37 ---
 .../mtree/impl/mem/mnode/impl/DatabaseMNode.java   |  17 +-
 .../mtree/impl/mem/mnode/info/LogicalViewInfo.java |   2 +-
 .../impl/mem/snapshot/MemMTreeSnapshotUtil.java    |  75 +++---
 .../mtree/impl/pbtree/CachedMTreeStore.java        |  43 ++-
 .../mtree/impl/pbtree/MTreeBelowSGCachedImpl.java  |  28 +-
 .../impl/pbtree/mnode/basic/CachedBasicMNode.java  |  25 +-
 .../pbtree/mnode/factory/CacheMNodeFactory.java    |  11 +-
 .../mnode/impl/CachedBasicInternalMNode.java       |  91 ++++---
 .../mnode/impl/CachedDatabaseDeviceMNode.java      |  49 ----
 .../pbtree/mnode/impl/CachedDatabaseMNode.java     |  18 +-
 .../impl/pbtree/mnode/impl/CachedDeviceMNode.java  |  48 ----
 .../schemaregion/utils/MNodeUtils.java             |  54 +---
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |  31 +--
 .../metadata/mtree/schemafile/SchemaFileTest.java  |   2 +-
 .../apache/iotdb/commons/schema/node/IMNode.java   |  12 +-
 .../node/common/AbstractAboveDatabaseMNode.java    |  18 +-
 .../node/common/AbstractDatabaseDeviceMNode.java   | 299 ---------------------
 .../schema/node/common/AbstractDatabaseMNode.java  |  26 +-
 .../node/common/AbstractMeasurementMNode.java      |  19 +-
 ...actDeviceMNode.java => DeviceMNodeWrapper.java} | 130 ++++-----
 .../commons/schema/node/role/IDeviceMNode.java     |   2 +-
 .../commons/schema/node/role/IInternalMNode.java}  |  37 ++-
 .../commons/schema/node/visitor/MNodeVisitor.java  |   7 -
 33 files changed, 377 insertions(+), 992 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
index 72dae94e440..9f4a226daca 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
@@ -427,7 +427,7 @@ public class ConfigMTree {
             result.add(
                 new TSchemaNode(
                     getPartialPathFromRootToNode(node).getFullPath(),
-                    node.getMNodeType(true).getNodeType()));
+                    node.getMNodeType().getNodeType()));
             return null;
           }
         }) {
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/IConfigMNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/IConfigMNode.java
index 5337bd60218..805c270ec46 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/IConfigMNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/IConfigMNode.java
@@ -19,6 +19,9 @@
 package org.apache.iotdb.confignode.persistence.schema.mnode;
 
 import org.apache.iotdb.commons.schema.node.IMNode;
+import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
+import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
 
 public interface IConfigMNode extends IMNode<IConfigMNode> {
@@ -42,4 +45,29 @@ public interface IConfigMNode extends IMNode<IConfigMNode> {
   default TDatabaseSchema getDatabaseSchema() {
     throw new UnsupportedOperationException();
   }
+
+  @Override
+  default boolean isDevice() {
+    return false;
+  }
+
+  @Override
+  default boolean isMeasurement() {
+    return false;
+  }
+
+  @Override
+  default IInternalMNode<IConfigMNode> getAsInternalMNode() {
+    throw new UnsupportedOperationException("Wrong node type");
+  }
+
+  @Override
+  default IDeviceMNode<IConfigMNode> getAsDeviceMNode() {
+    throw new UnsupportedOperationException("Wrong node type");
+  }
+
+  @Override
+  default IMeasurementMNode<IConfigMNode> getAsMeasurementMNode() {
+    throw new UnsupportedOperationException("Wrong node type");
+  }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/basic/ConfigBasicMNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/basic/ConfigBasicMNode.java
index 6686227709a..47575892790 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/basic/ConfigBasicMNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/basic/ConfigBasicMNode.java
@@ -20,10 +20,7 @@ package 
org.apache.iotdb.confignode.persistence.schema.mnode.basic;
 
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
-import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
-import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
 import org.apache.iotdb.confignode.persistence.schema.mnode.IConfigMNode;
@@ -33,7 +30,7 @@ import 
org.apache.iotdb.confignode.persistence.schema.mnode.info.ConfigMNodeInfo
 import java.util.ArrayList;
 import java.util.List;
 
-public class ConfigBasicMNode implements IConfigMNode {
+public abstract class ConfigBasicMNode implements IConfigMNode {
 
   private static final long serialVersionUID = -770028375899514063L;
 
@@ -150,21 +147,6 @@ public class ConfigBasicMNode implements IConfigMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
-  @Override
-  public synchronized void replaceChild(String oldChildName, IConfigMNode 
newChildNode) {}
-
-  @Override
-  public void moveDataToNewMNode(IConfigMNode newMNode) {
-    newMNode.setParent(parent);
-    
newMNode.setSchemaTemplateId(configMNodeInfo.getSchemaTemplateIdWithState());
-  }
-
   @Override
   public IMNodeContainer<IConfigMNode> getChildren() {
     return ConfigMNodeContainer.emptyMNodeContainer();
@@ -183,36 +165,11 @@ public class ConfigBasicMNode implements IConfigMNode {
     return false;
   }
 
-  @Override
-  public boolean isDevice() {
-    return false;
-  }
-
-  @Override
-  public boolean isMeasurement() {
-    return false;
-  }
-
-  @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
-    return isConfig ? MNodeType.SG_INTERNAL : MNodeType.INTERNAL;
-  }
-
   @Override
   public IDatabaseMNode<IConfigMNode> getAsDatabaseMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
   }
 
-  @Override
-  public IDeviceMNode<IConfigMNode> getAsDeviceMNode() {
-    throw new UnsupportedOperationException("Wrong MNode Type");
-  }
-
-  @Override
-  public IMeasurementMNode<IConfigMNode> getAsMeasurementMNode() {
-    throw new UnsupportedOperationException("Wrong MNode Type");
-  }
-
   @Override
   public <R, C> R accept(MNodeVisitor<R, C> visitor, C context) {
     return visitor.visitBasicMNode(this, context);
@@ -271,9 +228,4 @@ public class ConfigBasicMNode implements IConfigMNode {
   public int estimateSize() {
     return 8 + 8 + 8 + 8 + 8 + 8 + 28 + configMNodeInfo.estimateSize();
   }
-
-  @Override
-  public IConfigMNode getAsMNode() {
-    return this;
-  }
 }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigBasicInternalMNode.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigBasicInternalMNode.java
index 293c4388ce6..b61d5570a60 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigBasicInternalMNode.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/mnode/impl/ConfigBasicInternalMNode.java
@@ -18,6 +18,7 @@
  */
 package org.apache.iotdb.confignode.persistence.schema.mnode.impl;
 
+import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.confignode.persistence.schema.mnode.IConfigMNode;
 import 
org.apache.iotdb.confignode.persistence.schema.mnode.basic.ConfigBasicMNode;
@@ -124,37 +125,6 @@ public class ConfigBasicInternalMNode extends 
ConfigBasicMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
-  @Override
-  public synchronized void replaceChild(String oldChildName, IConfigMNode 
newChildNode) {
-    if (!oldChildName.equals(newChildNode.getName())) {
-      throw new RuntimeException("New child's name must be the same as old 
child's name!");
-    }
-    IConfigMNode oldChildNode = this.getChild(oldChildName);
-    if (oldChildNode == null) {
-      return;
-    }
-
-    oldChildNode.moveDataToNewMNode(newChildNode);
-
-    children.replace(newChildNode.getName(), newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(IConfigMNode newMNode) {
-    super.moveDataToNewMNode(newMNode);
-
-    if (children != null) {
-      newMNode.setChildren(children);
-      children.forEach((childName, childNode) -> 
childNode.setParent(newMNode));
-    }
-  }
-
   @Override
   public IMNodeContainer<IConfigMNode> getChildren() {
     if (children == null) {
@@ -174,6 +144,11 @@ public class ConfigBasicInternalMNode extends 
ConfigBasicMNode {
     return 8 + 80 + super.estimateSize();
   }
 
+  @Override
+  public MNodeType getMNodeType() {
+    return MNodeType.SG_INTERNAL;
+  }
+
   @Override
   public IConfigMNode getAsMNode() {
     return this;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
index 3dbd8bf2dcd..ffb8cf41052 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MTreeBelowSGMemoryImpl.java
@@ -25,7 +25,6 @@ import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.SchemaConstant;
-import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
@@ -158,13 +157,6 @@ public class MTreeBelowSGMemoryImpl {
     storageGroupMNode = null;
   }
 
-  protected void replaceStorageGroupMNode(IDatabaseMNode<IMemMNode> newMNode) {
-    this.storageGroupMNode
-        .getParent()
-        .replaceChild(this.storageGroupMNode.getName(), newMNode.getAsMNode());
-    this.storageGroupMNode = newMNode.getAsMNode();
-  }
-
   public synchronized boolean createSnapshot(File snapshotDir) {
     return store.createSnapshot(snapshotDir);
   }
@@ -256,9 +248,6 @@ public class MTreeBelowSGMemoryImpl {
         entityMNode = device.getAsDeviceMNode();
       } else {
         entityMNode = store.setToEntity(device);
-        if (entityMNode.isDatabase()) {
-          replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-        }
       }
 
       // create a non-aligned timeseries
@@ -344,9 +333,6 @@ public class MTreeBelowSGMemoryImpl {
       } else {
         entityMNode = store.setToEntity(device);
         entityMNode.setAligned(true);
-        if (entityMNode.isDatabase()) {
-          replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-        }
       }
 
       // create a aligned timeseries
@@ -547,9 +533,6 @@ public class MTreeBelowSGMemoryImpl {
       if (!hasMeasurement) {
         synchronized (this) {
           curNode = store.setToInternal(entityMNode);
-          if (curNode.isDatabase()) {
-            replaceStorageGroupMNode(curNode.getAsDatabaseMNode());
-          }
         }
       } else if (!hasNonViewMeasurement) {
         // has some measurement but they are all logical view
@@ -828,9 +811,6 @@ public class MTreeBelowSGMemoryImpl {
         entityMNode = cur.getAsDeviceMNode();
       } else {
         entityMNode = store.setToEntity(cur);
-        if (entityMNode.isDatabase()) {
-          replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-        }
       }
     }
 
@@ -933,9 +913,6 @@ public class MTreeBelowSGMemoryImpl {
       entityMNode = cur.getAsDeviceMNode();
     } else {
       entityMNode = store.setToEntity(cur);
-      if (entityMNode.isDatabase()) {
-        replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-      }
     }
 
     if (!entityMNode.isAligned()) {
@@ -1117,7 +1094,7 @@ public class MTreeBelowSGMemoryImpl {
 
           protected INodeSchemaInfo collectMNode(IMemMNode node) {
             return new ShowNodesResult(
-                getPartialPathFromRootToNode(node).getFullPath(), 
node.getMNodeType(false));
+                getPartialPathFromRootToNode(node).getFullPath(), 
node.getMNodeType());
           }
         };
     collector.setTargetLevel(showNodesPlan.getLevel());
@@ -1194,9 +1171,6 @@ public class MTreeBelowSGMemoryImpl {
         entityMNode = device.getAsDeviceMNode();
       } else {
         entityMNode = store.setToEntity(device);
-        if (entityMNode.isDatabase()) {
-          replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-        }
         // this parent has no measurement before. The leafName is his first 
child who is a logical
         // view.
         entityMNode.setAligned(null);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MemMTreeStore.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MemMTreeStore.java
index d5df95c4d5f..2eab7c65563 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MemMTreeStore.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/MemMTreeStore.java
@@ -139,29 +139,24 @@ public class MemMTreeStore implements 
IMTreeStore<IMemMNode> {
 
   @Override
   public IDeviceMNode<IMemMNode> setToEntity(IMemMNode node) {
-    IDeviceMNode<IMemMNode> result = MNodeUtils.setToEntity(node, nodeFactory);
-    if (result != node) {
+    int rawSize = node.estimateSize();
+    if (MNodeUtils.setToEntity(node)) {
       regionStatistics.addDevice();
-      requestMemory(result.estimateSize() - node.estimateSize());
+      requestMemory(node.estimateSize() - rawSize);
     }
 
-    if (result.isDatabase()) {
-      root = result.getAsMNode();
-    }
-    return result;
+    return node.getAsDeviceMNode();
   }
 
   @Override
   public IMemMNode setToInternal(IDeviceMNode<IMemMNode> entityMNode) {
-    IMemMNode result = MNodeUtils.setToInternal(entityMNode, nodeFactory);
-    if (result != entityMNode) {
+    int rawSize = entityMNode.estimateSize();
+    if (MNodeUtils.setToInternal(entityMNode)) {
       regionStatistics.deleteDevice();
-      releaseMemory(entityMNode.estimateSize() - result.estimateSize());
-    }
-    if (result.isDatabase()) {
-      root = result;
+      releaseMemory(rawSize - entityMNode.estimateSize());
     }
-    return result;
+
+    return entityMNode.getAsMNode();
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/basic/BasicMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/basic/BasicMNode.java
index 7e4f5cd074f..ccacef6c7eb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/basic/BasicMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/basic/BasicMNode.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -155,22 +156,6 @@ public class BasicMNode implements IMemMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
-  @Override
-  public synchronized void replaceChild(String oldChildName, IMemMNode 
newChildNode) {
-    // Do nothing
-  }
-
-  @Override
-  public void moveDataToNewMNode(IMemMNode newMNode) {
-    newMNode.setParent(parent);
-  }
-
   @Override
   public IMNodeContainer<IMemMNode> getChildren() {
     return MemMNodeContainer.emptyMNodeContainer();
@@ -200,8 +185,8 @@ public class BasicMNode implements IMemMNode {
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
-    return isConfig ? MNodeType.SG_INTERNAL : MNodeType.INTERNAL;
+  public MNodeType getMNodeType() {
+    return MNodeType.UNIMPLEMENT;
   }
 
   @Override
@@ -214,6 +199,11 @@ public class BasicMNode implements IMemMNode {
     throw new UnsupportedOperationException("Wrong MNode Type");
   }
 
+  @Override
+  public IInternalMNode<IMemMNode> getAsInternalMNode() {
+    throw new UnsupportedOperationException("Wrong MNode Type");
+  }
+
   @Override
   public IMeasurementMNode<IMemMNode> getAsMeasurementMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/factory/MemMNodeFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/factory/MemMNodeFactory.java
index 05c3e403506..186fa3c2f40 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/factory/MemMNodeFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/factory/MemMNodeFactory.java
@@ -26,10 +26,9 @@ import 
org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.AboveDatabaseMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.BasicInternalMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.DatabaseDeviceMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.DatabaseMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.DeviceMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl.MeasurementMNode;
+import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DeviceInfo;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
 @MNodeFactory
@@ -43,7 +42,9 @@ public class MemMNodeFactory implements 
IMNodeFactory<IMemMNode> {
 
   @Override
   public IDeviceMNode<IMemMNode> createDeviceMNode(IMemMNode parent, String 
name) {
-    return new DeviceMNode(parent, name);
+    BasicInternalMNode internalMNode = new BasicInternalMNode(parent, name);
+    internalMNode.setDeviceInfo(new DeviceInfo<>());
+    return internalMNode.getAsDeviceMNode();
   }
 
   @Override
@@ -59,7 +60,9 @@ public class MemMNodeFactory implements 
IMNodeFactory<IMemMNode> {
 
   @Override
   public IMemMNode createDatabaseDeviceMNode(IMemMNode parent, String name, 
long dataTTL) {
-    return new DatabaseDeviceMNode(parent, name, dataTTL);
+    DatabaseMNode databaseMNode = new DatabaseMNode(parent, name, dataTTL);
+    databaseMNode.setDeviceInfo(new DeviceInfo<>());
+    return databaseMNode.getAsMNode();
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/BasicInternalMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/BasicInternalMNode.java
index 0b748818e68..904a0a5b5ba 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/BasicInternalMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/BasicInternalMNode.java
@@ -19,6 +19,11 @@
 
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl;
 
+import org.apache.iotdb.commons.schema.node.MNodeType;
+import org.apache.iotdb.commons.schema.node.common.DeviceMNodeWrapper;
+import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
+import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.basic.BasicMNode;
@@ -28,7 +33,7 @@ import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.contai
  * This class is the implementation of Metadata Node. One MNode instance 
represents one node in the
  * Metadata Tree
  */
-public class BasicInternalMNode extends BasicMNode {
+public class BasicInternalMNode extends BasicMNode implements 
IInternalMNode<IMemMNode> {
 
   /**
    * Suppress warnings reason: volatile for double synchronized check.
@@ -38,6 +43,9 @@ public class BasicInternalMNode extends BasicMNode {
   @SuppressWarnings("squid:S3077")
   private transient volatile IMNodeContainer<IMemMNode> children = null;
 
+  @SuppressWarnings("squid:S3077")
+  private volatile IDeviceInfo<IMemMNode> deviceInfo = null;
+
   /** Constructor of MNode. */
   public BasicInternalMNode(IMemMNode parent, String name) {
     super(parent, name);
@@ -46,7 +54,11 @@ public class BasicInternalMNode extends BasicMNode {
   /** Check whether the MNode has a child with the name. */
   @Override
   public boolean hasChild(String name) {
-    return (children != null && children.containsKey(name));
+    return (children != null && children.containsKey(name)) || 
hasChildInDeviceInfo(name);
+  }
+
+  private boolean hasChildInDeviceInfo(String name) {
+    return deviceInfo != null && deviceInfo.hasAliasChild(name);
   }
 
   /** Get the child with the name. */
@@ -56,6 +68,9 @@ public class BasicInternalMNode extends BasicMNode {
     if (children != null) {
       child = children.get(name);
     }
+    if (child == null && deviceInfo != null) {
+      child = deviceInfo.getAliasChild(name);
+    }
     return child;
   }
 
@@ -125,58 +140,56 @@ public class BasicInternalMNode extends BasicMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
   @Override
-  public synchronized void replaceChild(String oldChildName, IMemMNode 
newChildNode) {
-    if (!oldChildName.equals(newChildNode.getName())) {
-      throw new RuntimeException("New child's name must be the same as old 
child's name!");
-    }
-    IMemMNode oldChildNode = this.getChild(oldChildName);
-    if (oldChildNode == null) {
-      return;
+  public IMNodeContainer<IMemMNode> getChildren() {
+    if (children == null) {
+      return MemMNodeContainer.emptyMNodeContainer();
     }
+    return children;
+  }
 
-    oldChildNode.moveDataToNewMNode(newChildNode);
+  @Override
+  public void setChildren(IMNodeContainer<IMemMNode> children) {
+    this.children = children;
+  }
 
-    children.replace(newChildNode.getName(), newChildNode);
+  /** MNodeContainer reference and basic occupation, 8 + 80B. DeviceInfo 
reference and size. */
+  @Override
+  public int estimateSize() {
+    return 8 + 80 + super.estimateSize() + 8 + (deviceInfo == null ? 0 : 
deviceInfo.estimateSize());
   }
 
   @Override
-  public void moveDataToNewMNode(IMemMNode newMNode) {
-    super.moveDataToNewMNode(newMNode);
+  public MNodeType getMNodeType() {
+    return deviceInfo == null ? MNodeType.INTERNAL : MNodeType.DEVICE;
+  }
 
-    if (children != null) {
-      newMNode.setChildren(children);
-      children.forEach((childName, childNode) -> 
childNode.setParent(newMNode));
-    }
+  @Override
+  public boolean isDevice() {
+    return getDeviceInfo() != null;
   }
 
   @Override
-  public IMNodeContainer<IMemMNode> getChildren() {
-    if (children == null) {
-      return MemMNodeContainer.emptyMNodeContainer();
-    }
-    return children;
+  public IInternalMNode<IMemMNode> getAsInternalMNode() {
+    return this;
   }
 
   @Override
-  public void setChildren(IMNodeContainer<IMemMNode> children) {
-    this.children = children;
+  public IDeviceMNode<IMemMNode> getAsDeviceMNode() {
+    if (isDevice()) {
+      return new DeviceMNodeWrapper<>(this);
+    } else {
+      throw new UnsupportedOperationException("Wrong node type");
+    }
   }
 
-  /** MNodeContainer reference and basic occupation, 8 + 80B. */
   @Override
-  public int estimateSize() {
-    return 8 + 80 + super.estimateSize();
+  public IDeviceInfo<IMemMNode> getDeviceInfo() {
+    return deviceInfo;
   }
 
   @Override
-  public IMemMNode getAsMNode() {
-    return this;
+  public void setDeviceInfo(IDeviceInfo<IMemMNode> deviceInfo) {
+    this.deviceInfo = deviceInfo;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseDeviceMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseDeviceMNode.java
deleted file mode 100644
index d5c4fd39ebe..00000000000
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseDeviceMNode.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl;
-
-import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseDeviceMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.basic.BasicMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DatabaseDeviceInfo;
-
-public class DatabaseDeviceMNode extends 
AbstractDatabaseDeviceMNode<IMemMNode, BasicMNode>
-    implements IMemMNode {
-  public DatabaseDeviceMNode(IMemMNode parent, String name, long dataTTL) {
-    super(new BasicInternalMNode(parent, name), new DatabaseDeviceInfo<>());
-    setDataTTL(dataTTL);
-  }
-
-  @Override
-  public IMemMNode getAsMNode() {
-    return this;
-  }
-}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseMNode.java
index bb35ca97707..84a505f9725 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DatabaseMNode.java
@@ -19,12 +19,13 @@
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl;
 
 import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseMNode;
+import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.basic.BasicMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DatabaseInfo;
 
-public class DatabaseMNode extends AbstractDatabaseMNode<IMemMNode, BasicMNode>
-    implements IMemMNode {
+public class DatabaseMNode extends AbstractDatabaseMNode<IMemMNode, 
BasicInternalMNode>
+    implements IMemMNode, IInternalMNode<IMemMNode> {
 
   public DatabaseMNode(IMemMNode parent, String name) {
     super(new BasicInternalMNode(parent, name), new DatabaseInfo<>());
@@ -40,4 +41,14 @@ public class DatabaseMNode extends 
AbstractDatabaseMNode<IMemMNode, BasicMNode>
   public IMemMNode getAsMNode() {
     return this;
   }
+
+  @Override
+  public IDeviceInfo<IMemMNode> getDeviceInfo() {
+    return basicMNode.getDeviceInfo();
+  }
+
+  @Override
+  public void setDeviceInfo(IDeviceInfo<IMemMNode> deviceInfo) {
+    basicMNode.setDeviceInfo(deviceInfo);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/info/LogicalViewInfo.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/info/LogicalViewInfo.java
index 972e4ffcfad..b6aa2b4c941 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/info/LogicalViewInfo.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/info/LogicalViewInfo.java
@@ -158,7 +158,7 @@ public class LogicalViewInfo implements IMeasurementInfo {
     throw new SchemaExecutionException(
         new IllegalArgumentException(
             "Type of newMNode is not LogicalViewMNode! It's "
-                + newMNode.getMNodeType(false).toString()));
+                + newMNode.getMNodeType().toString()));
   }
   // endregion
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/snapshot/MemMTreeSnapshotUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/snapshot/MemMTreeSnapshotUtil.java
index 7b337246e7e..31d10e6523c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/snapshot/MemMTreeSnapshotUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/snapshot/MemMTreeSnapshotUtil.java
@@ -22,9 +22,7 @@ package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.snapshot;
 import org.apache.iotdb.commons.file.SystemFileFactory;
 import org.apache.iotdb.commons.schema.SchemaConstant;
 import org.apache.iotdb.commons.schema.node.IMNode;
-import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseDeviceMNode;
 import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseMNode;
-import org.apache.iotdb.commons.schema.node.common.AbstractDeviceMNode;
 import org.apache.iotdb.commons.schema.node.common.AbstractMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
@@ -281,10 +279,19 @@ public class MemMTreeSnapshotUtil {
     @Override
     public Boolean visitBasicMNode(IMNode<?> node, OutputStream outputStream) {
       try {
-        ReadWriteIOUtils.write(INTERNAL_MNODE_TYPE, outputStream);
-        serializeBasicMNode(node, outputStream);
-        ReadWriteIOUtils.write(0, outputStream); // for compatibly
-        ReadWriteIOUtils.write(false, outputStream); // for compatibly
+        if (node.isDevice()) {
+          ReadWriteIOUtils.write(ENTITY_MNODE_TYPE, outputStream);
+          serializeBasicMNode(node, outputStream);
+          IDeviceMNode<?> deviceMNode = node.getAsDeviceMNode();
+          ReadWriteIOUtils.write(deviceMNode.getSchemaTemplateIdWithState(), 
outputStream);
+          ReadWriteIOUtils.write(deviceMNode.isUseTemplate(), outputStream);
+          ReadWriteIOUtils.write(deviceMNode.isAlignedNullable(), 
outputStream);
+        } else {
+          ReadWriteIOUtils.write(INTERNAL_MNODE_TYPE, outputStream);
+          serializeBasicMNode(node, outputStream);
+          ReadWriteIOUtils.write(0, outputStream); // for compatibly
+          ReadWriteIOUtils.write(false, outputStream); // for compatibly
+        }
         return true;
       } catch (IOException e) {
         logger.error(SERIALIZE_ERROR_INFO, e);
@@ -296,45 +303,23 @@ public class MemMTreeSnapshotUtil {
     public Boolean visitDatabaseMNode(
         AbstractDatabaseMNode<?, ? extends IMNode<?>> node, OutputStream 
outputStream) {
       try {
-        ReadWriteIOUtils.write(STORAGE_GROUP_MNODE_TYPE, outputStream);
-        serializeBasicMNode(node.getBasicMNode(), outputStream);
-        ReadWriteIOUtils.write(0, outputStream); // for compatibly
-        ReadWriteIOUtils.write(false, outputStream); // for compatibly
-        // database node in schemaRegion doesn't store any database schema
-        return true;
-      } catch (IOException e) {
-        logger.error(SERIALIZE_ERROR_INFO, e);
-        return false;
-      }
-    }
-
-    @Override
-    public Boolean visitDatabaseDeviceMNode(
-        AbstractDatabaseDeviceMNode<?, ? extends IMNode<?>> node, OutputStream 
outputStream) {
-      try {
-        ReadWriteIOUtils.write(STORAGE_GROUP_ENTITY_MNODE_TYPE, outputStream);
-        serializeBasicMNode(node.getBasicMNode(), outputStream);
-        ReadWriteIOUtils.write(node.getSchemaTemplateIdWithState(), 
outputStream);
-        ReadWriteIOUtils.write(node.isUseTemplate(), outputStream);
-        ReadWriteIOUtils.write(node.isAlignedNullable(), outputStream);
-        // database node in schemaRegion doesn't store any database schema
-        return true;
-      } catch (IOException e) {
-        logger.error(SERIALIZE_ERROR_INFO, e);
-        return false;
-      }
-    }
-
-    @Override
-    public Boolean visitDeviceMNode(
-        AbstractDeviceMNode<?, ? extends IMNode<?>> node, OutputStream 
outputStream) {
-      try {
-        ReadWriteIOUtils.write(ENTITY_MNODE_TYPE, outputStream);
-        serializeBasicMNode(node.getBasicMNode(), outputStream);
-        ReadWriteIOUtils.write(node.getSchemaTemplateIdWithState(), 
outputStream);
-        ReadWriteIOUtils.write(node.isUseTemplate(), outputStream);
-        ReadWriteIOUtils.write(node.isAlignedNullable(), outputStream);
-        return true;
+        if (node.isDevice()) {
+          ReadWriteIOUtils.write(STORAGE_GROUP_ENTITY_MNODE_TYPE, 
outputStream);
+          serializeBasicMNode(node.getBasicMNode(), outputStream);
+          IDeviceMNode<?> deviceMNode = node.getAsDeviceMNode();
+          ReadWriteIOUtils.write(deviceMNode.getSchemaTemplateIdWithState(), 
outputStream);
+          ReadWriteIOUtils.write(deviceMNode.isUseTemplate(), outputStream);
+          ReadWriteIOUtils.write(deviceMNode.isAlignedNullable(), 
outputStream);
+          // database node in schemaRegion doesn't store any database schema
+          return true;
+        } else {
+          ReadWriteIOUtils.write(STORAGE_GROUP_MNODE_TYPE, outputStream);
+          serializeBasicMNode(node.getBasicMNode(), outputStream);
+          ReadWriteIOUtils.write(0, outputStream); // for compatibly
+          ReadWriteIOUtils.write(false, outputStream); // for compatibly
+          // database node in schemaRegion doesn't store any database schema
+          return true;
+        }
       } catch (IOException e) {
         logger.error(SERIALIZE_ERROR_INFO, e);
         return false;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
index 59e0d9646c4..0f6e921e16e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/CachedMTreeStore.java
@@ -338,40 +338,37 @@ public class CachedMTreeStore implements 
IMTreeStore<ICachedMNode> {
 
   @Override
   public IDeviceMNode<ICachedMNode> setToEntity(ICachedMNode node) {
-    AtomicReference<IDeviceMNode<ICachedMNode>> resultReference = new 
AtomicReference<>(null);
-    updateMNode(
-        node,
-        o -> {
-          IDeviceMNode<ICachedMNode> result = MNodeUtils.setToEntity(node, 
nodeFactory);
-          resultReference.getAndSet(result);
-        });
-
-    IDeviceMNode<ICachedMNode> result = resultReference.get();
-    if (result != node) {
+    int rawSize = node.estimateSize();
+    AtomicReference<Boolean> resultReference = new AtomicReference<>(false);
+    updateMNode(node, o -> 
resultReference.getAndSet(MNodeUtils.setToEntity(node)));
+
+    boolean isSuccess = resultReference.get();
+    if (isSuccess) {
       regionStatistics.addDevice();
-      memManager.updatePinnedSize(result.estimateSize() - node.estimateSize());
+      memManager.updatePinnedSize(node.estimateSize() - rawSize);
     }
 
-    return result;
+    return node.getAsDeviceMNode();
   }
 
   @Override
   public ICachedMNode setToInternal(IDeviceMNode<ICachedMNode> entityMNode) {
-    AtomicReference<ICachedMNode> resultReference = new 
AtomicReference<>(null);
+    int rawSize = entityMNode.estimateSize();
+    AtomicReference<Boolean> resultReference = new AtomicReference<>(false);
+    // the entityMNode is just a wrapper, the actual CachedMNode instance 
shall be the same before
+    // and after
+    // setToInternal
+    ICachedMNode internalMNode = entityMNode.getAsMNode();
     updateMNode(
-        entityMNode.getAsMNode(),
-        o -> {
-          ICachedMNode result = MNodeUtils.setToInternal(entityMNode, 
nodeFactory);
-          resultReference.getAndSet(result);
-        });
-
-    ICachedMNode result = resultReference.get();
-    if (result != entityMNode) {
+        internalMNode, o -> 
resultReference.getAndSet(MNodeUtils.setToInternal(entityMNode)));
+
+    boolean isSuccess = resultReference.get();
+    if (isSuccess) {
       regionStatistics.deleteDevice();
-      memManager.updatePinnedSize(result.estimateSize() - 
entityMNode.estimateSize());
+      memManager.updatePinnedSize(internalMNode.estimateSize() - rawSize);
     }
 
-    return result;
+    return internalMNode;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
index 93f067328d6..7b695f5e0e6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/MTreeBelowSGCachedImpl.java
@@ -25,7 +25,6 @@ import org.apache.iotdb.commons.path.MeasurementPath;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternTree;
 import org.apache.iotdb.commons.schema.SchemaConstant;
-import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
@@ -209,13 +208,6 @@ public class MTreeBelowSGCachedImpl {
     storageGroupMNode = null;
   }
 
-  protected void replaceStorageGroupMNode(IDatabaseMNode<ICachedMNode> 
newMNode) {
-    this.storageGroupMNode
-        .getParent()
-        .replaceChild(this.storageGroupMNode.getName(), newMNode.getAsMNode());
-    this.storageGroupMNode = newMNode.getAsMNode();
-  }
-
   public boolean createSnapshot(File snapshotDir) {
     return store.createSnapshot(snapshotDir);
   }
@@ -317,9 +309,6 @@ public class MTreeBelowSGCachedImpl {
             entityMNode = device.getAsDeviceMNode();
           } else {
             entityMNode = store.setToEntity(device);
-            if (entityMNode.isDatabase()) {
-              replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-            }
             device = entityMNode.getAsMNode();
           }
 
@@ -407,9 +396,6 @@ public class MTreeBelowSGCachedImpl {
           } else {
             entityMNode = store.setToEntity(device);
             entityMNode.setAligned(true);
-            if (entityMNode.isDatabase()) {
-              replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-            }
             device = entityMNode.getAsMNode();
           }
 
@@ -642,9 +628,6 @@ public class MTreeBelowSGCachedImpl {
       if (!hasMeasurement) {
         synchronized (this) {
           curNode = store.setToInternal(entityMNode);
-          if (curNode.isDatabase()) {
-            replaceStorageGroupMNode(curNode.getAsDatabaseMNode());
-          }
         }
       } else if (!hasNonViewMeasurement) {
         // has some measurement but they are all logical view
@@ -970,9 +953,6 @@ public class MTreeBelowSGCachedImpl {
             entityMNode = device.getAsDeviceMNode();
           } else {
             entityMNode = store.setToEntity(device);
-            if (entityMNode.isDatabase()) {
-              replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-            }
             // this parent has no measurement before. The leafName is his 
first child who is a
             // logical
             // view.
@@ -1095,9 +1075,6 @@ public class MTreeBelowSGCachedImpl {
           entityMNode = cur.getAsDeviceMNode();
         } else {
           entityMNode = store.setToEntity(cur);
-          if (entityMNode.isDatabase()) {
-            replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-          }
         }
 
         if (entityMNode.isUseTemplate()) {
@@ -1144,9 +1121,6 @@ public class MTreeBelowSGCachedImpl {
         entityMNode = cur.getAsDeviceMNode();
       } else {
         entityMNode = store.setToEntity(cur);
-        if (entityMNode.isDatabase()) {
-          replaceStorageGroupMNode(entityMNode.getAsDatabaseMNode());
-        }
       }
 
       store.updateMNode(
@@ -1438,7 +1412,7 @@ public class MTreeBelowSGCachedImpl {
 
           protected INodeSchemaInfo collectMNode(ICachedMNode node) {
             return new ShowNodesResult(
-                getPartialPathFromRootToNode(node).getFullPath(), 
node.getMNodeType(false));
+                getPartialPathFromRootToNode(node).getFullPath(), 
node.getMNodeType());
           }
         };
     collector.setTargetLevel(showNodesPlan.getLevel());
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/basic/CachedBasicMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/basic/CachedBasicMNode.java
index 00ab85bac1b..31dc86e04da 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/basic/CachedBasicMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/basic/CachedBasicMNode.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -155,21 +156,6 @@ public class CachedBasicMNode implements ICachedMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
-  @Override
-  public synchronized void replaceChild(String oldChildName, ICachedMNode 
newChildNode) {}
-
-  @Override
-  public void moveDataToNewMNode(ICachedMNode newMNode) {
-    newMNode.setParent(parent);
-    newMNode.setCacheEntry(getCacheEntry());
-  }
-
   @Override
   public IMNodeContainer<ICachedMNode> getChildren() {
     return CachedMNodeContainer.emptyMNodeContainer();
@@ -199,8 +185,8 @@ public class CachedBasicMNode implements ICachedMNode {
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
-    return isConfig ? MNodeType.SG_INTERNAL : MNodeType.INTERNAL;
+  public MNodeType getMNodeType() {
+    return MNodeType.UNIMPLEMENT;
   }
 
   @Override
@@ -213,6 +199,11 @@ public class CachedBasicMNode implements ICachedMNode {
     throw new UnsupportedOperationException("Wrong MNode Type");
   }
 
+  @Override
+  public IInternalMNode<ICachedMNode> getAsInternalMNode() {
+    throw new UnsupportedOperationException("Wrong MNode Type");
+  }
+
   @Override
   public IMeasurementMNode<ICachedMNode> getAsMeasurementMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/factory/CacheMNodeFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/factory/CacheMNodeFactory.java
index faa19842007..cf31d3166f5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/factory/CacheMNodeFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/factory/CacheMNodeFactory.java
@@ -23,12 +23,11 @@ import 
org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.commons.schema.node.utils.MNodeFactory;
+import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DeviceInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICachedMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedAboveDatabaseMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedBasicInternalMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedDatabaseDeviceMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedDatabaseMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedDeviceMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl.CachedMeasurementMNode;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
@@ -43,7 +42,9 @@ public class CacheMNodeFactory implements 
IMNodeFactory<ICachedMNode> {
 
   @Override
   public IDeviceMNode<ICachedMNode> createDeviceMNode(ICachedMNode parent, 
String name) {
-    return new CachedDeviceMNode(parent, name);
+    CachedBasicInternalMNode internalMNode = new 
CachedBasicInternalMNode(parent, name);
+    internalMNode.setDeviceInfo(new DeviceInfo<>());
+    return internalMNode.getAsDeviceMNode();
   }
 
   @Override
@@ -59,7 +60,9 @@ public class CacheMNodeFactory implements 
IMNodeFactory<ICachedMNode> {
 
   @Override
   public ICachedMNode createDatabaseDeviceMNode(ICachedMNode parent, String 
name, long dataTTL) {
-    return new CachedDatabaseDeviceMNode(parent, name, dataTTL);
+    CachedDatabaseMNode databaseMNode = new CachedDatabaseMNode(parent, name, 
dataTTL);
+    databaseMNode.setDeviceInfo(new DeviceInfo<>());
+    return databaseMNode;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedBasicInternalMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedBasicInternalMNode.java
index 23491c50766..1b4e67e623d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedBasicInternalMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedBasicInternalMNode.java
@@ -18,6 +18,11 @@
  */
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl;
 
+import org.apache.iotdb.commons.schema.node.MNodeType;
+import org.apache.iotdb.commons.schema.node.common.DeviceMNodeWrapper;
+import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
+import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICachedMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.basic.CachedBasicMNode;
@@ -27,7 +32,8 @@ import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.con
  * This class is the implementation of Metadata Node. One MNode instance 
represents one node in the
  * Metadata Tree
  */
-public class CachedBasicInternalMNode extends CachedBasicMNode {
+public class CachedBasicInternalMNode extends CachedBasicMNode
+    implements IInternalMNode<ICachedMNode> {
 
   /**
    * suppress warnings reason: volatile for double synchronized check
@@ -37,6 +43,9 @@ public class CachedBasicInternalMNode extends 
CachedBasicMNode {
   @SuppressWarnings("squid:S3077")
   private transient volatile IMNodeContainer<ICachedMNode> children = null;
 
+  @SuppressWarnings("squid:S3077")
+  private volatile IDeviceInfo<ICachedMNode> deviceInfo = null;
+
   /** Constructor of MNode. */
   public CachedBasicInternalMNode(ICachedMNode parent, String name) {
     super(parent, name);
@@ -45,7 +54,11 @@ public class CachedBasicInternalMNode extends 
CachedBasicMNode {
   /** check whether the MNode has a child with the name */
   @Override
   public boolean hasChild(String name) {
-    return (children != null && children.containsKey(name));
+    return (children != null && children.containsKey(name)) || 
hasChildInDeviceInfo(name);
+  }
+
+  private boolean hasChildInDeviceInfo(String name) {
+    return deviceInfo != null && deviceInfo.hasAliasChild(name);
   }
 
   /** get the child with the name */
@@ -55,6 +68,9 @@ public class CachedBasicInternalMNode extends 
CachedBasicMNode {
     if (children != null) {
       child = children.get(name);
     }
+    if (child == null && deviceInfo != null) {
+      child = deviceInfo.getAliasChild(name);
+    }
     return child;
   }
 
@@ -124,37 +140,6 @@ public class CachedBasicInternalMNode extends 
CachedBasicMNode {
     return null;
   }
 
-  /**
-   * Replace a child of this mnode. New child's name must be the same as old 
child's name.
-   *
-   * @param oldChildName measurement name
-   * @param newChildNode new child node
-   */
-  @Override
-  public synchronized void replaceChild(String oldChildName, ICachedMNode 
newChildNode) {
-    if (!oldChildName.equals(newChildNode.getName())) {
-      throw new RuntimeException("New child's name must be the same as old 
child's name!");
-    }
-    ICachedMNode oldChildNode = this.getChild(oldChildName);
-    if (oldChildNode == null) {
-      return;
-    }
-
-    oldChildNode.moveDataToNewMNode(newChildNode);
-
-    children.replace(newChildNode.getName(), newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(ICachedMNode newMNode) {
-    super.moveDataToNewMNode(newMNode);
-
-    if (children != null) {
-      newMNode.setChildren(children);
-      children.forEach((childName, childNode) -> 
childNode.setParent(newMNode));
-    }
-  }
-
   @Override
   public IMNodeContainer<ICachedMNode> getChildren() {
     if (children == null) {
@@ -177,15 +162,51 @@ public class CachedBasicInternalMNode extends 
CachedBasicMNode {
    *   <li>three map reference (1 cache and 2 buffer), 8 * 3 = 24B
    *   <li>estimate occupation of map implementation, minus the basic 
container occupation, 80 * 3 -
    *       80 = 160B
+   *   <li>reference for deviceInfo
+   *   <li>deviceInfo's size
    * </ol>
    */
   @Override
   public int estimateSize() {
-    return 8 + 80 + 192 + super.estimateSize();
+    return 8
+        + 80
+        + 192
+        + super.estimateSize()
+        + 8
+        + (deviceInfo == null ? 0 : deviceInfo.estimateSize());
+  }
+
+  @Override
+  public boolean isDevice() {
+    return getDeviceInfo() != null;
   }
 
   @Override
-  public ICachedMNode getAsMNode() {
+  public MNodeType getMNodeType() {
+    return deviceInfo == null ? MNodeType.INTERNAL : MNodeType.DEVICE;
+  }
+
+  @Override
+  public IInternalMNode<ICachedMNode> getAsInternalMNode() {
     return this;
   }
+
+  @Override
+  public IDeviceMNode<ICachedMNode> getAsDeviceMNode() {
+    if (isDevice()) {
+      return new DeviceMNodeWrapper<>(this);
+    } else {
+      throw new UnsupportedOperationException("Wrong node type");
+    }
+  }
+
+  @Override
+  public IDeviceInfo<ICachedMNode> getDeviceInfo() {
+    return deviceInfo;
+  }
+
+  @Override
+  public void setDeviceInfo(IDeviceInfo<ICachedMNode> deviceInfo) {
+    this.deviceInfo = deviceInfo;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseDeviceMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseDeviceMNode.java
deleted file mode 100644
index 84186ddfb92..00000000000
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseDeviceMNode.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl;
-
-import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseDeviceMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DatabaseDeviceInfo;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.cache.CacheEntry;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICachedMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.basic.CachedBasicMNode;
-
-public class CachedDatabaseDeviceMNode
-    extends AbstractDatabaseDeviceMNode<ICachedMNode, CachedBasicMNode> 
implements ICachedMNode {
-
-  public CachedDatabaseDeviceMNode(ICachedMNode parent, String name, long 
dataTTL) {
-    super(new CachedBasicInternalMNode(parent, name), new 
DatabaseDeviceInfo<>());
-    setDataTTL(dataTTL);
-  }
-
-  @Override
-  public CacheEntry getCacheEntry() {
-    return basicMNode.getCacheEntry();
-  }
-
-  @Override
-  public void setCacheEntry(CacheEntry cacheEntry) {
-    basicMNode.setCacheEntry(cacheEntry);
-  }
-
-  @Override
-  public ICachedMNode getAsMNode() {
-    return this;
-  }
-}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseMNode.java
index 9b58e5a8ec6..18cc9e3ba7f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseMNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDatabaseMNode.java
@@ -19,13 +19,15 @@
 package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl;
 
 import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseMNode;
+import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DatabaseInfo;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.cache.CacheEntry;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICachedMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.basic.CachedBasicMNode;
 
-public class CachedDatabaseMNode extends AbstractDatabaseMNode<ICachedMNode, 
CachedBasicMNode>
-    implements ICachedMNode {
+public class CachedDatabaseMNode
+    extends AbstractDatabaseMNode<ICachedMNode, CachedBasicInternalMNode>
+    implements ICachedMNode, IInternalMNode<ICachedMNode> {
 
   public CachedDatabaseMNode(ICachedMNode parent, String name) {
     super(new CachedBasicInternalMNode(parent, name), new DatabaseInfo<>());
@@ -51,4 +53,14 @@ public class CachedDatabaseMNode extends 
AbstractDatabaseMNode<ICachedMNode, Cac
   public ICachedMNode getAsMNode() {
     return this;
   }
+
+  @Override
+  public IDeviceInfo<ICachedMNode> getDeviceInfo() {
+    return basicMNode.getDeviceInfo();
+  }
+
+  @Override
+  public void setDeviceInfo(IDeviceInfo<ICachedMNode> deviceInfo) {
+    basicMNode.setDeviceInfo(deviceInfo);
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDeviceMNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDeviceMNode.java
deleted file mode 100644
index 575b4773569..00000000000
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/pbtree/mnode/impl/CachedDeviceMNode.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.impl;
-
-import org.apache.iotdb.commons.schema.node.common.AbstractDeviceMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DeviceInfo;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.cache.CacheEntry;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.ICachedMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.pbtree.mnode.basic.CachedBasicMNode;
-
-public class CachedDeviceMNode extends AbstractDeviceMNode<ICachedMNode, 
CachedBasicMNode>
-    implements ICachedMNode {
-
-  public CachedDeviceMNode(ICachedMNode parent, String name) {
-    super(new CachedBasicInternalMNode(parent, name), new DeviceInfo<>());
-  }
-
-  @Override
-  public CacheEntry getCacheEntry() {
-    return basicMNode.getCacheEntry();
-  }
-
-  @Override
-  public void setCacheEntry(CacheEntry cacheEntry) {
-    basicMNode.setCacheEntry(cacheEntry);
-  }
-
-  @Override
-  public ICachedMNode getAsMNode() {
-    return this;
-  }
-}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MNodeUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MNodeUtils.java
index 05876d6cf26..fb3b034738c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MNodeUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/MNodeUtils.java
@@ -19,9 +19,10 @@
 package org.apache.iotdb.db.schemaengine.schemaregion.utils;
 
 import org.apache.iotdb.commons.schema.node.IMNode;
-import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
+import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DeviceInfo;
 import org.apache.iotdb.db.schemaengine.template.Template;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 
@@ -35,32 +36,15 @@ public class MNodeUtils {
    * part first.
    *
    * @param node node to be transformed
-   * @return generated entityMNode
    */
-  public static <N extends IMNode<N>> IDeviceMNode<N> setToEntity(
-      IMNode<N> node, IMNodeFactory<N> nodeFactory) {
-    IDeviceMNode<N> entityMNode;
-    if (node.isDevice()) {
-      entityMNode = node.getAsDeviceMNode();
+  public static <N extends IMNode<N>> boolean setToEntity(IMNode<N> node) {
+    IInternalMNode<N> internalMNode = node.getAsInternalMNode();
+    if (!internalMNode.isDevice()) {
+      internalMNode.setDeviceInfo(new DeviceInfo<>());
+      return true;
     } else {
-      if (node.isDatabase()) {
-        entityMNode =
-            nodeFactory
-                .createDatabaseDeviceMNode(
-                    node.getParent(), node.getName(), 
node.getAsDatabaseMNode().getDataTTL())
-                .getAsDeviceMNode();
-        node.moveDataToNewMNode(entityMNode.getAsMNode());
-      } else {
-        // basic node
-        entityMNode = nodeFactory.createDeviceMNode(node.getParent(), 
node.getName());
-        if (node.getParent() != null) {
-          node.getParent().replaceChild(node.getName(), 
entityMNode.getAsMNode());
-        } else {
-          node.moveDataToNewMNode(entityMNode.getAsMNode());
-        }
-      }
+      return false;
     }
-    return entityMNode;
   }
 
   /**
@@ -69,25 +53,15 @@ public class MNodeUtils {
    * MTree structure first.
    *
    * @param entityMNode node to be transformed
-   * @return generated NoEntity node
    */
-  public static <N extends IMNode<N>> N setToInternal(
-      IDeviceMNode<N> entityMNode, IMNodeFactory<N> nodeFactor) {
-    N node;
-    N parent = entityMNode.getParent();
-    if (entityMNode.isDatabase()) {
-      IDatabaseMNode<N> databaseMNode =
-          nodeFactor.createDatabaseMNode(parent, entityMNode.getName());
-      databaseMNode.setDataTTL(entityMNode.getAsDatabaseMNode().getDataTTL());
-      node = databaseMNode.getAsMNode();
+  public static <N extends IMNode<N>> boolean setToInternal(IDeviceMNode<N> 
entityMNode) {
+    IInternalMNode<N> internalMNode = entityMNode.getAsInternalMNode();
+    if (internalMNode.isDevice()) {
+      internalMNode.setDeviceInfo(null);
+      return true;
     } else {
-      node = nodeFactor.createInternalMNode(parent, entityMNode.getName());
-    }
-
-    if (parent != null) {
-      parent.replaceChild(entityMNode.getName(), node);
+      return false;
     }
-    return node;
   }
 
   public static <N extends IMNode<N>> N getChild(
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
index 986fd54cf67..8ec8f12295a 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mnode/MNodeTest.java
@@ -18,47 +18,18 @@
  */
 package org.apache.iotdb.db.metadata.mnode;
 
-import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
-import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.loader.MNodeFactoryLoader;
-import org.apache.iotdb.db.schemaengine.schemaregion.utils.MetaUtils;
 
 import org.junit.Test;
 
-import java.util.List;
-
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
 
 public class MNodeTest {
 
   private final IMNodeFactory<IMemMNode> nodeFactory =
-      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();;
-
-  @Test
-  public void testReplaceChild() {
-    IMemMNode rootNode = nodeFactory.createInternalMNode(null, "root");
-
-    IDeviceMNode<IMemMNode> aNode = nodeFactory.createDeviceMNode(rootNode, 
"a");
-    rootNode.addChild(aNode.getName(), aNode.getAsMNode());
-
-    IMeasurementMNode<IMemMNode> bNode = 
nodeFactory.createMeasurementMNode(aNode, "b", null, null);
-
-    aNode.addChild(bNode.getName(), bNode.getAsMNode());
-    aNode.addAlias("aliasOfb", bNode);
-
-    IDeviceMNode<IMemMNode> newANode = nodeFactory.createDeviceMNode(null, 
"a");
-    rootNode.replaceChild(aNode.getName(), newANode.getAsMNode());
-
-    List<String> multiFullPaths = MetaUtils.getMultiFullPaths(rootNode);
-    assertEquals("root.a.b", multiFullPaths.get(0));
-    assertEquals("root.a.b", 
rootNode.getChild("a").getChild("aliasOfb").getFullPath());
-    assertNotSame(aNode, rootNode.getChild("a"));
-    assertSame(newANode, rootNode.getChild("a"));
-  }
+      MNodeFactoryLoader.getInstance().getMemMNodeIMNodeFactory();
 
   @Test
   public void testAddChild() {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
index 1dadc42dd0c..987185b9258 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/mtree/schemafile/SchemaFileTest.java
@@ -883,7 +883,7 @@ public class SchemaFileTest {
     }
 
     ICachedMNode d010 = sgNode.getChildren().get("d_010");
-    d010 = MNodeUtils.setToEntity(d010, nodeFactory).getAsMNode();
+    MNodeUtils.setToEntity(d010);
     ICachedMNode ano = getMeasurementNode(d010, "splitover", "aliaslasialsai");
 
     d010.addChild(ano);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/IMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/IMNode.java
index f3f8f48b804..56fe4bdacd1 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/IMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/IMNode.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.commons.schema.node;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -53,13 +54,6 @@ public interface IMNode<N extends IMNode<N>> extends 
ITreeNode {
 
   N deleteChild(String name);
 
-  // this method will replace the oldChild with the newChild, the data of 
oldChild will be moved to
-  // newChild
-  void replaceChild(String oldChildName, N newChildNode);
-
-  // this method will move all the reference or value of current node's 
attributes to newMNode
-  void moveDataToNewMNode(N newMNode);
-
   IMNodeContainer<N> getChildren();
 
   void setChildren(IMNodeContainer<N> children);
@@ -72,12 +66,14 @@ public interface IMNode<N extends IMNode<N>> extends 
ITreeNode {
 
   boolean isMeasurement();
 
-  MNodeType getMNodeType(Boolean isConfig);
+  MNodeType getMNodeType();
 
   IDatabaseMNode<N> getAsDatabaseMNode();
 
   IDeviceMNode<N> getAsDeviceMNode();
 
+  IInternalMNode<N> getAsInternalMNode();
+
   IMeasurementMNode<N> getAsMeasurementMNode();
 
   <R, C> R accept(MNodeVisitor<R, C> visitor, C context);
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractAboveDatabaseMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractAboveDatabaseMNode.java
index 454a0e20388..ab0592480e5 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractAboveDatabaseMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractAboveDatabaseMNode.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -112,16 +113,6 @@ public abstract class AbstractAboveDatabaseMNode<N extends 
IMNode<N>, BasicNode
     return basicMNode.deleteChild(name);
   }
 
-  @Override
-  public void replaceChild(String oldChildName, N newChildNode) {
-    basicMNode.replaceChild(oldChildName, newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(N newMNode) {
-    basicMNode.moveDataToNewMNode(newMNode);
-  }
-
   @Override
   public IMNodeContainer<N> getChildren() {
     return basicMNode.getChildren();
@@ -153,7 +144,7 @@ public abstract class AbstractAboveDatabaseMNode<N extends 
IMNode<N>, BasicNode
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
+  public MNodeType getMNodeType() {
     return MNodeType.INTERNAL;
   }
 
@@ -167,6 +158,11 @@ public abstract class AbstractAboveDatabaseMNode<N extends 
IMNode<N>, BasicNode
     throw new UnsupportedOperationException("Wrong MNode Type");
   }
 
+  @Override
+  public IInternalMNode<N> getAsInternalMNode() {
+    throw new UnsupportedOperationException("Wrong MNode Type");
+  }
+
   @Override
   public IMeasurementMNode<N> getAsMeasurementMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseDeviceMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseDeviceMNode.java
deleted file mode 100644
index b0f78219064..00000000000
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseDeviceMNode.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.commons.schema.node.common;
-
-import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.commons.schema.node.IMNode;
-import org.apache.iotdb.commons.schema.node.MNodeType;
-import org.apache.iotdb.commons.schema.node.info.IDatabaseDeviceInfo;
-import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
-import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
-import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
-import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
-import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
-
-import java.util.Map;
-
-public abstract class AbstractDatabaseDeviceMNode<N extends IMNode<N>, 
BasicNode extends IMNode<N>>
-    implements IDatabaseMNode<N>, IDeviceMNode<N> {
-
-  private final IDatabaseDeviceInfo<N> databaseDeviceInfo;
-  protected final BasicNode basicMNode;
-
-  public AbstractDatabaseDeviceMNode(
-      BasicNode basicMNode, IDatabaseDeviceInfo<N> databaseDeviceInfo) {
-    this.basicMNode = basicMNode;
-    this.databaseDeviceInfo = databaseDeviceInfo;
-  }
-
-  public BasicNode getBasicMNode() {
-    return basicMNode;
-  }
-
-  @Override
-  public String getName() {
-    return basicMNode.getName();
-  }
-
-  @Override
-  public void setName(String name) {
-    basicMNode.setName(name);
-  }
-
-  @Override
-  public N getParent() {
-    return basicMNode.getParent();
-  }
-
-  @Override
-  public void setParent(N parent) {
-    basicMNode.setParent(parent);
-  }
-
-  @Override
-  public String getFullPath() {
-    return basicMNode.getFullPath();
-  }
-
-  @Override
-  public void setFullPath(String fullPath) {
-    basicMNode.setFullPath(fullPath);
-  }
-
-  @Override
-  public PartialPath getPartialPath() {
-    return basicMNode.getPartialPath();
-  }
-
-  @Override
-  public boolean hasChild(String name) {
-    return basicMNode.hasChild(name);
-  }
-
-  @Override
-  public N getChild(String name) {
-    return basicMNode.getChild(name);
-  }
-
-  @Override
-  public N addChild(String name, N child) {
-    N res = basicMNode.addChild(name, child);
-    if (res == child) {
-      child.setParent(this.getAsMNode());
-    }
-    return res;
-  }
-
-  @Override
-  public N addChild(N child) {
-    N res = basicMNode.addChild(child);
-    if (res == child) {
-      child.setParent(this.getAsMNode());
-    }
-    return res;
-  }
-
-  @Override
-  public N deleteChild(String name) {
-    return basicMNode.deleteChild(name);
-  }
-
-  @Override
-  public void replaceChild(String oldChildName, N newChildNode) {
-    basicMNode.replaceChild(oldChildName, newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(N newMNode) {
-    basicMNode.moveDataToNewMNode(newMNode);
-    if (newMNode.isDevice()) {
-      databaseDeviceInfo.moveDataToNewMNode(newMNode.getAsDeviceMNode());
-    }
-    if (newMNode.isDatabase()) {
-      databaseDeviceInfo.moveDataToNewMNode(newMNode.getAsDatabaseMNode());
-    }
-  }
-
-  @Override
-  public IMNodeContainer<N> getChildren() {
-    return basicMNode.getChildren();
-  }
-
-  @Override
-  public void setChildren(IMNodeContainer<N> children) {
-    basicMNode.setChildren(children);
-  }
-
-  @Override
-  public boolean isAboveDatabase() {
-    return false;
-  }
-
-  @Override
-  public boolean isDatabase() {
-    return true;
-  }
-
-  @Override
-  public boolean isDevice() {
-    return true;
-  }
-
-  @Override
-  public boolean isMeasurement() {
-    return false;
-  }
-
-  @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
-    return MNodeType.STORAGE_GROUP;
-  }
-
-  @Override
-  public IDatabaseMNode<N> getAsDatabaseMNode() {
-    return this;
-  }
-
-  @Override
-  public IDeviceMNode<N> getAsDeviceMNode() {
-    return this;
-  }
-
-  @Override
-  public IMeasurementMNode<N> getAsMeasurementMNode() {
-    throw new UnsupportedOperationException("Wrong MNode Type");
-  }
-
-  @Override
-  public <R, C> R accept(MNodeVisitor<R, C> visitor, C context) {
-    return visitor.visitDatabaseDeviceMNode(this, context);
-  }
-
-  @Override
-  public long getDataTTL() {
-    return databaseDeviceInfo.getDataTTL();
-  }
-
-  @Override
-  public void setDataTTL(long dataTTL) {
-    databaseDeviceInfo.setDataTTL(dataTTL);
-  }
-
-  @Override
-  public boolean addAlias(String alias, IMeasurementMNode<N> child) {
-    return databaseDeviceInfo.addAlias(alias, child);
-  }
-
-  @Override
-  public void deleteAliasChild(String alias) {
-    databaseDeviceInfo.deleteAliasChild(alias);
-  }
-
-  @Override
-  public Map<String, IMeasurementMNode<N>> getAliasChildren() {
-    return databaseDeviceInfo.getAliasChildren();
-  }
-
-  @Override
-  public void setAliasChildren(Map<String, IMeasurementMNode<N>> 
aliasChildren) {
-    databaseDeviceInfo.setAliasChildren(aliasChildren);
-  }
-
-  @Override
-  public boolean isUseTemplate() {
-    return databaseDeviceInfo.isUseTemplate();
-  }
-
-  @Override
-  public void setUseTemplate(boolean useTemplate) {
-    databaseDeviceInfo.setUseTemplate(useTemplate);
-  }
-
-  @Override
-  public void setSchemaTemplateId(int schemaTemplateId) {
-    databaseDeviceInfo.setSchemaTemplateId(schemaTemplateId);
-  }
-
-  @Override
-  public int getSchemaTemplateId() {
-    return databaseDeviceInfo.getSchemaTemplateId();
-  }
-
-  @Override
-  public int getSchemaTemplateIdWithState() {
-    return databaseDeviceInfo.getSchemaTemplateIdWithState();
-  }
-
-  @Override
-  public boolean isPreDeactivateTemplate() {
-    return databaseDeviceInfo.isPreDeactivateTemplate();
-  }
-
-  @Override
-  public void preDeactivateTemplate() {
-    databaseDeviceInfo.preDeactivateTemplate();
-  }
-
-  @Override
-  public void rollbackPreDeactivateTemplate() {
-    databaseDeviceInfo.rollbackPreDeactivateTemplate();
-  }
-
-  @Override
-  public void deactivateTemplate() {
-    databaseDeviceInfo.deactivateTemplate();
-  }
-
-  @Override
-  public boolean isAligned() {
-    Boolean align = databaseDeviceInfo.isAligned();
-    if (align == null) {
-      return false;
-    }
-    return align;
-  }
-
-  @Override
-  public Boolean isAlignedNullable() {
-    return databaseDeviceInfo.isAligned();
-  }
-
-  @Override
-  public void setAligned(Boolean isAligned) {
-    databaseDeviceInfo.setAligned(isAligned);
-  }
-
-  /**
-   * The basic memory occupied by any AbstractDatabaseDeviceMNode object
-   *
-   * <ol>
-   *   <li>object header, 8B
-   *   <li>node attributes
-   *       <ol>
-   *         <li>databaseDeviceInfo reference, 8B
-   *         <li>basicMNode reference, 8B
-   *       </ol>
-   *   <li>MapEntry in parent
-   * </ol>
-   */
-  @Override
-  public int estimateSize() {
-    return 8 + 8 + databaseDeviceInfo.estimateSize() + 
basicMNode.estimateSize();
-  }
-}
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseMNode.java
index 6781bad26a1..e5834f787c0 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDatabaseMNode.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.commons.schema.node.IMNode;
 import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.info.IDatabaseInfo;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
-import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -113,19 +112,6 @@ public abstract class AbstractDatabaseMNode<N extends 
IMNode<N>, BasicNode exten
     return basicMNode.deleteChild(name);
   }
 
-  @Override
-  public void replaceChild(String oldChildName, N newChildNode) {
-    basicMNode.replaceChild(oldChildName, newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(N newMNode) {
-    basicMNode.moveDataToNewMNode(newMNode);
-    if (newMNode.isDatabase()) {
-      databaseInfo.moveDataToNewMNode(newMNode.getAsDatabaseMNode());
-    }
-  }
-
   @Override
   public IMNodeContainer<N> getChildren() {
     return basicMNode.getChildren();
@@ -146,18 +132,13 @@ public abstract class AbstractDatabaseMNode<N extends 
IMNode<N>, BasicNode exten
     return true;
   }
 
-  @Override
-  public boolean isDevice() {
-    return false;
-  }
-
   @Override
   public boolean isMeasurement() {
     return false;
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
+  public MNodeType getMNodeType() {
     return MNodeType.STORAGE_GROUP;
   }
 
@@ -166,11 +147,6 @@ public abstract class AbstractDatabaseMNode<N extends 
IMNode<N>, BasicNode exten
     return this;
   }
 
-  @Override
-  public IDeviceMNode<N> getAsDeviceMNode() {
-    throw new UnsupportedOperationException("Wrong MNode Type");
-  }
-
   @Override
   public IMeasurementMNode<N> getAsMeasurementMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractMeasurementMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractMeasurementMNode.java
index 3d55200c27a..9e4a7427be4 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractMeasurementMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractMeasurementMNode.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.info.IMeasurementInfo;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
@@ -180,17 +181,6 @@ public abstract class AbstractMeasurementMNode<N extends 
IMNode<N>, BasicNode ex
     return null;
   }
 
-  @Override
-  public void replaceChild(String oldChildName, N newChildNode) {}
-
-  @Override
-  public void moveDataToNewMNode(N newMNode) {
-    basicMNode.moveDataToNewMNode(newMNode);
-    if (newMNode.isMeasurement()) {
-      measurementInfo.moveDataToNewMNode(newMNode.getAsMeasurementMNode());
-    }
-  }
-
   @Override
   public void setChildren(IMNodeContainer<N> children) {
     // Do nothing
@@ -217,7 +207,7 @@ public abstract class AbstractMeasurementMNode<N extends 
IMNode<N>, BasicNode ex
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
+  public MNodeType getMNodeType() {
     return MNodeType.MEASUREMENT;
   }
 
@@ -231,6 +221,11 @@ public abstract class AbstractMeasurementMNode<N extends 
IMNode<N>, BasicNode ex
     throw new UnsupportedOperationException("Wrong MNode Type");
   }
 
+  @Override
+  public IInternalMNode<N> getAsInternalMNode() {
+    throw new UnsupportedOperationException("Wrong MNode Type");
+  }
+
   @Override
   public IMeasurementMNode<N> getAsMeasurementMNode() {
     return this;
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDeviceMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/DeviceMNodeWrapper.java
similarity index 65%
rename from 
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDeviceMNode.java
rename to 
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/DeviceMNodeWrapper.java
index 49c1e111c89..6b400832da5 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/AbstractDeviceMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/common/DeviceMNodeWrapper.java
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.iotdb.commons.schema.node.common;
 
 import org.apache.iotdb.commons.path.PartialPath;
@@ -24,25 +25,21 @@ import org.apache.iotdb.commons.schema.node.MNodeType;
 import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
 import org.apache.iotdb.commons.schema.node.role.IDatabaseMNode;
 import org.apache.iotdb.commons.schema.node.role.IDeviceMNode;
+import org.apache.iotdb.commons.schema.node.role.IInternalMNode;
 import org.apache.iotdb.commons.schema.node.role.IMeasurementMNode;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeContainer;
 import org.apache.iotdb.commons.schema.node.visitor.MNodeVisitor;
 
 import java.util.Map;
 
-public abstract class AbstractDeviceMNode<N extends IMNode<N>, BasicNode 
extends IMNode<N>>
+// This class provides a device view for an internal node with deviceInfo.
+public class DeviceMNodeWrapper<N extends IMNode<N>, BasicNode extends 
IInternalMNode<N>>
     implements IDeviceMNode<N> {
 
-  private final IDeviceInfo<N> deviceInfo;
   protected final BasicNode basicMNode;
 
-  public AbstractDeviceMNode(BasicNode basicMNode, IDeviceInfo<N> deviceInfo) {
+  public DeviceMNodeWrapper(BasicNode basicMNode) {
     this.basicMNode = basicMNode;
-    this.deviceInfo = deviceInfo;
-  }
-
-  public BasicNode getBasicMNode() {
-    return basicMNode;
   }
 
   @Override
@@ -82,34 +79,22 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
 
   @Override
   public boolean hasChild(String name) {
-    return basicMNode.hasChild(name) || deviceInfo.hasAliasChild(name);
+    return basicMNode.hasChild(name);
   }
 
   @Override
   public N getChild(String name) {
-    N res = basicMNode.getChild(name);
-    if (res == null) {
-      res = deviceInfo.getAliasChild(name);
-    }
-    return res;
+    return basicMNode.getChild(name);
   }
 
   @Override
   public N addChild(String name, N child) {
-    N res = basicMNode.addChild(name, child);
-    if (res == child) {
-      child.setParent(this.getAsMNode());
-    }
-    return res;
+    return basicMNode.addChild(name, child);
   }
 
   @Override
   public N addChild(N child) {
-    N res = basicMNode.addChild(child);
-    if (res == child) {
-      child.setParent(this.getAsMNode());
-    }
-    return res;
+    return basicMNode.addChild(child);
   }
 
   @Override
@@ -117,19 +102,6 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
     return basicMNode.deleteChild(name);
   }
 
-  @Override
-  public void replaceChild(String oldChildName, N newChildNode) {
-    basicMNode.replaceChild(oldChildName, newChildNode);
-  }
-
-  @Override
-  public void moveDataToNewMNode(N newMNode) {
-    basicMNode.moveDataToNewMNode(newMNode);
-    if (newMNode.isDevice()) {
-      deviceInfo.moveDataToNewMNode(newMNode.getAsDeviceMNode());
-    }
-  }
-
   @Override
   public IMNodeContainer<N> getChildren() {
     return basicMNode.getChildren();
@@ -142,32 +114,37 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
 
   @Override
   public boolean isAboveDatabase() {
-    return false;
+    return basicMNode.isAboveDatabase();
   }
 
   @Override
   public boolean isDatabase() {
-    return false;
+    return basicMNode.isDatabase();
   }
 
   @Override
-  public boolean isDevice() {
-    return true;
+  public IDeviceInfo<N> getDeviceInfo() {
+    return basicMNode.getDeviceInfo();
   }
 
   @Override
-  public boolean isMeasurement() {
-    return false;
+  public void setDeviceInfo(IDeviceInfo<N> deviceInfo) {
+    throw new UnsupportedOperationException();
   }
 
   @Override
-  public MNodeType getMNodeType(Boolean isConfig) {
+  public boolean isDevice() {
+    return true;
+  }
+
+  @Override
+  public MNodeType getMNodeType() {
     return MNodeType.DEVICE;
   }
 
   @Override
   public IDatabaseMNode<N> getAsDatabaseMNode() {
-    throw new UnsupportedOperationException("Wrong MNode Type");
+    return basicMNode.getAsDatabaseMNode();
   }
 
   @Override
@@ -175,6 +152,11 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
     return this;
   }
 
+  @Override
+  public IInternalMNode<N> getAsInternalMNode() {
+    return basicMNode;
+  }
+
   @Override
   public IMeasurementMNode<N> getAsMeasurementMNode() {
     throw new UnsupportedOperationException("Wrong MNode Type");
@@ -182,77 +164,77 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
 
   @Override
   public <R, C> R accept(MNodeVisitor<R, C> visitor, C context) {
-    return visitor.visitDeviceMNode(this, context);
+    return visitor.visitBasicMNode(this, context);
   }
 
   @Override
   public boolean addAlias(String alias, IMeasurementMNode<N> child) {
-    return deviceInfo.addAlias(alias, child);
+    return basicMNode.getDeviceInfo().addAlias(alias, child);
   }
 
   @Override
   public void deleteAliasChild(String alias) {
-    deviceInfo.deleteAliasChild(alias);
+    basicMNode.getDeviceInfo().deleteAliasChild(alias);
   }
 
   @Override
   public Map<String, IMeasurementMNode<N>> getAliasChildren() {
-    return deviceInfo.getAliasChildren();
+    return basicMNode.getDeviceInfo().getAliasChildren();
   }
 
   @Override
   public void setAliasChildren(Map<String, IMeasurementMNode<N>> 
aliasChildren) {
-    deviceInfo.setAliasChildren(aliasChildren);
+    basicMNode.getDeviceInfo().setAliasChildren(aliasChildren);
   }
 
   @Override
   public boolean isUseTemplate() {
-    return deviceInfo.isUseTemplate();
+    return basicMNode.getDeviceInfo().isUseTemplate();
   }
 
   @Override
   public void setUseTemplate(boolean useTemplate) {
-    deviceInfo.setUseTemplate(useTemplate);
+    basicMNode.getDeviceInfo().setUseTemplate(useTemplate);
   }
 
   @Override
   public void setSchemaTemplateId(int schemaTemplateId) {
-    deviceInfo.setSchemaTemplateId(schemaTemplateId);
+    basicMNode.getDeviceInfo().setSchemaTemplateId(schemaTemplateId);
   }
 
   @Override
   public int getSchemaTemplateId() {
-    return deviceInfo.getSchemaTemplateId();
+    return basicMNode.getDeviceInfo().getSchemaTemplateId();
   }
 
   @Override
   public int getSchemaTemplateIdWithState() {
-    return deviceInfo.getSchemaTemplateIdWithState();
+    return basicMNode.getDeviceInfo().getSchemaTemplateIdWithState();
   }
 
   @Override
   public boolean isPreDeactivateTemplate() {
-    return deviceInfo.isPreDeactivateTemplate();
+    return basicMNode.getDeviceInfo().isPreDeactivateTemplate();
   }
 
   @Override
   public void preDeactivateTemplate() {
-    deviceInfo.preDeactivateTemplate();
+    basicMNode.getDeviceInfo().preDeactivateTemplate();
   }
 
   @Override
   public void rollbackPreDeactivateTemplate() {
-    deviceInfo.rollbackPreDeactivateTemplate();
+    basicMNode.getDeviceInfo().rollbackPreDeactivateTemplate();
   }
 
   @Override
   public void deactivateTemplate() {
-    deviceInfo.deactivateTemplate();
+    basicMNode.getDeviceInfo().deactivateTemplate();
   }
 
   @Override
   public boolean isAligned() {
-    Boolean align = deviceInfo.isAligned();
+    Boolean align = basicMNode.getDeviceInfo().isAligned();
     if (align == null) {
       return false;
     }
@@ -261,29 +243,21 @@ public abstract class AbstractDeviceMNode<N extends 
IMNode<N>, BasicNode extends
 
   @Override
   public Boolean isAlignedNullable() {
-    return deviceInfo.isAligned();
+    return basicMNode.getDeviceInfo().isAligned();
   }
 
   @Override
   public void setAligned(Boolean isAligned) {
-    deviceInfo.setAligned(isAligned);
-  }
-
-  /**
-   * The basic memory occupied by any AbstractDeviceMNode object
-   *
-   * <ol>
-   *   <li>object header, 8B
-   *   <li>node attributes
-   *       <ol>
-   *         <li>deviceInfo reference, 8B
-   *         <li>basicMNode reference, 8B
-   *       </ol>
-   *   <li>MapEntry in parent
-   * </ol>
-   */
+    basicMNode.getDeviceInfo().setAligned(isAligned);
+  }
+
   @Override
   public int estimateSize() {
-    return 8 + 8 + deviceInfo.estimateSize() + basicMNode.estimateSize();
+    return basicMNode.estimateSize();
+  }
+
+  @Override
+  public N getAsMNode() {
+    return basicMNode.getAsMNode();
   }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IDeviceMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IDeviceMNode.java
index a2ab8dd0773..4e8c6972723 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IDeviceMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IDeviceMNode.java
@@ -22,7 +22,7 @@ import org.apache.iotdb.commons.schema.node.IMNode;
 
 import java.util.Map;
 
-public interface IDeviceMNode<N extends IMNode<N>> extends IMNode<N> {
+public interface IDeviceMNode<N extends IMNode<N>> extends IInternalMNode<N> {
   boolean addAlias(String alias, IMeasurementMNode<N> child);
 
   void deleteAliasChild(String alias);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DeviceMNode.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IInternalMNode.java
similarity index 51%
rename from 
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DeviceMNode.java
rename to 
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IInternalMNode.java
index c4d8c0ab02f..ed69923b86d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/mtree/impl/mem/mnode/impl/DeviceMNode.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/role/IInternalMNode.java
@@ -16,21 +16,40 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.impl;
 
-import org.apache.iotdb.commons.schema.node.common.AbstractDeviceMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.IMemMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.basic.BasicMNode;
-import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.impl.mem.mnode.info.DeviceInfo;
+package org.apache.iotdb.commons.schema.node.role;
 
-public class DeviceMNode extends AbstractDeviceMNode<IMemMNode, BasicMNode> 
implements IMemMNode {
+import org.apache.iotdb.commons.schema.node.IMNode;
+import org.apache.iotdb.commons.schema.node.common.DeviceMNodeWrapper;
+import org.apache.iotdb.commons.schema.node.info.IDeviceInfo;
 
-  public DeviceMNode(IMemMNode parent, String name) {
-    super(new BasicInternalMNode(parent, name), new DeviceInfo<>());
+public interface IInternalMNode<N extends IMNode<N>> extends IMNode<N> {
+
+  IDeviceInfo<N> getDeviceInfo();
+
+  void setDeviceInfo(IDeviceInfo<N> deviceInfo);
+
+  @Override
+  default boolean isDevice() {
+    return getDeviceInfo() != null;
+  }
+
+  @Override
+  default boolean isMeasurement() {
+    return false;
   }
 
   @Override
-  public IMemMNode getAsMNode() {
+  default IInternalMNode<N> getAsInternalMNode() {
     return this;
   }
+
+  @Override
+  default IDeviceMNode<N> getAsDeviceMNode() {
+    if (isDevice()) {
+      return new DeviceMNodeWrapper<>(this);
+    } else {
+      throw new UnsupportedOperationException("Wrong node type");
+    }
+  }
 }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/visitor/MNodeVisitor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/visitor/MNodeVisitor.java
index d156295eb0d..8d4f7209649 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/visitor/MNodeVisitor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/node/visitor/MNodeVisitor.java
@@ -20,9 +20,7 @@
 package org.apache.iotdb.commons.schema.node.visitor;
 
 import org.apache.iotdb.commons.schema.node.IMNode;
-import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseDeviceMNode;
 import org.apache.iotdb.commons.schema.node.common.AbstractDatabaseMNode;
-import org.apache.iotdb.commons.schema.node.common.AbstractDeviceMNode;
 import org.apache.iotdb.commons.schema.node.common.AbstractMeasurementMNode;
 
 public abstract class MNodeVisitor<R, C> {
@@ -32,11 +30,6 @@ public abstract class MNodeVisitor<R, C> {
   public abstract R visitDatabaseMNode(
       AbstractDatabaseMNode<?, ? extends IMNode<?>> node, C context);
 
-  public abstract R visitDatabaseDeviceMNode(
-      AbstractDatabaseDeviceMNode<?, ? extends IMNode<?>> node, C context);
-
-  public abstract R visitDeviceMNode(AbstractDeviceMNode<?, ? extends 
IMNode<?>> node, C context);
-
   public abstract R visitMeasurementMNode(
       AbstractMeasurementMNode<?, ? extends IMNode<?>> node, C context);
 }

Reply via email to