You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/04/12 13:09:35 UTC

[incubator-iotdb] branch tag_manage updated: record alias and add tagIndex in MManager

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

qiaojialin pushed a commit to branch tag_manage
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/tag_manage by this push:
     new 79008ce  record alias and add tagIndex in MManager
79008ce is described below

commit 79008ce7a1be4c0fa19b9cbc0f6e69da6deed13b
Author: qiaojialin <64...@qq.com>
AuthorDate: Sun Apr 12 21:09:17 2020 +0800

    record alias and add tagIndex in MManager
---
 .../iotdb/db/concurrent/WrappedRunnable.java       |   1 -
 .../org/apache/iotdb/db/metadata/MLogWriter.java   | 108 +++++++++++
 .../org/apache/iotdb/db/metadata/MManager.java     | 202 +++++++++------------
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  22 ++-
 .../iotdb/db/metadata/mnode/InternalMNode.java     |   5 +-
 .../apache/iotdb/db/metadata/mnode/LeafMNode.java  |  15 +-
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |   4 +-
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |   7 +-
 .../db/qp/physical/sys/CreateTimeSeriesPlan.java   |  84 ++++++++-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   4 +-
 .../engine/modification/DeletionFileNodeTest.java  |   8 +-
 .../db/engine/modification/DeletionQueryTest.java  |  36 ++--
 .../storagegroup/FileNodeManagerBenchmark.java     |   7 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |  56 ++++--
 .../iotdb/db/metadata/MManagerImproveTest.java     |   6 +-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  50 ++---
 .../apache/iotdb/db/writelog/PerformanceTest.java  |  21 ++-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |   7 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |   8 +-
 .../writelog/recover/UnseqTsFileRecoverTest.java   |  21 ++-
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       |  40 ++++
 21 files changed, 475 insertions(+), 237 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java b/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
index 7b143a3..74eb7f2 100644
--- a/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
+++ b/server/src/main/java/org/apache/iotdb/db/concurrent/WrappedRunnable.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.db.concurrent;
 
 import com.google.common.base.Throwables;
-import org.apache.iotdb.db.sync.receiver.load.FileLoaderManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
new file mode 100644
index 0000000..57b85d0
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MLogWriter.java
@@ -0,0 +1,108 @@
+/*
+ * 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.metadata;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Map;
+import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MLogWriter {
+
+  private static final Logger logger = LoggerFactory.getLogger(MLogWriter.class);
+  private BufferedWriter writer;
+
+  public MLogWriter(String schemaDir, String logFileName) throws IOException {
+    File metadataDir = SystemFileFactory.INSTANCE.getFile(schemaDir);
+    if (!metadataDir.exists()) {
+      if (metadataDir.mkdirs()) {
+        logger.info("create schema folder {}.", metadataDir);
+      } else {
+        logger.info("create schema folder {} failed.", metadataDir);
+      }
+    }
+
+    File logFile = SystemFileFactory.INSTANCE.getFile(schemaDir + File.pathSeparator + logFileName);
+
+    FileWriter fileWriter;
+    fileWriter = new FileWriter(logFile, true);
+    writer = new BufferedWriter(fileWriter);
+  }
+
+
+  public void close() throws IOException {
+    writer.close();
+  }
+
+  public void createTimeseries(CreateTimeSeriesPlan plan) throws IOException {
+    writer.write(String.format("%s,%s,%s,%s,%s", MetadataOperationType.CREATE_TIMESERIES,
+        plan.getPath().getFullPath(), plan.getDataType().serialize(), plan.getEncoding().serialize(),
+        plan.getCompressor().serialize()));
+
+    writer.write(",");
+    if (plan.getAlias() != null) {
+      writer.write(plan.getAlias());
+    }
+
+    writer.write(",");
+    if (plan.getProps() != null) {
+      boolean first = true;
+      for (Map.Entry entry : plan.getProps().entrySet()) {
+        if (first) {
+          writer.write(String.format("%s=%s", entry.getKey(), entry.getValue()));
+          first = false;
+        } else {
+          writer.write(String.format("&%s=%s", entry.getKey(), entry.getValue()));
+        }
+      }
+    }
+
+    writer.newLine();
+    writer.flush();
+  }
+
+  public void deleteTimeseries(String path) throws IOException {
+    writer.write(MetadataOperationType.DELETE_TIMESERIES + "," + path);
+    writer.newLine();
+    writer.flush();
+  }
+
+  public void setStorageGroup(String storageGroup) throws IOException {
+    writer.write(MetadataOperationType.SET_STORAGE_GROUP + "," + storageGroup);
+    writer.newLine();
+    writer.flush();
+  }
+
+  public void deleteStorageGroup(String storageGroup) throws IOException {
+    writer.write(MetadataOperationType.DELETE_STORAGE_GROUP + storageGroup);
+    writer.newLine();
+    writer.flush();
+  }
+
+  public void setTTL(String storageGroup, long ttl) throws IOException {
+    writer.write(String.format("%s,%s,%s", MetadataOperationType.SET_TTL, storageGroup, ttl));
+    writer.newLine();
+    writer.flush();
+  }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 0ae8fbf..73a8248 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -19,10 +19,8 @@
 package org.apache.iotdb.db.metadata;
 
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileReader;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
@@ -34,6 +32,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -53,13 +52,14 @@ import org.apache.iotdb.db.metadata.mnode.MNode;
 import org.apache.iotdb.db.metadata.mnode.StorageGroupMNode;
 import org.apache.iotdb.db.monitor.MonitorConstants;
 import org.apache.iotdb.db.qp.constant.SQLConstant;
+import org.apache.iotdb.db.qp.physical.sys.CreateTimeSeriesPlan;
 import org.apache.iotdb.db.utils.RandomDeleteCache;
 import org.apache.iotdb.db.utils.TestOnly;
-import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.exception.cache.CacheException;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -79,20 +79,30 @@ public class MManager {
   // the log file seriesPath
   private String logFilePath;
   private MTree mtree;
-  private BufferedWriter logWriter;
+  private MLogWriter logWriter;
   private boolean writeToLog;
-  private String schemaDir;
   // device -> DeviceMNode
   private RandomDeleteCache<String, MNode> mNodeCache;
 
+  // tag key -> tag value -> LeafMNode
+  private Map<String, Map<String, Set<LeafMNode>>> tagIndex = new HashMap<>();
+
   private Map<String, Integer> seriesNumberInStorageGroups = new HashMap<>();
   private long maxSeriesNumberAmongStorageGroup;
   private boolean initialized;
   private IoTDBConfig config;
 
+  private static class MManagerHolder {
+    private MManagerHolder() {
+      //allowed to do nothing
+    }
+
+    private static final MManager INSTANCE = new MManager();
+  }
+
   private MManager() {
     config = IoTDBDescriptor.getInstance().getConfig();
-    schemaDir = config.getSchemaDir();
+    String schemaDir = config.getSchemaDir();
     File schemaFolder = SystemFileFactory.INSTANCE.getFile(schemaDir);
     if (!schemaFolder.exists()) {
       if (schemaFolder.mkdirs()) {
@@ -102,6 +112,14 @@ public class MManager {
       }
     }
     logFilePath = schemaDir + File.separator + MetadataConstant.METADATA_LOG;
+
+    try {
+      logWriter = new MLogWriter(schemaDir, MetadataConstant.METADATA_LOG);
+    } catch (IOException e) {
+      throw new RuntimeException("Can not init MLogWriter", e);
+    }
+
+    // do not write log when recover
     writeToLog = false;
 
     int cacheSize = config.getmManagerCacheSize();
@@ -203,19 +221,26 @@ public class MManager {
     switch (args[0]) {
       case MetadataOperationType.CREATE_TIMESERIES:
         Map<String, String> props = null;
-        if (args.length > 5) {
+        if (!args[5].isEmpty()){
+          String[] keyValues = args[5].split("&");
           String[] kv;
-          props = new HashMap<>(args.length - 5 + 1, 1);
-          for (int k = 5; k < args.length; k++) {
-            kv = args[k].split("=");
+          for (String keyValue : keyValues) {
+            kv = keyValue.split("=");
             props.put(kv[0], kv[1]);
           }
         }
 
-        createTimeseries(args[1], TSDataType.deserialize(Short.parseShort(args[2])),
+        String alias = null;
+        if (!args[6].isEmpty()) {
+          alias = args[6];
+        }
+
+        CreateTimeSeriesPlan plan = new CreateTimeSeriesPlan(new Path(args[1]),
+            TSDataType.deserialize(Short.parseShort(args[2])),
             TSEncoding.deserialize(Short.parseShort(args[3])),
             CompressionType.deserialize(Short.parseShort(args[4])),
-            props);
+            props, null, null, alias);
+        createTimeseries(plan);
         break;
       case MetadataOperationType.DELETE_TIMESERIES:
         for (String deleteStorageGroup : deleteTimeseries(args[1])) {
@@ -238,42 +263,9 @@ public class MManager {
     }
   }
 
-  private BufferedWriter getLogWriter() throws IOException {
-    if (logWriter == null) {
-      File logFile = SystemFileFactory.INSTANCE.getFile(logFilePath);
-      File metadataDir = SystemFileFactory.INSTANCE.getFile(schemaDir);
-      if (!metadataDir.exists()) {
-        if (metadataDir.mkdirs()) {
-          logger.info("create schema folder {}.", metadataDir);
-        } else {
-          logger.info("create schema folder {} failed.", metadataDir);
-        }
-      }
-      FileWriter fileWriter;
-      fileWriter = new FileWriter(logFile, true);
-      logWriter = new BufferedWriter(fileWriter);
-    }
-    return logWriter;
-  }
-
-  public void createTimeseries(String path, MeasurementSchema schema) throws MetadataException {
-    createTimeseries(path, schema.getType(), schema.getEncodingType(), schema.getCompressor(),
-        schema.getProps());
-  }
-
-  /**
-   * Add one timeseries to metadata tree, if the timeseries already exists, throw exception
-   *
-   * @param path the timeseries path
-   * @param dataType the dateType {@code DataType} of the timeseries
-   * @param encoding the encoding function {@code Encoding} of the timeseries
-   * @param compressor the compressor function {@code Compressor} of the time series
-   * @return whether the measurement occurs for the first time in this storage group (if true, the
-   * measurement should be registered to the StorageEngine too)
-   */
-  public void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
-      CompressionType compressor, Map<String, String> props) throws MetadataException {
+  public void createTimeseries(CreateTimeSeriesPlan plan) throws MetadataException {
     lock.writeLock().lock();
+    String path = plan.getPath().getFullPath();
     try {
       /*
        * get the storage group with auto create schema
@@ -290,8 +282,33 @@ public class MManager {
         setStorageGroup(storageGroupName);
       }
 
-      // create time series with memory check
-      createTimeseriesWithMemoryCheckAndLog(path, dataType, encoding, compressor, props);
+      // create time series in MTree
+      LeafMNode leafMNode = mtree.createTimeseries(path, plan.getDataType(), plan.getEncoding(),
+          plan.getCompressor(), plan.getProps(), plan.getAlias());
+      try {
+        // check memory
+        IoTDBConfigDynamicAdapter.getInstance().addOrDeleteTimeSeries(1);
+      } catch (ConfigAdjusterException e) {
+        mtree.deleteTimeseriesAndReturnEmptyStorageGroup(path);
+        throw new MetadataException(e);
+      }
+      try {
+        // write to log
+        if (writeToLog) {
+          logWriter.createTimeseries(plan);
+        }
+      } catch (IOException e) {
+        throw new MetadataException(e.getMessage());
+      }
+
+      if (plan.getTags() != null) {
+        // tag key, tag value
+        for (Entry<String, String> entry : plan.getTags().entrySet()) {
+          tagIndex.computeIfAbsent(entry.getKey(), k -> new HashMap<>())
+              .computeIfAbsent(entry.getValue(), v -> new HashSet<>())
+              .add(leafMNode);
+        }
+      }
 
       // update statistics
       int size = seriesNumberInStorageGroups.get(storageGroupName);
@@ -304,53 +321,29 @@ public class MManager {
     }
   }
 
-  @TestOnly
-  public void createTimeseries(String path, String dataType, String encoding)
-      throws MetadataException {
-    lock.writeLock().lock();
-    try {
-      TSDataType tsDataType = TSDataType.valueOf(dataType);
-      TSEncoding tsEncoding = TSEncoding.valueOf(encoding);
-      CompressionType type = TSFileDescriptor.getInstance().getConfig().getCompressor();
-      createTimeseriesWithMemoryCheckAndLog(path, tsDataType, tsEncoding, type,
-          Collections.emptyMap());
-    } finally {
-      lock.writeLock().unlock();
-    }
+  public Set<LeafMNode> queryTimeseriesByTag(String tagKey, String tagValue) {
+    return tagIndex.getOrDefault(tagKey, Collections.emptyMap())
+        .getOrDefault(tagValue, Collections.emptySet());
   }
 
   /**
-   * timeseries will be added to MTree with check memory, and log to file
+   * Add one timeseries to metadata tree, if the timeseries already exists, throw exception
+   *
+   * @param path the timeseries path
+   * @param dataType the dateType {@code DataType} of the timeseries
+   * @param encoding the encoding function {@code Encoding} of the timeseries
+   * @param compressor the compressor function {@code Compressor} of the time series
+   * @return whether the measurement occurs for the first time in this storage group (if true, the
+   * measurement should be registered to the StorageEngine too)
    */
-  private void createTimeseriesWithMemoryCheckAndLog(String timeseries, TSDataType dataType,
-      TSEncoding encoding, CompressionType compressor, Map<String, String> props)
-      throws MetadataException {
-    mtree.createTimeseries(timeseries, dataType, encoding, compressor, props);
-    try {
-      // check memory
-      IoTDBConfigDynamicAdapter.getInstance().addOrDeleteTimeSeries(1);
-    } catch (ConfigAdjusterException e) {
-      mtree.deleteTimeseriesAndReturnEmptyStorageGroup(timeseries);
-      throw new MetadataException(e);
-    }
-    try {
-      if (writeToLog) {
-        BufferedWriter writer = getLogWriter();
-        writer.write(String.format("%s,%s,%s,%s,%s", MetadataOperationType.CREATE_TIMESERIES,
-            timeseries, dataType.serialize(), encoding.serialize(), compressor.serialize()));
-        if (props != null) {
-          for (Map.Entry entry : props.entrySet()) {
-            writer.write(String.format(",%s=%s", entry.getKey(), entry.getValue()));
-          }
-        }
-        writer.newLine();
-        writer.flush();
-      }
-    } catch (IOException e) {
-      throw new MetadataException(e.getMessage());
-    }
+  public void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props) throws MetadataException {
+    createTimeseries(
+        new CreateTimeSeriesPlan(new Path(path), dataType, encoding, compressor, props, null, null,
+            null));
   }
 
+
   /**
    * Delete all timeseries under the given path, may cross different storage group
    *
@@ -400,10 +393,7 @@ public class MManager {
     try {
       String storageGroupName = mtree.deleteTimeseriesAndReturnEmptyStorageGroup(path);
       if (writeToLog) {
-        BufferedWriter writer = getLogWriter();
-        writer.write(MetadataOperationType.DELETE_TIMESERIES + "," + path);
-        writer.newLine();
-        writer.flush();
+        logWriter.deleteTimeseries(path);
       }
       // TODO: delete the path node and all its ancestors
       mNodeCache.clear();
@@ -435,10 +425,7 @@ public class MManager {
     try {
       mtree.setStorageGroup(storageGroup);
       if (writeToLog) {
-        BufferedWriter writer = getLogWriter();
-        writer.write(MetadataOperationType.SET_STORAGE_GROUP + "," + storageGroup);
-        writer.newLine();
-        writer.flush();
+        logWriter.setStorageGroup(storageGroup);
       }
       IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(1);
       ActiveTimeSeriesCounter.getInstance().init(storageGroup);
@@ -461,16 +448,13 @@ public class MManager {
   public void deleteStorageGroups(List<String> storageGroups) throws MetadataException {
     lock.writeLock().lock();
     try {
-      BufferedWriter writer = getLogWriter();
       for (String storageGroup : storageGroups) {
         // try to delete storage group
         mtree.deleteStorageGroup(storageGroup);
 
         // if success
         if (writeToLog) {
-          writer.write(MetadataOperationType.DELETE_STORAGE_GROUP + storageGroup);
-          writer.newLine();
-          writer.flush();
+          logWriter.deleteTimeseries(storageGroup);
         }
         mNodeCache.clear();
         IoTDBConfigDynamicAdapter.getInstance().addOrDeleteStorageGroup(-1);
@@ -777,24 +761,12 @@ public class MManager {
     return maxSeriesNumberAmongStorageGroup;
   }
 
-  private static class MManagerHolder {
-    private MManagerHolder() {
-      //allowed to do nothing
-    }
-
-    private static final MManager INSTANCE = new MManager();
-  }
-
   public void setTTL(String storageGroup, long dataTTL) throws MetadataException, IOException {
     lock.writeLock().lock();
     try {
       getStorageGroupNode(storageGroup).setDataTTL(dataTTL);
       if (writeToLog) {
-        BufferedWriter writer = getLogWriter();
-        writer
-            .write(String.format("%s,%s,%s", MetadataOperationType.SET_TTL, storageGroup, dataTTL));
-        writer.newLine();
-        writer.flush();
+        logWriter.setTTL(storageGroup, dataTTL);
       }
     } finally {
       lock.writeLock().unlock();
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index b243141..12e17be 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -75,9 +75,10 @@ public class MTree implements Serializable {
    * @param encoding encoding
    * @param compressor compressor
    * @param props props
+   * @param alias alias of measurement
    */
-  void createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
-      CompressionType compressor, Map<String, String> props) throws MetadataException {
+  LeafMNode createTimeseries(String path, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props, String alias) throws MetadataException {
     String[] nodeNames = MetaUtils.getNodeNames(path);
     if (nodeNames.length <= 2 || !nodeNames[0].equals(root.getName())) {
       throw new IllegalPathException(path);
@@ -94,7 +95,7 @@ public class MTree implements Serializable {
         if (!hasSetStorageGroup) {
           throw new StorageGroupNotSetException("Storage group should be created first");
         }
-        cur.addChild(new InternalMNode(cur, nodeName));
+        cur.addChild(nodeName, new InternalMNode(cur, nodeName));
       }
       cur = cur.getChild(nodeName);
     }
@@ -105,8 +106,13 @@ public class MTree implements Serializable {
     if (cur.hasChild(leafName)) {
       throw new PathAlreadyExistException(path);
     }
-    MNode leaf = new LeafMNode(cur, leafName, dataType, encoding, compressor, props);
-    cur.addChild(leaf);
+    MNode leaf = new LeafMNode(cur, leafName, alias, dataType, encoding, compressor, props);
+    cur.addChild(leafName, leaf);
+    // link alias to LeafMNode
+    if (alias != null) {
+      cur.addChild(alias, leaf);
+    }
+    return (LeafMNode) leaf;
   }
 
   /**
@@ -122,7 +128,7 @@ public class MTree implements Serializable {
     MNode cur = root;
     for (int i = 1; i < nodeNames.length; i++) {
       if (!cur.hasChild(nodeNames[i])) {
-        cur.addChild(new InternalMNode(cur, nodeNames[i]));
+        cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
       }
       cur = cur.getChild(nodeNames[i]);
     }
@@ -167,7 +173,7 @@ public class MTree implements Serializable {
     while (i < nodeNames.length - 1) {
       MNode temp = cur.getChild(nodeNames[i]);
       if (temp == null) {
-        cur.addChild(new InternalMNode(cur, nodeNames[i]));
+        cur.addChild(nodeNames[i], new InternalMNode(cur, nodeNames[i]));
       } else if (temp instanceof StorageGroupMNode) {
         // before set storage group, check whether the exists or not
         throw new StorageGroupAlreadySetException(temp.getFullPath());
@@ -181,7 +187,7 @@ public class MTree implements Serializable {
     } else {
       StorageGroupMNode storageGroupMNode = new StorageGroupMNode(cur, nodeNames[i], path,
           IoTDBDescriptor.getInstance().getConfig().getDefaultTTL());
-      cur.addChild(storageGroupMNode);
+      cur.addChild(nodeNames[i], storageGroupMNode);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
index 4074b8b..2e8d2ed 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
@@ -38,10 +38,11 @@ public class InternalMNode extends MNode {
   }
 
   @Override
-  public void addChild(MNode child) {
-    this.children.put(child.getName(), child);
+  public void addChild(String name, MNode child) {
+    children.put(name, child);
   }
 
+
   @Override
   public void deleteChild(String name) {
     children.remove(name);
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
index 1d72854..2463bed 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/LeafMNode.java
@@ -34,13 +34,18 @@ public class LeafMNode extends MNode {
    * measurement's Schema for one timeseries represented by current leaf node
    */
   private MeasurementSchema schema;
+  private String alias;
 
   private TimeValuePair cachedLastValuePair = null;
 
-  public LeafMNode(MNode parent, String name, TSDataType dataType, TSEncoding encoding,
-      CompressionType type, Map<String, String> props) {
-    super(parent, name);
-    this.schema = new MeasurementSchema(name, dataType, encoding, type, props);
+  /**
+   * @param alias alias of measurementName
+   */
+  public LeafMNode(MNode parent, String measurementName, String alias, TSDataType dataType,
+      TSEncoding encoding, CompressionType type, Map<String, String> props) {
+    super(parent, measurementName);
+    this.schema = new MeasurementSchema(measurementName, dataType, encoding, type, props);
+    this.alias = alias;
   }
 
   @Override
@@ -49,7 +54,7 @@ public class LeafMNode extends MNode {
   }
 
   @Override
-  public void addChild(MNode child) {
+  public void addChild(String name, MNode child) {
     // Do nothing
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
index d653bb1..95b2efc 100644
--- a/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/metadata/mnode/MNode.java
@@ -56,9 +56,9 @@ public abstract class MNode implements Serializable {
   public abstract boolean hasChild(String name);
 
   /**
-   * add the given child
+   * node key, name or alias
    */
-  public abstract void addChild(MNode child);
+  public abstract void addChild(String name, MNode chile);
 
   /**
    * delete a child
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index efec48a..2e61456 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -881,13 +881,8 @@ public class PlanExecutor implements IPlanExecutor {
 
   private boolean createTimeSeries(CreateTimeSeriesPlan createTimeSeriesPlan)
       throws QueryProcessException {
-    Path path = createTimeSeriesPlan.getPath();
-    TSDataType dataType = createTimeSeriesPlan.getDataType();
-    CompressionType compressor = createTimeSeriesPlan.getCompressor();
-    TSEncoding encoding = createTimeSeriesPlan.getEncoding();
-    Map<String, String> props = createTimeSeriesPlan.getAttributes();
     try {
-      mManager.createTimeseries(path.getFullPath(), dataType, encoding, compressor, props);
+      mManager.createTimeseries(createTimeSeriesPlan);
     } catch (MetadataException e) {
       throw new QueryProcessException(e);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
index 2980aed..b10091c 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/CreateTimeSeriesPlan.java
@@ -22,8 +22,10 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
@@ -31,6 +33,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 public class CreateTimeSeriesPlan extends PhysicalPlan {
 
@@ -39,8 +42,9 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
   private TSEncoding encoding;
   private CompressionType compressor;
   private String alias;
-  private Map<String, String> attributes;
+  private Map<String, String> props;
   private Map<String, String> tags;
+  private Map<String, String> attributes;
 
   public CreateTimeSeriesPlan() {
     super(false, Operator.OperatorType.CREATE_TIMESERIES);
@@ -48,14 +52,16 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
   }
 
   public CreateTimeSeriesPlan(Path path, TSDataType dataType, TSEncoding encoding,
-      CompressionType compressor, Map<String, String> attributes, Map<String, String> tags, String alias) {
+      CompressionType compressor, Map<String, String> props, Map<String, String> tags,
+      Map<String, String> attributes, String alias) {
     super(false, Operator.OperatorType.CREATE_TIMESERIES);
     this.path = path;
     this.dataType = dataType;
     this.encoding = encoding;
     this.compressor = compressor;
-    this.attributes = attributes;
+    this.props = props;
     this.tags = tags;
+    this.attributes = attributes;
     this.alias = alias;
     canbeSplit = false;
   }
@@ -116,6 +122,14 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
     this.tags = tags;
   }
 
+  public Map<String, String> getProps() {
+    return props;
+  }
+
+  public void setProps(Map<String, String> props) {
+    this.props = props;
+  }
+
   @Override
   public String toString() {
     return String.format("seriesPath: %s, resultDataType: %s, encoding: %s, compression: %s", path,
@@ -130,23 +144,75 @@ public class CreateTimeSeriesPlan extends PhysicalPlan {
   @Override
   public void serializeTo(DataOutputStream stream) throws IOException {
     stream.writeByte((byte) PhysicalPlanType.CREATE_TIMESERIES.ordinal());
-    byte[] pathBytes = path.getFullPath().getBytes();
-    stream.writeInt(pathBytes.length);
-    stream.write(pathBytes);
+    byte[] bytes = path.getFullPath().getBytes();
+    stream.writeInt(bytes.length);
+    stream.write(bytes);
     stream.write(dataType.ordinal());
     stream.write(encoding.ordinal());
     stream.write(compressor.ordinal());
+
+    // alias
+    if (alias != null) {
+      stream.write(1);
+      ReadWriteIOUtils.write(alias, stream);
+    } else {
+      stream.write(0);
+    }
+
+    // props
+    if (props != null && !props.isEmpty()) {
+      stream.write(1);
+      ReadWriteIOUtils.write(props, stream);
+    } else {
+      stream.write(0);
+    }
+
+    // tags
+    if (tags != null && !tags.isEmpty()) {
+      stream.write(1);
+      ReadWriteIOUtils.write(tags, stream);
+    } else {
+      stream.write(0);
+    }
+
+    // attributes
+    if (attributes != null && !attributes.isEmpty()) {
+      stream.write(1);
+      ReadWriteIOUtils.write(attributes, stream);
+    } else {
+      stream.write(0);
+    }
   }
 
   @Override
   public void deserializeFrom(ByteBuffer buffer) {
     int length = buffer.getInt();
-    byte[] pathBytes = new byte[length];
-    buffer.get(pathBytes);
-    path = new Path(new String(pathBytes));
+    byte[] bytes = new byte[length];
+    buffer.get(bytes);
+    path = new Path(new String(bytes));
     dataType = TSDataType.values()[buffer.get()];
     encoding = TSEncoding.values()[buffer.get()];
     compressor = CompressionType.values()[buffer.get()];
+
+    // alias
+    if (buffer.get() == 1) {
+      alias = ReadWriteIOUtils.readString(buffer);
+    }
+
+    // props
+    if (buffer.get() == 1) {
+      props = ReadWriteIOUtils.readMap(buffer);
+    }
+
+    // tags
+    if (buffer.get() == 1) {
+      tags = ReadWriteIOUtils.readMap(buffer);
+    }
+
+    // attributes
+    if (buffer.get() == 1) {
+      attributes = ReadWriteIOUtils.readMap(buffer);
+    }
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 8206025..9b30ecf 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -77,8 +77,8 @@ public class PhysicalGenerator {
       case CREATE_TIMESERIES:
         CreateTimeSeriesOperator addPath = (CreateTimeSeriesOperator) operator;
         return new CreateTimeSeriesPlan(addPath.getPath(), addPath.getDataType(),
-            addPath.getEncoding(), addPath.getCompressor(), addPath.getAttributes(),
-            addPath.getTags(), addPath.getAlias());
+            addPath.getEncoding(), addPath.getCompressor(), Collections.emptyMap(),
+            addPath.getTags(), addPath.getAttributes(), addPath.getAlias());
       case DELETE_TIMESERIES:
         DeleteTimeSeriesOperator deletePath = (DeleteTimeSeriesOperator) operator;
         return new DeleteTimeSeriesPlan(deletePath.getDeletePathList());
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
index 1bdf211..af34b0d 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
@@ -27,6 +27,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.StorageEngine;
@@ -40,6 +41,7 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -56,8 +58,8 @@ public class DeletionFileNodeTest {
   private String processorName = "root.test";
 
   private static String[] measurements = new String[10];
-  private String dataType = TSDataType.DOUBLE.toString();
-  private String encoding = TSEncoding.PLAIN.toString();
+  private TSDataType dataType = TSDataType.DOUBLE;
+  private TSEncoding encoding = TSEncoding.PLAIN;
 
   static {
     for (int i = 0; i < 10; i++) {
@@ -72,7 +74,7 @@ public class DeletionFileNodeTest {
     MManager.getInstance().setStorageGroup(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().createTimeseries(processorName + "." + measurements[i], dataType,
-          encoding);
+          encoding, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     }
   }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
index 4ef2e0b..5899108 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
@@ -52,8 +52,8 @@ public class DeletionQueryTest {
   private String processorName = "root.test";
 
   private static String[] measurements = new String[10];
-  private String dataType = TSDataType.DOUBLE.toString();
-  private String encoding = TSEncoding.PLAIN.toString();
+  private TSDataType dataType = TSDataType.DOUBLE;
+  private TSEncoding encoding = TSEncoding.PLAIN;
   private QueryRouter router = new QueryRouter();
 
   static {
@@ -69,7 +69,7 @@ public class DeletionQueryTest {
     MManager.getInstance().setStorageGroup(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().createTimeseries(processorName + "." + measurements[i], dataType,
-          encoding);
+          encoding, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     }
   }
 
@@ -100,9 +100,9 @@ public class DeletionQueryTest {
     pathList.add(new Path(processorName, measurements[4]));
     pathList.add(new Path(processorName, measurements[5]));
     List<TSDataType> dataTypes = new ArrayList<>();
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
 
     RawDataQueryPlan queryPlan = new RawDataQueryPlan();
     queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -139,9 +139,9 @@ public class DeletionQueryTest {
     pathList.add(new Path(processorName, measurements[5]));
 
     List<TSDataType> dataTypes = new ArrayList<>();
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
 
     RawDataQueryPlan queryPlan = new RawDataQueryPlan();
     queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -188,9 +188,9 @@ public class DeletionQueryTest {
     pathList.add(new Path(processorName, measurements[4]));
     pathList.add(new Path(processorName, measurements[5]));
     List<TSDataType> dataTypes = new ArrayList<>();
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
 
     RawDataQueryPlan queryPlan = new RawDataQueryPlan();
     queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -238,9 +238,9 @@ public class DeletionQueryTest {
     pathList.add(new Path(processorName, measurements[5]));
 
     List<TSDataType> dataTypes = new ArrayList<>();
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
 
     RawDataQueryPlan queryPlan = new RawDataQueryPlan();
     queryPlan.setDeduplicatedDataTypes(dataTypes);
@@ -308,9 +308,9 @@ public class DeletionQueryTest {
     pathList.add(new Path(processorName, measurements[4]));
     pathList.add(new Path(processorName, measurements[5]));
     List<TSDataType> dataTypes = new ArrayList<>();
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
-    dataTypes.add(TSDataType.valueOf(dataType));
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
+    dataTypes.add(dataType);
 
     RawDataQueryPlan queryPlan = new RawDataQueryPlan();
     queryPlan.setDeduplicatedDataTypes(dataTypes);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
index 99199ac..b2d091e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.engine.storagegroup;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.iotdb.db.engine.StorageEngine;
@@ -28,6 +29,7 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.RandomNum;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
@@ -67,8 +69,9 @@ public class FileNodeManagerBenchmark {
     manager.setStorageGroup(prefix);
     for (String device : devices) {
       for (String measurement : measurements) {
-        manager.createTimeseries(device + "." + measurement, TSDataType.INT64.toString(),
-            TSEncoding.PLAIN.toString());
+        manager.createTimeseries(device + "." + measurement, TSDataType.INT64,
+            TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections
+                .emptyMap());
       }
     }
   }
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 87c7c84..877580f 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -22,13 +22,16 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.exception.WriteProcessException;
 import org.apache.iotdb.db.metadata.mnode.LeafMNode;
 import org.apache.iotdb.db.metadata.mnode.MNode;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 import org.junit.After;
@@ -50,19 +53,31 @@ public class MManagerAdvancedTest {
     mmanager.setStorageGroup("root.vehicle.d1");
     mmanager.setStorageGroup("root.vehicle.d2");
 
-    mmanager.createTimeseries("root.vehicle.d0.s0", "INT32", "RLE");
-    mmanager.createTimeseries("root.vehicle.d0.s1", "INT64", "RLE");
-    mmanager.createTimeseries("root.vehicle.d0.s2", "FLOAT", "RLE");
-    mmanager.createTimeseries("root.vehicle.d0.s3", "DOUBLE", "RLE");
-    mmanager.createTimeseries("root.vehicle.d0.s4", "BOOLEAN", "PLAIN");
-    mmanager.createTimeseries("root.vehicle.d0.s5", "TEXT", "PLAIN");
-
-    mmanager.createTimeseries("root.vehicle.d1.s0", "INT32", "RLE");
-    mmanager.createTimeseries("root.vehicle.d1.s1", "INT64", "RLE");
-    mmanager.createTimeseries("root.vehicle.d1.s2", "FLOAT", "RLE");
-    mmanager.createTimeseries("root.vehicle.d1.s3", "DOUBLE", "RLE");
-    mmanager.createTimeseries("root.vehicle.d1.s4", "BOOLEAN", "PLAIN");
-    mmanager.createTimeseries("root.vehicle.d1.s5", "TEXT", "PLAIN");
+    mmanager.createTimeseries("root.vehicle.d0.s0", TSDataType.INT32, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d0.s1", TSDataType.INT64, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d0.s2", TSDataType.FLOAT, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d0.s3", TSDataType.DOUBLE, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d0.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d0.s5", TSDataType.TEXT, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+
+    mmanager.createTimeseries("root.vehicle.d1.s0", TSDataType.INT32, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d1.s1", TSDataType.INT64, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d1.s2", TSDataType.FLOAT, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d1.s3", TSDataType.DOUBLE, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d1.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d1.s5", TSDataType.TEXT, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
 
   }
 
@@ -105,10 +120,14 @@ public class MManagerAdvancedTest {
 
   @Test
   public void testCache() throws MetadataException {
-    mmanager.createTimeseries("root.vehicle.d2.s0", "DOUBLE", "RLE");
-    mmanager.createTimeseries("root.vehicle.d2.s1", "BOOLEAN", "PLAIN");
-    mmanager.createTimeseries("root.vehicle.d2.s2.g0", "TEXT", "PLAIN");
-    mmanager.createTimeseries("root.vehicle.d2.s3", "TEXT", "PLAIN");
+    mmanager.createTimeseries("root.vehicle.d2.s0", TSDataType.DOUBLE, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d2.s1", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d2.s2.g0", TSDataType.TEXT, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    mmanager.createTimeseries("root.vehicle.d2.s3", TSDataType.TEXT, TSEncoding.PLAIN,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
 
     MNode node = mmanager.getNodeByPath("root.vehicle.d0");
     Assert.assertEquals(TSDataType.INT32, ((LeafMNode) node.getChild("s0")).getSchema().getType());
@@ -123,7 +142,8 @@ public class MManagerAdvancedTest {
 
   @Test
   public void testCachedLastTimeValue() throws MetadataException {
-    mmanager.createTimeseries("root.vehicle.d2.s0", "DOUBLE", "RLE");
+    mmanager.createTimeseries("root.vehicle.d2.s0", TSDataType.DOUBLE, TSEncoding.RLE,
+        TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
 
     TimeValuePair tv1 = new TimeValuePair(1000, TsPrimitiveType.getByType(TSDataType.DOUBLE, 1.0));
     TimeValuePair tv2 = new TimeValuePair(2000, TsPrimitiveType.getByType(TSDataType.DOUBLE, 3.0));
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
index bfccd56..1169dab 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -31,8 +32,10 @@ import org.apache.iotdb.db.exception.WriteProcessException;
 import org.apache.iotdb.db.metadata.mnode.LeafMNode;
 import org.apache.iotdb.db.metadata.mnode.MNode;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.exception.cache.CacheException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -56,7 +59,8 @@ public class MManagerImproveTest {
     for (int j = 0; j < DEVICE_NUM; j++) {
       for (int i = 0; i < TIMESERIES_NUM; i++) {
         String p = "root.t1.v2.d" + j + ".s" + i;
-        mManager.createTimeseries(p, "TEXT", "RLE");
+        mManager.createTimeseries(p, TSDataType.TEXT, TSEncoding.RLE,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
       }
     }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index 4eada5e..addfe99 100644
--- a/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -55,7 +55,7 @@ public class MTreeTest {
     root.setStorageGroup("root.laptop");
     try {
       root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
     } catch (MetadataException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -63,7 +63,7 @@ public class MTreeTest {
     boolean hasException = false;
     try {
       root.createTimeseries("root.laptop.d1.s1.b", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
     } catch (MetadataException e) {
       hasException = true;
     }
@@ -79,7 +79,7 @@ public class MTreeTest {
     assertFalse(root.isPathExist("root.laptop.d1"));
     try {
       root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
     } catch (MetadataException e1) {
       fail(e1.getMessage());
     }
@@ -88,7 +88,7 @@ public class MTreeTest {
     assertFalse(root.isPathExist("root.laptop.d1.s2"));
     try {
       root.createTimeseries("aa.bb.cc", TSDataType.INT32, TSEncoding.RLE,
-          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
     } catch (MetadataException e) {
       Assert.assertEquals(String.format("%s is not a legal path", "aa.bb.cc"),
           e.getMessage());
@@ -103,21 +103,21 @@ public class MTreeTest {
       assertFalse(root.checkStorageGroupByPath("root.a.d0"));
       root.setStorageGroup("root.a.d0");
       root.createTimeseries("root.a.d0.s0", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
       root.createTimeseries("root.a.d0.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
 
       assertFalse(root.isPathExist("root.a.d1"));
       assertFalse(root.checkStorageGroupByPath("root.a.d1"));
       root.setStorageGroup("root.a.d1");
       root.createTimeseries("root.a.d1.s0", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
       root.createTimeseries("root.a.d1.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
 
       root.setStorageGroup("root.a.b.d0");
       root.createTimeseries("root.a.b.d0.s0", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
 
     } catch (MetadataException e1) {
       e1.printStackTrace();
@@ -149,35 +149,35 @@ public class MTreeTest {
 
       root.setStorageGroup("root.a.d0");
       root.createTimeseries("root.a.d0.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
       root.createTimeseries("root.a.d0.s1", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       root.setStorageGroup("root.a.d1");
       root.createTimeseries("root.a.d1.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
       root.createTimeseries("root.a.d1.s1", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       root.setStorageGroup("root.a.b.d0");
       root.createTimeseries("root.a.b.d0.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       root1.setStorageGroup("root.a.d0");
       root1.createTimeseries("root.a.d0.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
       root1.createTimeseries("root.a.d0.s1", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       root2.setStorageGroup("root.a.d1");
       root2.createTimeseries("root.a.d1.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
       root2.createTimeseries("root.a.d1.s1", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       root3.setStorageGroup("root.a.b.d0");
       root3.createTimeseries("root.a.b.d0.s0", TSDataType.valueOf("INT32"),
-          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap(), null);
 
       String[] metadatas = new String[3];
       metadatas[0] = root1.toString();
@@ -227,16 +227,16 @@ public class MTreeTest {
     try {
       assertEquals("root.laptop.d1", root.getStorageGroupName("root.laptop.d1.s0"));
       root.createTimeseries("root.laptop.d1.s0", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
       assertEquals("root.laptop.d1", root.getStorageGroupName("root.laptop.d1.s1"));
       root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
       assertEquals("root.laptop.d2", root.getStorageGroupName("root.laptop.d2.s0"));
       root.createTimeseries("root.laptop.d2.s0", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
       assertEquals("root.laptop.d2", root.getStorageGroupName("root.laptop.d2.s1"));
       root.createTimeseries("root.laptop.d2.s1", TSDataType.INT32, TSEncoding.RLE,
-              TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP);
+          TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.EMPTY_MAP, null);
     } catch (MetadataException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -296,9 +296,9 @@ public class MTreeTest {
       root.setStorageGroup("root.laptop.d1");
       root.setStorageGroup("root.laptop.d2");
       root.createTimeseries("root.laptop.d1.s1", TSDataType.INT32, TSEncoding.PLAIN,
-          CompressionType.GZIP, null);
+          CompressionType.GZIP, null, null);
       root.createTimeseries("root.laptop.d1.s2", TSDataType.INT32, TSEncoding.PLAIN,
-          CompressionType.GZIP, null);
+          CompressionType.GZIP, null, null);
 
       List<String> list = new ArrayList<>();
 
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
index 432d527..b118f05 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.writelog;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Collections;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -31,6 +32,7 @@ import org.apache.iotdb.db.qp.physical.crud.UpdatePlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.node.ExclusiveWriteLogNode;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -129,17 +131,18 @@ public class PerformanceTest {
       MManager.getInstance().setStorageGroup("root.logTestDevice");
     } catch (MetadataException ignored) {
     }
-    MManager.getInstance().createTimeseries("root.logTestDevice.s1",
-        TSDataType.DOUBLE.name(),
-        TSEncoding.PLAIN.name());
     MManager.getInstance()
-        .createTimeseries("root.logTestDevice.s2", TSDataType.INT32.name(),
-            TSEncoding.PLAIN.name());
+        .createTimeseries("root.logTestDevice.s1", TSDataType.DOUBLE, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     MManager.getInstance()
-        .createTimeseries("root.logTestDevice.s3", TSDataType.TEXT.name(),
-            TSEncoding.PLAIN.name());
-    MManager.getInstance().createTimeseries("root.logTestDevice.s4", TSDataType.BOOLEAN.name(),
-        TSEncoding.PLAIN.name());
+        .createTimeseries("root.logTestDevice.s2", TSDataType.INT32, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    MManager.getInstance()
+        .createTimeseries("root.logTestDevice.s3", TSDataType.TEXT, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
+    MManager.getInstance()
+        .createTimeseries("root.logTestDevice.s4", TSDataType.BOOLEAN, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     WriteLogNode logNode = new ExclusiveWriteLogNode("root.logTestDevice");
 
     for (int i = 0; i < 1000000; i++) {
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
index 77cfac1..fc1005c 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/LogReplayerTest.java
@@ -45,6 +45,7 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.reader.IPointReader;
@@ -92,8 +93,10 @@ public class LogReplayerTest {
     try {
       for (int i = 0; i < 5; i++) {
         for (int j = 0; j < 5; j++) {
-          MManager.getInstance().createTimeseries("root.sg.device" + i + ".sensor" + j,
-              new MeasurementSchema("sensor" + j, TSDataType.INT64, TSEncoding.PLAIN));
+          MManager.getInstance()
+              .createTimeseries("root.sg.device" + i + ".sensor" + j, TSDataType.INT64,
+                  TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(),
+                  Collections.emptyMap());
         }
       }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index 3c2a38b..5c51d9a 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -26,6 +26,7 @@ import static org.junit.Assert.assertTrue;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +44,7 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
@@ -96,8 +98,10 @@ public class SeqTsFileRecoverTest {
     MManager.getInstance().setStorageGroup("root.sg");
     for (int i = 0; i < 10; i++) {
       for (int j = 0; j < 10; j++) {
-        MManager.getInstance().createTimeseries("root.sg.device" + i + ".sensor" + j,
-            new MeasurementSchema("sensor" + i, TSDataType.INT64, TSEncoding.PLAIN));
+        MManager.getInstance()
+            .createTimeseries("root.sg.device" + i + ".sensor" + j, TSDataType.INT64,
+                TSEncoding.PLAIN, TSFileDescriptor.getInstance().getConfig().getCompressor(),
+                Collections.emptyMap());
       }
     }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
index a1ae8bd..b285dd0 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/UnseqTsFileRecoverTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.writelog.recover;
 
+import java.util.Collections;
 import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.conf.adapter.ActiveTimeSeriesCounter;
 import org.apache.iotdb.db.constant.TestConstant;
@@ -35,6 +36,7 @@ import org.apache.iotdb.db.query.reader.universal.PriorityMergeReader;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
+import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -96,21 +98,26 @@ public class UnseqTsFileRecoverTest {
         Path path = new Path(("root.sg.device" + i), ("sensor" + j));
         MeasurementSchema measurementSchema = new MeasurementSchema("sensor" + j, TSDataType.INT64, TSEncoding.PLAIN);
         schema.registerTimeseries(path, measurementSchema);
-        MManager.getInstance().createTimeseries(path.getFullPath(), measurementSchema);
+        MManager.getInstance().createTimeseries(path.getFullPath(), measurementSchema.getType(),
+            measurementSchema.getEncodingType(), measurementSchema.getCompressor(),
+            measurementSchema.getProps());
       }
     }
     schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor4")),
         new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
-    MManager.getInstance().createTimeseries("root.sg.device99.sensor4",
-        new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+    MManager.getInstance()
+        .createTimeseries("root.sg.device99.sensor4", TSDataType.INT64, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor2")),
         new MeasurementSchema("sensor2", TSDataType.INT64, TSEncoding.PLAIN));
-    MManager.getInstance().createTimeseries("root.sg.device99.sensor2",
-        new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+    MManager.getInstance()
+        .createTimeseries("root.sg.device99.sensor2", TSDataType.INT64, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     schema.registerTimeseries(new Path(("root.sg.device99"), ("sensor1")),
         new MeasurementSchema("sensor1", TSDataType.INT64, TSEncoding.PLAIN));
-    MManager.getInstance().createTimeseries("root.sg.device99.sensor1",
-        new MeasurementSchema("sensor4", TSDataType.INT64, TSEncoding.PLAIN));
+    MManager.getInstance()
+        .createTimeseries("root.sg.device99.sensor1", TSDataType.INT64, TSEncoding.PLAIN,
+            TSFileDescriptor.getInstance().getConfig().getCompressor(), Collections.emptyMap());
     writer = new TsFileWriter(tsF, schema);
 
     TSRecord tsRecord = new TSRecord(100, "root.sg.device99");
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
index 48997b7..35dbf4f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/utils/ReadWriteIOUtils.java
@@ -36,7 +36,10 @@ import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -120,6 +123,28 @@ public class ReadWriteIOUtils {
     return readBool(buffer);
   }
 
+  public static int write(Map<String, String> map, DataOutputStream stream) throws IOException {
+    int length = 0;
+    byte[] bytes;
+    stream.write(map.size());
+    length += 4;
+    for (Entry<String, String> entry : map.entrySet()) {
+      bytes = entry.getKey().getBytes();
+      stream.write(bytes.length);
+      length += 4;
+      stream.write(bytes);
+      length += bytes.length;
+      bytes = entry.getValue().getBytes();
+      stream.write(bytes.length);
+      length += 4;
+      stream.write(bytes);
+      length += bytes.length;
+    }
+    return length;
+  }
+
+
+
   /**
    * write a int value to outputStream according to flag. If flag is true, write 1, else write 0.
    */
@@ -553,6 +578,21 @@ public class ReadWriteIOUtils {
     return bytes;
   }
 
+
+  public static Map<String, String> readMap(ByteBuffer buffer) {
+    int length = readInt(buffer);
+    Map<String, String> map = new HashMap<>(length);
+    for (int i = 0; i < length; i++) {
+      // key
+      String key = readString(buffer);
+      // value
+      String value = readString(buffer);
+      map.put(key, value);
+    }
+    return map;
+  }
+
+
   /**
    * unlike InputStream.read(bytes), this method makes sure that you can read length bytes or reach
    * to the end of the stream.