You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2019/02/28 18:35:31 UTC

[incubator-iotdb] branch fix_31_props_in_filenode created (now 4774c34)

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

hxd pushed a change to branch fix_31_props_in_filenode
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git.


      at 4774c34  fix #31. add props of a time series declarison into FileNodeProcessor; pick Compressor out of props

This branch includes the following new commits:

     new 4774c34  fix #31. add props of a time series declarison into FileNodeProcessor; pick Compressor out of props

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[incubator-iotdb] 01/01: fix #31. add props of a time series declarison into FileNodeProcessor; pick Compressor out of props

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4774c34ba7d2b0ed7f312687b963d2251c6a76f5
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Fri Mar 1 02:30:03 2019 +0800

    fix #31. add props of a time series declarison into FileNodeProcessor; pick Compressor out of props
---
 .../antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g |   1 +
 .../org/apache/iotdb/db/sql/parse/TSParser.g       |   5 +-
 .../iotdb/db/engine/filenode/FileNodeManager.java  |   9 +-
 .../db/engine/filenode/FileNodeProcessor.java      |  34 ++---
 .../org/apache/iotdb/db/metadata/ColumnSchema.java | 166 ++++++++++-----------
 .../java/org/apache/iotdb/db/metadata/MGraph.java  |  32 ++--
 .../org/apache/iotdb/db/metadata/MManager.java     |  85 +++++++----
 .../java/org/apache/iotdb/db/metadata/MNode.java   |  17 ++-
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  71 +++++----
 .../org/apache/iotdb/db/metadata/Metadata.java     |   9 +-
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |   9 +-
 .../iotdb/db/qp/executor/OverflowQPExecutor.java   |  30 ++--
 .../iotdb/db/qp/logical/sys/MetadataOperator.java  |  35 +++--
 .../iotdb/db/qp/physical/sys/MetadataPlan.java     |  48 +++---
 .../iotdb/db/qp/strategy/LogicalGenerator.java     |  31 +++-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   4 +-
 .../java/org/apache/iotdb/db/service/Utils.java    |  40 -----
 .../org/apache/iotdb/db/utils/FileSchemaUtils.java |  49 +-----
 .../org/apache/iotdb/db/utils/LoadDataUtils.java   |   4 +-
 .../iotdb/db/engine/MetadataManagerHelper.java     | 114 +++++++++-----
 .../filenodev2/FileNodeManagerBenchmark.java       |   2 +-
 .../memcontrol/BufferwriteFileSizeControlTest.java |  46 +-----
 .../memcontrol/BufferwriteMetaSizeControlTest.java |  45 +-----
 .../engine/modification/DeletionFileNodeTest.java  |  11 +-
 .../db/engine/modification/DeletionQueryTest.java  |  11 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |  44 +++---
 .../iotdb/db/metadata/MManagerBasicTest.java       |  39 +++--
 .../iotdb/db/metadata/MManagerEfficiencyTest.java  |   3 +-
 .../iotdb/db/metadata/MManagerImproveTest.java     |   4 +-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  26 ++--
 .../apache/iotdb/db/writelog/PerformanceTest.java  |  10 +-
 .../iotdb/db/writelog/WriteLogNodeManagerTest.java |   8 +-
 .../apache/iotdb/tsfile/compress/ICompressor.java  |   4 +-
 .../tsfile/encoding/encoder/TSEncodingBuilder.java |   2 +-
 .../tsfile/write/schema/MeasurementSchema.java     |  29 ++--
 35 files changed, 545 insertions(+), 532 deletions(-)

diff --git a/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g b/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
index df7a7bc..f95bc92 100644
--- a/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
+++ b/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSLexer.g
@@ -37,6 +37,7 @@ KW_QUIT: 'QUIT';
 KW_METADATA: 'METADATA';
 KW_DATATYPE: 'DATATYPE';
 KW_ENCODING: 'ENCODING';
+KW_COMPRESSOR: 'COMPRESSOR';
 KW_ROOT: 'ROOT';
 KW_STORAGE: 'STORAGE';
 
diff --git a/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g b/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
index 84be5d0..b9a5bd0 100644
--- a/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
+++ b/iotdb/src/main/antlr3/org/apache/iotdb/db/sql/parse/TSParser.g
@@ -88,6 +88,7 @@ TOK_WITH;
 TOK_ROOT;
 TOK_DATATYPE;
 TOK_ENCODING;
+TOK_COMPRESSOR;
 TOK_CLAUSE;
 TOK_TIMESERIES;
 TOK_SET;
@@ -395,8 +396,8 @@ timeseries
   ;
 
 propertyClauses
-  : KW_DATATYPE EQUAL propertyName=identifier COMMA KW_ENCODING EQUAL pv=propertyValue (COMMA propertyClause)*
-  -> ^(TOK_DATATYPE $propertyName) ^(TOK_ENCODING $pv) propertyClause*
+  : KW_DATATYPE EQUAL propertyName=identifier COMMA KW_ENCODING EQUAL pv=propertyValue (COMMA KW_COMPRESSOR EQUAL compressor=propertyValue)? (COMMA propertyClause)*
+  -> ^(TOK_DATATYPE $propertyName) ^(TOK_ENCODING $pv) ^(TOK_COMPRESSOR $compressor)? propertyClause*
   ;
 
 propertyClause
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeManager.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeManager.java
index 2ce0ec4..e1718ce 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeManager.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeManager.java
@@ -61,7 +61,9 @@ import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
 import org.apache.iotdb.db.writelog.node.WriteLogNode;
 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;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.apache.iotdb.tsfile.read.expression.impl.SingleSeriesExpression;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
@@ -932,16 +934,17 @@ public class FileNodeManager implements IStatistic, IService {
   /**
    * add time series.
    */
-  public void addTimeSeries(Path path, String dataType, String encoding)
-      throws FileNodeManagerException {
+  public void addTimeSeries(Path path, TSDataType dataType, TSEncoding encoding, CompressionType compressor,
+      Map<String, String> props) throws FileNodeManagerException {
     FileNodeProcessor fileNodeProcessor = getProcessor(path.getFullPath(), true);
     try {
-      fileNodeProcessor.addTimeSeries(path.getMeasurement(), dataType, encoding);
+      fileNodeProcessor.addTimeSeries(path.getMeasurement(), dataType, encoding, compressor, props);
     } finally {
       fileNodeProcessor.writeUnlock();
     }
   }
 
+
   /**
    * Force to close the filenode processor.
    */
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeProcessor.java
index 7cdeecb..1bc385e 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/filenode/FileNodeProcessor.java
@@ -69,7 +69,6 @@ import org.apache.iotdb.db.exception.FileNodeProcessorException;
 import org.apache.iotdb.db.exception.OverflowProcessorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.monitor.IStatistic;
 import org.apache.iotdb.db.monitor.MonitorConstants;
@@ -85,6 +84,7 @@ import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
+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;
@@ -107,7 +107,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static java.time.ZonedDateTime.ofInstant;
-import static org.apache.iotdb.db.utils.FileSchemaUtils.constructJsonFileSchema;
 
 public class FileNodeProcessor extends Processor implements IStatistic {
 
@@ -912,11 +911,10 @@ public class FileNodeProcessor extends Processor implements IStatistic {
   /**
    * add time series.
    */
-  public void addTimeSeries(String measurementToString, String dataType, String encoding) {
-    ColumnSchema col = new ColumnSchema(measurementToString, TSDataType.valueOf(dataType),
-        TSEncoding.valueOf(encoding));
-    JSONObject measurement = FileSchemaUtils.constructJsonColumnSchema(col);
-    fileSchema.registerMeasurement(JsonConverter.convertJsonToMeasurementSchema(measurement));
+  public void addTimeSeries(String measurementId, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props) {
+    fileSchema.registerMeasurement(new MeasurementSchema(measurementId, dataType, encoding,
+        compressor, props));
   }
 
   /**
@@ -1631,31 +1629,17 @@ public class FileNodeProcessor extends Processor implements IStatistic {
 
   private FileSchema constructFileSchema(String processorName) throws WriteProcessException {
 
-    List<ColumnSchema> columnSchemaList;
+    List<MeasurementSchema> columnSchemaList;
     columnSchemaList = mManager.getSchemaForFileName(processorName);
 
-    FileSchema schema;
-    try {
-      schema = getFileSchemaFromColumnSchema(columnSchemaList, processorName);
-    } catch (WriteProcessException e) {
-      LOGGER.error("Get the FileSchema error, the list of ColumnSchema is {}", columnSchemaList);
-      throw e;
+    FileSchema schema = new FileSchema();
+    for (MeasurementSchema measurementSchema : columnSchemaList) {
+      schema.registerMeasurement(measurementSchema);
     }
     return schema;
 
   }
 
-  private FileSchema getFileSchemaFromColumnSchema(List<ColumnSchema> schemaList, String deviceType)
-      throws WriteProcessException {
-    JSONArray rowGroup = new JSONArray();
-
-    for (ColumnSchema col : schemaList) {
-      JSONObject measurement = FileSchemaUtils.constructJsonColumnSchema(col);
-      rowGroup.put(measurement);
-    }
-    return constructJsonFileSchema(deviceType, rowGroup);
-  }
-
   @Override
   public boolean canBeClosed() {
     if (isMerging != FileNodeProcessorStatus.NONE) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/ColumnSchema.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/ColumnSchema.java
index ba94f80..49e0b82 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/ColumnSchema.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/ColumnSchema.java
@@ -1,83 +1,83 @@
-/**
- * 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.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
-
-public class ColumnSchema implements Serializable {
-
-  private static final long serialVersionUID = -8257474930341487207L;
-
-
-  private String name;
-  public TSDataType dataType;
-  public TSEncoding encoding;
-  private Map<String, String> args;
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  /**
-   * constructor of ColumnSchema.
-   *
-   * @param name name
-   * @param dataType time series data type
-   * @param encoding time series data encoding type
-   */
-  public ColumnSchema(String name, TSDataType dataType, TSEncoding encoding) {
-    this.name = name;
-    this.dataType = dataType;
-    this.encoding = encoding;
-    this.args = new HashMap<>();
-  }
-
-  public void putKeyValueToArgs(String key, String value) {
-    this.args.put(key, value);
-  }
-
-  public String getValueFromArgs(String key) {
-    return args.get(key);
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public TSDataType geTsDataType() {
-    return dataType;
-  }
-
-  public TSEncoding getEncoding() {
-    return encoding;
-  }
-
-  public Map<String, String> getArgsMap() {
-    return args;
-  }
-
-  public void setArgsMap(Map<String, String> argsMap) {
-    this.args = argsMap;
-  }
-
-}
+///**
+// * 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.Serializable;
+//import java.util.HashMap;
+//import java.util.Map;
+//import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+//import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+//
+//public class ColumnSchema implements Serializable {
+//
+//  private static final long serialVersionUID = -8257474930341487207L;
+//
+//
+//  private String name;
+//  public TSDataType dataType;
+//  public TSEncoding encoding;
+//  private Map<String, String> args;
+//
+//  public void setName(String name) {
+//    this.name = name;
+//  }
+//
+//  /**
+//   * constructor of ColumnSchema.
+//   *
+//   * @param name name
+//   * @param dataType time series data type
+//   * @param encoding time series data encoding type
+//   */
+//  public ColumnSchema(String name, TSDataType dataType, TSEncoding encoding) {
+//    this.name = name;
+//    this.dataType = dataType;
+//    this.encoding = encoding;
+//    this.args = new HashMap<>();
+//  }
+//
+//  public void putKeyValueToArgs(String key, String value) {
+//    this.args.put(key, value);
+//  }
+//
+//  public String getValueFromArgs(String key) {
+//    return args.get(key);
+//  }
+//
+//  public String getName() {
+//    return name;
+//  }
+//
+//  public TSDataType geTsDataType() {
+//    return dataType;
+//  }
+//
+//  public TSEncoding getEncoding() {
+//    return encoding;
+//  }
+//
+//  public Map<String, String> getArgsMap() {
+//    return args;
+//  }
+//
+//  public void setArgsMap(Map<String, String> argsMap) {
+//    this.args = argsMap;
+//  }
+//
+//}
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
index 5667a76..1de292f 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MGraph.java
@@ -26,6 +26,10 @@ import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.db.exception.MetadataArgsErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
+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.write.schema.MeasurementSchema;
 
 /**
  * Metadata Graph consists of one {@code MTree} and several {@code PTree}.
@@ -59,13 +63,13 @@ public class MGraph implements Serializable {
    *
    * @param path Format: root.node.(node)*
    */
-  public void addPathToMTree(String path, String dataType, String encoding, String[] args)
-      throws PathErrorException, MetadataArgsErrorException {
+  public void addPathToMTree(String path, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props) throws PathErrorException, MetadataArgsErrorException {
     String[] nodes = path.trim().split(DOUB_SEPARATOR);
     if (nodes.length == 0) {
       throw new PathErrorException("Timeseries is null");
     }
-    mtree.addTimeseriesPath(path, dataType, encoding, args);
+    mtree.addTimeseriesPath(path, dataType, encoding, compressor, props);
   }
 
   /**
@@ -179,8 +183,8 @@ public class MGraph implements Serializable {
    *
    * @return a HashMap contains all distinct deviceId type separated by deviceId Type
    */
-  public Map<String, List<ColumnSchema>> getSchemaForAllType() throws PathErrorException {
-    Map<String, List<ColumnSchema>> res = new HashMap<>();
+  public Map<String, List<MeasurementSchema>> getSchemaForAllType() throws PathErrorException {
+    Map<String, List<MeasurementSchema>> res = new HashMap<>();
     List<String> typeList = mtree.getAllType();
     for (String type : typeList) {
       res.put(type, getSchemaForOneType("root." + type));
@@ -210,7 +214,7 @@ public class MGraph implements Serializable {
    * @return A {@code Metadata} instance which stores all metadata info
    */
   public Metadata getMetadata() throws PathErrorException {
-    Map<String, List<ColumnSchema>> seriesMap = getSchemaForAllType();
+    Map<String, List<MeasurementSchema>> seriesMap = getSchemaForAllType();
     Map<String, List<String>> deviceIdMap = getDeviceForAllType();
     return new Metadata(seriesMap, deviceIdMap);
   }
@@ -229,7 +233,7 @@ public class MGraph implements Serializable {
    * @param path A seriesPath represented one Delta object
    * @return a list contains all column schema
    */
-  public ArrayList<ColumnSchema> getSchemaForOneType(String path) throws PathErrorException {
+  public ArrayList<MeasurementSchema> getSchemaForOneType(String path) throws PathErrorException {
     return mtree.getSchemaForOneType(path);
   }
 
@@ -239,11 +243,11 @@ public class MGraph implements Serializable {
    * @param path the filenode seriesPath
    * @return ArrayList<'   ColumnSchema   '> The list of the schema
    */
-  public ArrayList<ColumnSchema> getSchemaForOneFileNode(String path) {
+  public ArrayList<MeasurementSchema> getSchemaForOneFileNode(String path) {
     return mtree.getSchemaForOneFileNode(path);
   }
 
-  public Map<String, ColumnSchema> getSchemaMapForOneFileNode(String path) {
+  public Map<String, MeasurementSchema> getSchemaMapForOneFileNode(String path) {
     return mtree.getSchemaMapForOneFileNode(path);
   }
 
@@ -309,23 +313,23 @@ public class MGraph implements Serializable {
   }
 
   /**
-   * Get ColumnSchema for given seriesPath. Notice: Path must be a complete Path from root to leaf
+   * Get MeasurementSchema for given seriesPath. Notice: Path must be a complete Path from root to leaf
    * node.
    */
-  public ColumnSchema getSchemaForOnePath(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(String path) throws PathErrorException {
     return mtree.getSchemaForOnePath(path);
   }
 
-  public ColumnSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
     return mtree.getSchemaForOnePath(node, path);
   }
 
-  public ColumnSchema getSchemaForOnePathWithCheck(MNode node, String path)
+  public MeasurementSchema getSchemaForOnePathWithCheck(MNode node, String path)
       throws PathErrorException {
     return mtree.getSchemaForOnePathWithCheck(node, path);
   }
 
-  public ColumnSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
     return mtree.getSchemaForOnePathWithCheck(path);
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 3a700e2..ea7c37f 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -29,6 +29,7 @@ import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -38,9 +39,13 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.MetadataArgsErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.utils.RandomDeleteCache;
+import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 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;
 
 /**
  * This class takes the responsibility of serialization of all the metadata info and persistent it
@@ -170,19 +175,27 @@ public class MManager {
 
   private void operation(String cmd)
       throws PathErrorException, IOException, MetadataArgsErrorException {
-
+    //see addPathToMTree() to get the detailed format of the cmd
     String[] args = cmd.trim().split(",");
     if (args[0].equals(MetadataOperationType.ADD_PATH_TO_MTREE)) {
       String[] leftArgs;
-      if (args.length > 4) {
-        leftArgs = new String[args.length - 4];
-        for (int k = 4; k < args.length; k++) {
-          leftArgs[k - 4] = args[k];
+      Map<String, String> props = null;
+      if (args.length > 5) {
+        String[] kv = new String[2];
+        props = new HashMap<>(args.length - 5 + 1, 1);
+        leftArgs = new String[args.length - 5];
+        for (int k = 5; k < args.length; k++) {
+          kv = args[k].split("=");
+          props.put(kv[0], kv[1]);
         }
       } else {
+        //when ????
         leftArgs = new String[0];
       }
-      addPathToMTree(args[1], args[2], args[3], leftArgs);
+      addPathToMTree(args[1], TSDataType.deserialize(Short.valueOf(args[2])),
+          TSEncoding.deserialize(Short.valueOf(args[3])),
+          CompressionType.deserialize(Short.valueOf(args[4])),
+          props);
     } else if (args[0].equals(MetadataOperationType.DELETE_PATH_FROM_MTREE)) {
       deletePathFromMTree(args[1]);
     } else if (args[0].equals(MetadataOperationType.SET_STORAGE_LEVEL_TO_MTREE)) {
@@ -226,19 +239,23 @@ public class MManager {
    * @param path the timeseries seriesPath
    * @param dataType the datetype {@code DataType} for the timeseries
    * @param encoding the encoding function {@code Encoding} for the timeseries
+   * @param compressor the compressor function {@code Compressor} for the time series
    */
-  public void addPathToMTree(String path, String dataType, String encoding, String[] args)
+  public void addPathToMTree(String path, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props)
       throws PathErrorException, IOException, MetadataArgsErrorException {
 
     lock.writeLock().lock();
     try {
-      mgraph.addPathToMTree(path, dataType, encoding, args);
+      mgraph.addPathToMTree(path, dataType, encoding, compressor, props);
       if (writeToLog) {
         initLogStream();
-        logWriter.write(
-            MetadataOperationType.ADD_PATH_TO_MTREE + "," + path + "," + dataType + "," + encoding);
-        for (int i = 0; i < args.length; i++) {
-          logWriter.write("," + args[i]);
+        logWriter.write(String.format("%s,%s,%s,%s,%s", MetadataOperationType.ADD_PATH_TO_MTREE,
+            path, dataType.serialize(), encoding.serialize(), compressor.serialize()));
+        if (props != null) {
+          for (Map.Entry entry : props.entrySet()) {
+            logWriter.write(String.format(",%s=%s", entry.getKey(), entry.getValue()));
+          }
         }
         logWriter.newLine();
         logWriter.flush();
@@ -249,6 +266,24 @@ public class MManager {
   }
 
   /**
+   * <p> Add one timeseries to metadata. Must invoke the<code>pathExist</code> and
+   * <code>getFileNameByPath</code> method first to check timeseries. </p>
+   *
+   * this is just for compatibility
+   *
+   * @param path the timeseries seriesPath
+   * @param dataType the datetype {@code DataType} for the timeseries
+   * @param encoding the encoding function {@code Encoding} for the timeseries
+   */
+  public void addPathToMTree(String path, String dataType, String encoding)
+      throws PathErrorException, IOException, MetadataArgsErrorException {
+    TSDataType tsDataType = TSDataType.valueOf(dataType);
+    TSEncoding tsEncoding = TSEncoding.valueOf(encoding);
+    CompressionType type = CompressionType.valueOf(TSFileConfig.compressor);
+    addPathToMTree(path, tsDataType, tsEncoding, type, Collections.emptyMap());
+  }
+
+  /**
    * function for deleting a given path from mTree.
    */
   public String deletePathFromMTree(String path) throws PathErrorException, IOException {
@@ -411,7 +446,7 @@ public class MManager {
 
     lock.readLock().lock();
     try {
-      return getSchemaForOnePath(fullPath).dataType;
+      return getSchemaForOnePath(fullPath).getType();
     } finally {
       lock.readLock().unlock();
     }
@@ -424,7 +459,7 @@ public class MManager {
 
     lock.readLock().lock();
     try {
-      return getSchemaForOnePath(node, fullPath).dataType;
+      return getSchemaForOnePath(node, fullPath).getType();
     } finally {
       lock.readLock().unlock();
     }
@@ -437,7 +472,7 @@ public class MManager {
 
     lock.readLock().lock();
     try {
-      return getSchemaForOnePathWithCheck(node, fullPath).dataType;
+      return getSchemaForOnePathWithCheck(node, fullPath).getType();
     } finally {
       lock.readLock().unlock();
     }
@@ -450,7 +485,7 @@ public class MManager {
 
     lock.readLock().lock();
     try {
-      return getSchemaForOnePathWithCheck(fullPath).dataType;
+      return getSchemaForOnePathWithCheck(fullPath).getType();
     } finally {
       lock.readLock().unlock();
     }
@@ -461,7 +496,7 @@ public class MManager {
    *
    * @return a HashMap contains all distinct device type separated by device Type
    */
-  public Map<String, List<ColumnSchema>> getSchemaForAllType() throws PathErrorException {
+  public Map<String, List<MeasurementSchema>> getSchemaForAllType() throws PathErrorException {
 
     lock.readLock().lock();
     try {
@@ -502,13 +537,13 @@ public class MManager {
   }
 
   /**
-   * @deprecated Get all ColumnSchemas for given delta object type.
+   * @deprecated Get all MeasurementSchemas for given delta object type.
    *
    * @param path A seriesPath represented one Delta object
    * @return a list contains all column schema
    */
   @Deprecated
-  public ArrayList<ColumnSchema> getSchemaForOneType(String path) throws PathErrorException {
+  public ArrayList<MeasurementSchema> getSchemaForOneType(String path) throws PathErrorException {
 
     lock.readLock().lock();
     try {
@@ -521,7 +556,7 @@ public class MManager {
   /**
    * Get all ColumnSchemas for the filenode seriesPath.
    */
-  public ArrayList<ColumnSchema> getSchemaForFileName(String path) {
+  public ArrayList<MeasurementSchema> getSchemaForFileName(String path) {
 
     lock.readLock().lock();
     try {
@@ -534,7 +569,7 @@ public class MManager {
   /**
    * function for getting schema map for one file node.
    */
-  public Map<String, ColumnSchema> getSchemaMapForOneFileNode(String path) {
+  public Map<String, MeasurementSchema> getSchemaMapForOneFileNode(String path) {
 
     lock.readLock().lock();
     try {
@@ -775,7 +810,7 @@ public class MManager {
    * Get ColumnSchema for given seriesPath. Notice: Path must be a complete Path from root to leaf
    * node.
    */
-  public ColumnSchema getSchemaForOnePath(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(String path) throws PathErrorException {
 
     lock.readLock().lock();
     try {
@@ -788,7 +823,7 @@ public class MManager {
   /**
    * function for getting schema for one path.
    */
-  public ColumnSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
 
     lock.readLock().lock();
     try {
@@ -801,7 +836,7 @@ public class MManager {
   /**
    * function for getting schema for one path with check.
    */
-  public ColumnSchema getSchemaForOnePathWithCheck(MNode node, String path)
+  public MeasurementSchema getSchemaForOnePathWithCheck(MNode node, String path)
       throws PathErrorException {
 
     lock.readLock().lock();
@@ -815,7 +850,7 @@ public class MManager {
   /**
    * function for getting schema for one path with check.
    */
-  public ColumnSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
 
     lock.readLock().lock();
     try {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MNode.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MNode.java
index 18b7463..a6c98d6 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MNode.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MNode.java
@@ -22,8 +22,10 @@ import java.io.Serializable;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+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.write.schema.MeasurementSchema;
 
 /**
  * This class is the implementation of Metadata Node where "MNode" is the shorthand of "Metadata
@@ -40,13 +42,13 @@ public class MNode implements Serializable {
   // Whether current node is Storage Level in the Metadata Tree
   private boolean isStorageLevel;
   // Map for the schema in this storage group
-  private Map<String, ColumnSchema> schemaMap;
+  private Map<String, MeasurementSchema> schemaMap;
   private Map<String, Integer> numSchemaMap;
   // Corresponding data file name for current node
   private String dataFileName;
   // Column's Schema for one timeseries represented by current node if current
   // node is one leaf
-  private ColumnSchema schema;
+  private MeasurementSchema schema;
   private MNode parent;
   private LinkedHashMap<String, MNode> children;
 
@@ -63,9 +65,10 @@ public class MNode implements Serializable {
     }
   }
 
-  public MNode(String name, MNode parent, TSDataType dataType, TSEncoding encoding) {
+  public MNode(String name, MNode parent, TSDataType dataType, TSEncoding encoding,
+      CompressionType type) {
     this(name, parent, true);
-    this.schema = new ColumnSchema(name, dataType, encoding);
+    this.schema = new MeasurementSchema(name, dataType, encoding, type);
   }
 
   public boolean isStorageLevel() {
@@ -86,7 +89,7 @@ public class MNode implements Serializable {
     }
   }
 
-  public Map<String, ColumnSchema> getSchemaMap() {
+  public Map<String, MeasurementSchema> getSchemaMap() {
     return schemaMap;
   }
 
@@ -163,11 +166,11 @@ public class MNode implements Serializable {
     return this.getName();
   }
 
-  public ColumnSchema getSchema() {
+  public MeasurementSchema getSchema() {
     return schema;
   }
 
-  public void setSchema(ColumnSchema schema) {
+  public void setSchema(MeasurementSchema schema) {
     this.schema = schema;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java
index 6c534aa..b0b6abd 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MTree.java
@@ -20,13 +20,17 @@ package org.apache.iotdb.db.metadata;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.db.exception.PathErrorException;
+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;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
 /**
  * The hierarchical struct of the Metadata Tree is implemented in this class.
@@ -52,11 +56,21 @@ public class MTree implements Serializable {
   }
 
   /**
-   * function for adding timeseries.It should check whether seriesPath exists.
+   * this is just for compatibility
    */
-  public void addTimeseriesPath(String timeseriesPath, String dataType, String encoding,
-      String[] args)
+  public void addTimeseriesPath(String timeseriesPath, String dataType, String encoding)
       throws PathErrorException {
+    TSDataType tsDataType = TSDataType.valueOf(dataType);
+    TSEncoding tsEncoding = TSEncoding.valueOf(encoding);
+    CompressionType compressionType = CompressionType.valueOf(TSFileConfig.compressor);
+    addTimeseriesPath(timeseriesPath, tsDataType, tsEncoding, compressionType,
+        Collections.emptyMap());
+  }
+  /**
+   * function for adding timeseries.It should check whether seriesPath exists.
+   */
+  public void addTimeseriesPath(String timeseriesPath, TSDataType dataType, TSEncoding encoding,
+      CompressionType compressor, Map<String, String> props) throws PathErrorException {
     String[] nodeNames = timeseriesPath.trim().split(DOUB_SEPARATOR);
     if (nodeNames.length <= 1 || !nodeNames[0].equals(root.getName())) {
       throw new PathErrorException(String.format("Timeseries %s is not right.", timeseriesPath));
@@ -88,14 +102,9 @@ public class MTree implements Serializable {
       }
       i++;
     }
-    TSDataType dt = TSDataType.valueOf(dataType);
-    TSEncoding ed = TSEncoding.valueOf(encoding);
-    MNode leaf = new MNode(nodeNames[nodeNames.length - 1], cur, dt, ed);
-    if (args.length > 0) {
-      for (int k = 0; k < args.length; k++) {
-        String[] arg = args[k].split("=");
-        leaf.getSchema().putKeyValueToArgs(arg[0], arg[1]);
-      }
+    MNode leaf = new MNode(nodeNames[nodeNames.length - 1], cur, dataType, encoding, compressor);
+    if (!props.isEmpty()) {
+      leaf.getSchema().setProps(props);
     }
     levelPath = cur.getDataFileName();
     leaf.setDataFileName(levelPath);
@@ -107,6 +116,7 @@ public class MTree implements Serializable {
     cur.addChild(nodeNames[nodeNames.length - 1], leaf);
   }
 
+
   /**
    * function for checking whether the given path exists.
    *
@@ -302,23 +312,23 @@ public class MTree implements Serializable {
    * Get ColumnSchema for given seriesPath. Notice: Path must be a complete Path from root to leaf
    * node.
    */
-  public ColumnSchema getSchemaForOnePath(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(String path) throws PathErrorException {
     MNode leaf = getLeafByPath(path);
     return leaf.getSchema();
   }
 
-  public ColumnSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePath(MNode node, String path) throws PathErrorException {
     MNode leaf = getLeafByPath(node, path);
     return leaf.getSchema();
   }
 
-  public ColumnSchema getSchemaForOnePathWithCheck(MNode node, String path)
+  public MeasurementSchema getSchemaForOnePathWithCheck(MNode node, String path)
       throws PathErrorException {
     MNode leaf = getLeafByPathWithCheck(node, path);
     return leaf.getSchema();
   }
 
-  public ColumnSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
+  public MeasurementSchema getSchemaForOnePathWithCheck(String path) throws PathErrorException {
     MNode leaf = getLeafByPathWithCheck(path);
     return leaf.getSchema();
   }
@@ -751,7 +761,7 @@ public class MTree implements Serializable {
    * @param path A seriesPath represented one Delta object
    * @return a list contains all column schema
    */
-  public ArrayList<ColumnSchema> getSchemaForOneType(String path) throws PathErrorException {
+  public ArrayList<MeasurementSchema> getSchemaForOneType(String path) throws PathErrorException {
     String[] nodes = path.split(DOUB_SEPARATOR);
     if (nodes.length != 2 || !nodes[0].equals(getRoot().getName()) || !getRoot()
         .hasChild(nodes[1])) {
@@ -759,9 +769,9 @@ public class MTree implements Serializable {
           "Timeseries must be " + getRoot().getName()
               + ". X (X is one of the nodes of root's children)");
     }
-    HashMap<String, ColumnSchema> leafMap = new HashMap<>();
+    HashMap<String, MeasurementSchema> leafMap = new HashMap<>();
     putLeafToLeafMap(getRoot().getChild(nodes[1]), leafMap);
-    ArrayList<ColumnSchema> res = new ArrayList<>();
+    ArrayList<MeasurementSchema> res = new ArrayList<>();
     res.addAll(leafMap.values());
     return res;
   }
@@ -771,17 +781,17 @@ public class MTree implements Serializable {
    *
    * @return ArrayList<  ColumnSchema  > The list of the schema
    */
-  public ArrayList<ColumnSchema> getSchemaForOneFileNode(String path) {
+  public ArrayList<MeasurementSchema> getSchemaForOneFileNode(String path) {
 
     String[] nodes = path.split(DOUB_SEPARATOR);
-    HashMap<String, ColumnSchema> leafMap = new HashMap<>();
+    HashMap<String, MeasurementSchema> leafMap = new HashMap<>();
     MNode cur = getRoot();
     for (int i = 1; i < nodes.length; i++) {
       cur = cur.getChild(nodes[i]);
     }
     // cur is the storage group node
     putLeafToLeafMap(cur, leafMap);
-    ArrayList<ColumnSchema> res = new ArrayList<>();
+    ArrayList<MeasurementSchema> res = new ArrayList<>();
     res.addAll(leafMap.values());
     return res;
   }
@@ -789,7 +799,7 @@ public class MTree implements Serializable {
   /**
    * function for getting schema map for one file node.
    */
-  public Map<String, ColumnSchema> getSchemaMapForOneFileNode(String path) {
+  public Map<String, MeasurementSchema> getSchemaMapForOneFileNode(String path) {
     String[] nodes = path.split(DOUB_SEPARATOR);
     MNode cur = getRoot();
     for (int i = 1; i < nodes.length; i++) {
@@ -810,7 +820,7 @@ public class MTree implements Serializable {
     return cur.getNumSchemaMap();
   }
 
-  private void putLeafToLeafMap(MNode node, HashMap<String, ColumnSchema> leafMap) {
+  private void putLeafToLeafMap(MNode node, HashMap<String, MeasurementSchema> leafMap) {
     if (node.isLeaf()) {
       if (!leafMap.containsKey(node.getName())) {
         leafMap.put(node.getName(), node.getSchema());
@@ -861,10 +871,10 @@ public class MTree implements Serializable {
         String nodePath = parent + node;
         List<String> tsRow = new ArrayList<>(4);// get [name,storage group,dataType,encoding]
         tsRow.add(nodePath);
-        ColumnSchema columnSchema = node.getSchema();
+        MeasurementSchema measurementSchema = node.getSchema();
         tsRow.add(node.getDataFileName());
-        tsRow.add(columnSchema.dataType.toString());
-        tsRow.add(columnSchema.encoding.toString());
+        tsRow.add(measurementSchema.getType().toString());
+        tsRow.add(measurementSchema.getEncodingType().toString());
         res.add(tsRow);
       }
       return;
@@ -929,11 +939,14 @@ public class MTree implements Serializable {
     } else if (node.isLeaf()) {
       builder.append(":{\n");
       builder
-          .append(String.format("%s DataType: %s,\n", getTabs(tab + 1), node.getSchema().dataType));
+          .append(String.format("%s DataType: %s,\n", getTabs(tab + 1), node.getSchema().getType()));
+      builder
+          .append(String.format("%s Encoding: %s,\n", getTabs(tab + 1), node.getSchema().getEncodingType()));
+
       builder
-          .append(String.format("%s Encoding: %s,\n", getTabs(tab + 1), node.getSchema().encoding));
+          .append(String.format("%s Compressor: %s,\n", getTabs(tab + 1), node.getSchema().getCompressor()));
       builder
-          .append(String.format("%s args: %s,\n", getTabs(tab + 1), node.getSchema().getArgsMap()));
+          .append(String.format("%s args: %s,\n", getTabs(tab + 1), node.getSchema().getProps()));
       builder.append(
           String.format("%s StorageGroup: %s \n", getTabs(tab + 1), node.getDataFileName()));
       builder.append(getTabs(tab));
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/Metadata.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/Metadata.java
index 33fac57..40fd0e4 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/Metadata.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/Metadata.java
@@ -21,16 +21,17 @@ package org.apache.iotdb.db.metadata;
 import java.util.List;
 import java.util.Map;
 import org.apache.iotdb.db.exception.PathErrorException;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
 /**
  * This class stores all the metadata info for every deviceId and every timeseries.
  */
 public class Metadata {
 
-  private Map<String, List<ColumnSchema>> seriesMap;
+  private Map<String, List<MeasurementSchema>> seriesMap;
   private Map<String, List<String>> deviceIdMap;
 
-  public Metadata(Map<String, List<ColumnSchema>> seriesMap,
+  public Metadata(Map<String, List<MeasurementSchema>> seriesMap,
       Map<String, List<String>> deviceIdMap) {
     this.seriesMap = seriesMap;
     this.deviceIdMap = deviceIdMap;
@@ -39,7 +40,7 @@ public class Metadata {
   /**
    * function for getting series for one type.
    */
-  public List<ColumnSchema> getSeriesForOneType(String type) throws PathErrorException {
+  public List<MeasurementSchema> getSeriesForOneType(String type) throws PathErrorException {
     if (this.seriesMap.containsKey(type)) {
       return seriesMap.get(type);
     } else {
@@ -58,7 +59,7 @@ public class Metadata {
     }
   }
 
-  public Map<String, List<ColumnSchema>> getSeriesMap() {
+  public Map<String, List<MeasurementSchema>> getSeriesMap() {
     return seriesMap;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java b/iotdb/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
index 56d9891..f1ef62b 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/monitor/StatMonitor.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.monitor;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
@@ -38,6 +39,10 @@ import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.service.IService;
 import org.apache.iotdb.db.service.ServiceType;
+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;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.datapoint.DataPoint;
 import org.apache.iotdb.tsfile.write.record.datapoint.LongDataPoint;
@@ -144,7 +149,9 @@ public class StatMonitor implements IService {
         }
 
         if (!mManager.pathExist(entry.getKey())) {
-          mManager.addPathToMTree(entry.getKey(), entry.getValue(), "RLE", new String[0]);
+          mManager.addPathToMTree(entry.getKey(), TSDataType.valueOf(entry.getValue()),
+              TSEncoding.valueOf("RLE"), CompressionType.valueOf(TSFileConfig.compressor),
+              Collections.emptyMap());
         }
       }
     } catch (MetadataArgsErrorException | IOException | PathErrorException e) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
index 2a41019..86a3cc2 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/executor/OverflowQPExecutor.java
@@ -36,7 +36,6 @@ import org.apache.iotdb.db.exception.ArgsErrorException;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.metadata.MNode;
 import org.apache.iotdb.db.monitor.MonitorConstants;
@@ -54,13 +53,16 @@ import org.apache.iotdb.db.qp.physical.sys.MetadataPlan;
 import org.apache.iotdb.db.qp.physical.sys.PropertyPlan;
 import org.apache.iotdb.db.utils.AuthUtils;
 import org.apache.iotdb.db.utils.LoadDataUtils;
+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.read.expression.IExpression;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.utils.Pair;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.record.datapoint.DataPoint;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -275,7 +277,7 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
                   measurementList.get(i)));
         }
 
-        TSDataType dataType = measurementNode.getSchema().dataType;
+        TSDataType dataType = measurementNode.getSchema().getType();
         String value = insertValues.get(i);
         value = checkValue(dataType, value);
         DataPoint dataPoint = DataPoint.getDataPoint(dataType, measurementList.get(i), value);
@@ -482,9 +484,10 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
   private boolean operateMetadata(MetadataPlan metadataPlan) throws ProcessorException {
     MetadataOperator.NamespaceType namespaceType = metadataPlan.getNamespaceType();
     Path path = metadataPlan.getPath();
-    String dataType = metadataPlan.getDataType();
-    String encoding = metadataPlan.getEncoding();
-    String[] encodingArgs = metadataPlan.getEncodingArgs();
+    TSDataType dataType = metadataPlan.getDataType();
+    CompressionType compressor = metadataPlan.getCompressor();
+    TSEncoding encoding = metadataPlan.getEncoding();
+    Map<String, String> props = metadataPlan.getProps();
     List<Path> deletePathList = metadataPlan.getDeletePathList();
     try {
       switch (namespaceType) {
@@ -499,7 +502,7 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
           // optimize the speed of adding timeseries
           String fileNodePath = mManager.getFileNameByPath(path.getFullPath());
           // the two map is stored in the storage group node
-          Map<String, ColumnSchema> schemaMap = mManager.getSchemaMapForOneFileNode(fileNodePath);
+          Map<String, MeasurementSchema> schemaMap = mManager.getSchemaMapForOneFileNode(fileNodePath);
           Map<String, Integer> numSchemaMap = mManager.getNumSchemaMapForOneFileNode(fileNodePath);
           String lastNode = path.getMeasurement();
           boolean isNewMeasurement = true;
@@ -507,25 +510,26 @@ public class OverflowQPExecutor extends QueryProcessExecutor {
           synchronized (schemaMap) {
             if (schemaMap.containsKey(lastNode)) {
               isNewMeasurement = false;
-              ColumnSchema columnSchema = schemaMap.get(lastNode);
-              if (!columnSchema.geTsDataType().toString().equals(dataType)
-                  || !columnSchema.getEncoding().toString().equals(encoding)) {
+              MeasurementSchema columnSchema = schemaMap.get(lastNode);
+              if (!columnSchema.getType().equals(dataType)
+                  || !columnSchema.getEncodingType().equals(encoding)) {
                 throw new ProcessorException(String.format(
                     "The dataType or encoding of the last node %s is conflicting in the storage group %s",
                     lastNode, fileNodePath));
               }
-              mManager.addPathToMTree(path.getFullPath(), dataType, encoding, encodingArgs);
+              mManager.addPathToMTree(path.getFullPath(), dataType, encoding, compressor, props);
               numSchemaMap.put(lastNode, numSchemaMap.get(lastNode) + 1);
             } else {
-              mManager.addPathToMTree(path.getFullPath(), dataType, encoding, encodingArgs);
-              ColumnSchema columnSchema = mManager.getSchemaForOnePath(path.toString());
+              mManager.addPathToMTree(path.getFullPath(), dataType, encoding, compressor, props);
+              MeasurementSchema columnSchema = mManager.getSchemaForOnePath(path.toString());
               schemaMap.put(lastNode, columnSchema);
               numSchemaMap.put(lastNode, 1);
             }
             try {
               if (isNewMeasurement) {
                 // add time series to schema
-                fileNodeManager.addTimeSeries(path, dataType, encoding);
+                fileNodeManager.addTimeSeries(path, dataType, encoding, compressor, props);
+                //TODO fileNodeManager.addTimeSeries(path, dataType, encoding, compressor, encodingArgs);
               }
               // fileNodeManager.closeOneFileNode(namespacePath);
             } catch (FileNodeManagerException e) {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
index c755b47..813b0c5 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/logical/sys/MetadataOperator.java
@@ -19,7 +19,11 @@
 package org.apache.iotdb.db.qp.logical.sys;
 
 import java.util.List;
+import java.util.Map;
 import org.apache.iotdb.db.qp.logical.RootOperator;
+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;
 
 /**
@@ -29,9 +33,10 @@ public class MetadataOperator extends RootOperator {
 
   private final NamespaceType namespaceType;
   private Path path;
-  private String dataType;
-  private String encoding;
-  private String[] encodingArgs;
+  private TSDataType dataType;
+  private TSEncoding encoding;
+  private CompressionType compressor;
+  private Map<String, String> props;
   private List<Path> deletePathList;
 
   /**
@@ -61,28 +66,36 @@ public class MetadataOperator extends RootOperator {
     this.path = path;
   }
 
-  public String getDataType() {
+  public TSDataType getDataType() {
     return dataType;
   }
 
-  public void setDataType(String dataType) {
+  public void setDataType(TSDataType dataType) {
     this.dataType = dataType;
   }
 
-  public String getEncoding() {
+  public TSEncoding getEncoding() {
     return encoding;
   }
 
-  public void setEncoding(String encoding) {
+  public void setEncoding(TSEncoding encoding) {
     this.encoding = encoding;
   }
 
-  public String[] getEncodingArgs() {
-    return encodingArgs;
+  public void setCompressor(CompressionType compressor) {
+    this.compressor = compressor;
   }
 
-  public void setEncodingArgs(String[] encodingArgs) {
-    this.encodingArgs = encodingArgs;
+  public CompressionType getCompressor() {
+    return compressor;
+  }
+
+  public Map<String, String> getProps() {
+    return props;
+  }
+
+  public void setProps(Map<String, String> props) {
+    this.props = props;
   }
 
   public NamespaceType getNamespaceType() {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
index f21264a..7859880 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/physical/sys/MetadataPlan.java
@@ -20,33 +20,39 @@ package org.apache.iotdb.db.qp.physical.sys;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import org.apache.iotdb.db.qp.logical.Operator;
 import org.apache.iotdb.db.qp.logical.sys.MetadataOperator;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+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;
 
 public class MetadataPlan extends PhysicalPlan {
 
   private final MetadataOperator.NamespaceType namespaceType;
   private Path path;
-  private String dataType;
-  private String encoding;
-  private String[] encodingArgs;
+  private TSDataType dataType;
+  private CompressionType compressor;
+  private TSEncoding encoding;
+  private Map<String, String> props;
 
   private List<Path> deletePathList;
 
   /**
    * Constructor of MetadataPlan.
    */
-  public MetadataPlan(MetadataOperator.NamespaceType namespaceType, Path path, String dataType,
-      String encoding,
-      String[] encodingArgs, List<Path> deletePathList) {
+  public MetadataPlan(MetadataOperator.NamespaceType namespaceType, Path path, TSDataType dataType,
+      CompressionType compressor, TSEncoding encoding, Map<String, String> props,
+      List<Path> deletePathList) {
     super(false, Operator.OperatorType.METADATA);
     this.namespaceType = namespaceType;
     this.path = path;
     this.dataType = dataType;
+    this.compressor = compressor;
     this.encoding = encoding;
-    this.encodingArgs = encodingArgs;
+    this.props = props;
     this.deletePathList = deletePathList;
     switch (namespaceType) {
       case SET_FILE_LEVEL:
@@ -69,28 +75,36 @@ public class MetadataPlan extends PhysicalPlan {
     this.path = path;
   }
 
-  public String getDataType() {
+  public TSDataType getDataType() {
     return dataType;
   }
 
-  public void setDataType(String dataType) {
+  public void setDataType(TSDataType dataType) {
     this.dataType = dataType;
   }
 
-  public String getEncoding() {
+  public CompressionType getCompressor() {
+    return compressor;
+  }
+
+  public void setCompressor(CompressionType compressor) {
+    this.compressor = compressor;
+  }
+
+  public TSEncoding getEncoding() {
     return encoding;
   }
 
-  public void setEncoding(String encoding) {
+  public void setEncoding(TSEncoding encoding) {
     this.encoding = encoding;
   }
 
-  public String[] getEncodingArgs() {
-    return encodingArgs;
+  public Map<String, String> getProps() {
+    return props;
   }
 
-  public void setEncodingArgs(String[] encodingArgs) {
-    this.encodingArgs = encodingArgs;
+  public void setProps(Map<String, String> props) {
+    this.props = props;
   }
 
   public MetadataOperator.NamespaceType getNamespaceType() {
@@ -101,8 +115,8 @@ public class MetadataPlan extends PhysicalPlan {
   public String toString() {
     String ret = "seriesPath: " + path + "\ndataType: " + dataType + "\nencoding: " + encoding
         + "\nnamespace type: " + namespaceType + "\nargs: ";
-    for (String arg : encodingArgs) {
-      ret = ret + arg + ",";
+    for (Map.Entry prop : props.entrySet()) {
+      ret = ret + prop.getKey() + "=" +prop.getValue() + ",";
     }
     return ret;
   }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index a0634be..e3ccf75 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -55,8 +55,11 @@ import org.apache.iotdb.db.query.fill.PreviousFill;
 import org.apache.iotdb.db.sql.parse.AstNode;
 import org.apache.iotdb.db.sql.parse.Node;
 import org.apache.iotdb.db.sql.parse.TSParser;
+import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.constant.SystemConstant;
+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.Pair;
 import org.apache.iotdb.tsfile.utils.StringContainer;
@@ -370,18 +373,36 @@ public class LogicalGenerator {
     AstNode paramNode = astNode.getChild(1);
     String dataType = paramNode.getChild(0).getChild(0).getText();
     String encodingType = paramNode.getChild(1).getChild(0).getText();
+    String compressor;
+    int offset = 2;
+    if (paramNode.getChildren().size() > offset) {
+      compressor = paramNode.getChild(2).getChild(0).getText();
+      offset++;
+    } else {
+      compressor = TSFileConfig.compressor;
+    }
     checkMetadataArgs(dataType, encodingType);
-    String[] paramStrings = new String[paramNode.getChildCount() - 2];
+    String[] paramStrings = new String[paramNode.getChildCount() - offset];
+    Map<String, String> props = new HashMap<>(paramStrings.length + 1, 1);
+    String[] kv;
+    for (String param : paramStrings) {
+      kv = param.split("=");
+      if (kv.length != 2) {
+        throw new MetadataArgsErrorException("wrong property: " + param);
+      }
+      props.put(kv[0], kv[1]);
+    }
     for (int i = 0; i < paramStrings.length; i++) {
-      AstNode node = paramNode.getChild(i + 2);
+      AstNode node = paramNode.getChild(i + offset);
       paramStrings[i] = node.getChild(0) + SQLConstant.METADATA_PARAM_EQUAL + node.getChild(1);
     }
     MetadataOperator metadataOperator = new MetadataOperator(SQLConstant.TOK_METADATA_CREATE,
         MetadataOperator.NamespaceType.ADD_PATH);
     metadataOperator.setPath(series);
-    metadataOperator.setDataType(dataType);
-    metadataOperator.setEncoding(encodingType);
-    metadataOperator.setEncodingArgs(paramStrings);
+    metadataOperator.setDataType(TSDataType.valueOf(dataType));
+    metadataOperator.setEncoding(TSEncoding.valueOf(encodingType));
+    metadataOperator.setProps(props);
+    metadataOperator.setCompressor(CompressionType.valueOf(compressor));
     initializedOperator = metadataOperator;
   }
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
index 65f06f0..2caac94 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/qp/strategy/PhysicalGenerator.java
@@ -84,8 +84,8 @@ public class PhysicalGenerator {
       case METADATA:
         MetadataOperator metadata = (MetadataOperator) operator;
         return new MetadataPlan(metadata.getNamespaceType(), metadata.getPath(),
-            metadata.getDataType(),
-            metadata.getEncoding(), metadata.getEncodingArgs(), metadata.getDeletePathList());
+            metadata.getDataType(), metadata.getCompressor(),
+            metadata.getEncoding(), metadata.getProps(), metadata.getDeletePathList());
       case PROPERTY:
         PropertyOperator property = (PropertyOperator) operator;
         return new PropertyPlan(property.getPropertyType(), property.getPropertyPath(),
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/Utils.java b/iotdb/src/main/java/org/apache/iotdb/db/service/Utils.java
index 531940e..75826da 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/Utils.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/Utils.java
@@ -17,11 +17,7 @@ package org.apache.iotdb.db.service;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import org.apache.iotdb.db.metadata.ColumnSchema;
-import org.apache.iotdb.service.rpc.thrift.TSColumnSchema;
 import org.apache.iotdb.service.rpc.thrift.TSDataValue;
 import org.apache.iotdb.service.rpc.thrift.TSQueryDataSet;
 import org.apache.iotdb.service.rpc.thrift.TSRowRecord;
@@ -38,42 +34,6 @@ public class Utils {
   private Utils(){}
 
   /**
-   * convert all schema.
-   *
-   * @param allSchema -all schema
-   */
-  public static Map<String, List<TSColumnSchema>> convertAllSchema(
-      Map<String, List<ColumnSchema>> allSchema) {
-    if (allSchema == null) {
-      return null;
-    }
-    Map<String, List<TSColumnSchema>> tsAllSchema = new HashMap<>();
-    for (Map.Entry<String, List<ColumnSchema>> entry : allSchema.entrySet()) {
-      List<TSColumnSchema> tsColumnSchemas = new ArrayList<>();
-      for (ColumnSchema columnSchema : entry.getValue()) {
-        tsColumnSchemas.add(convertColumnSchema(columnSchema));
-      }
-      tsAllSchema.put(entry.getKey(), tsColumnSchemas);
-    }
-    return tsAllSchema;
-  }
-
-  private static TSColumnSchema convertColumnSchema(ColumnSchema columnSchema) {
-    if (columnSchema == null) {
-      return null;
-    }
-    TSColumnSchema tsColumnSchema = new TSColumnSchema();
-    tsColumnSchema.setName(columnSchema.getName());
-    tsColumnSchema
-        .setDataType(columnSchema.dataType == null ? null : columnSchema.dataType.toString());
-    tsColumnSchema
-        .setEncoding(columnSchema.encoding == null ? null : columnSchema.encoding.toString());
-    tsColumnSchema
-        .setOtherArgs(columnSchema.getArgsMap() == null ? null : columnSchema.getArgsMap());
-    return tsColumnSchema;
-  }
-
-  /**
    * convert query data set by fetch size.
    *
    * @param queryDataSet -query dataset
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/utils/FileSchemaUtils.java b/iotdb/src/main/java/org/apache/iotdb/db/utils/FileSchemaUtils.java
index 6d7ef9f..24c79cd 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/utils/FileSchemaUtils.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/utils/FileSchemaUtils.java
@@ -19,15 +19,10 @@
 package org.apache.iotdb.db.utils;
 
 import java.util.List;
-import java.util.Map.Entry;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
-import org.apache.iotdb.tsfile.common.constant.JsonFormatConstant;
-import org.apache.iotdb.tsfile.exception.write.InvalidJsonSchemaException;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.write.schema.FileSchema;
-import org.json.JSONArray;
-import org.json.JSONObject;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
 
 public class FileSchemaUtils {
@@ -41,12 +36,9 @@ public class FileSchemaUtils {
    * @throws WriteProcessException when the fileSchema cannot be created.
    */
   public static FileSchema constructFileSchema(String processorName) throws WriteProcessException {
-
-    List<ColumnSchema> columnSchemaList;
+    List<MeasurementSchema> columnSchemaList;
     columnSchemaList = MManager.getInstance().getSchemaForFileName(processorName);
-
     return getFileSchemaFromColumnSchema(columnSchemaList, processorName);
-
   }
 
   /**
@@ -57,40 +49,13 @@ public class FileSchemaUtils {
    * @return a FileSchema contains the provided schemas.
    * @throws WriteProcessException when the FileSchema cannot be constructed.
    */
-  public static FileSchema getFileSchemaFromColumnSchema(List<ColumnSchema> schemaList,
+  public static FileSchema getFileSchemaFromColumnSchema(List<MeasurementSchema> schemaList,
       String deviceType)
       throws WriteProcessException {
-    // TODO: is using a JSON as the media necessary?
-    JSONArray rowGroup = new JSONArray();
-
-    for (ColumnSchema columnSchema : schemaList) {
-      JSONObject measurement = constructJsonColumnSchema(columnSchema);
-      rowGroup.put(measurement);
-    }
-    return constructJsonFileSchema(deviceType, rowGroup);
-  }
-
-  public static FileSchema constructJsonFileSchema(String deviceType, JSONArray rowGroup) throws InvalidJsonSchemaException {
-    JSONObject jsonSchema = new JSONObject();
-    jsonSchema.put(JsonFormatConstant.JSON_SCHEMA, rowGroup);
-    jsonSchema.put(JsonFormatConstant.DELTA_TYPE, deviceType);
-    return new FileSchema(jsonSchema);
-  }
-
-  public static JSONObject constructJsonColumnSchema(ColumnSchema columnSchema) {
-    JSONObject measurement = new JSONObject();
-    measurement.put(JsonFormatConstant.MEASUREMENT_UID, columnSchema.getName());
-    measurement.put(JsonFormatConstant.DATA_TYPE, columnSchema.dataType.toString());
-    measurement.put(JsonFormatConstant.MEASUREMENT_ENCODING, columnSchema.encoding.toString());
-    for (Entry<String, String> entry : columnSchema.getArgsMap().entrySet()) {
-      if (JsonFormatConstant.ENUM_VALUES.equals(entry.getKey())) {
-        String[] valueArray = entry.getValue().split(",");
-        measurement.put(JsonFormatConstant.ENUM_VALUES, new JSONArray(valueArray));
-      } else {
-        measurement.put(entry.getKey(), entry.getValue());
-      }
+    FileSchema schema = new FileSchema();
+    for (MeasurementSchema measurementSchema : schemaList) {
+      schema.registerMeasurement(measurementSchema);
     }
-    return measurement;
+    return schema;
   }
-
 }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/utils/LoadDataUtils.java b/iotdb/src/main/java/org/apache/iotdb/db/utils/LoadDataUtils.java
index 3f6ae36..2fdef09 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/utils/LoadDataUtils.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/utils/LoadDataUtils.java
@@ -35,11 +35,11 @@ import org.apache.iotdb.db.engine.filenode.FileNodeManager;
 import org.apache.iotdb.db.exception.FileNodeManagerException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.ProcessorException;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.write.record.TSRecord;
 import org.apache.iotdb.tsfile.write.schema.FileSchema;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -206,7 +206,7 @@ public class LoadDataUtils {
     this.mmanager = mmanager;
     // get measurement schema
     try {
-      ArrayList<ColumnSchema> meaSchema = mmanager.getSchemaForOneType(measureType);
+      ArrayList<MeasurementSchema> meaSchema = mmanager.getSchemaForOneType(measureType);
       fileSchema = FileSchemaUtils.getFileSchemaFromColumnSchema(meaSchema, measureType);
     } catch (PathErrorException e) {
       logger.error("the seriesPath of input measurement schema meet error!", e);
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
index 59b2685..8ebcbf0 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/MetadataManagerHelper.java
@@ -18,7 +18,12 @@
  */
 package org.apache.iotdb.db.engine;
 
+import java.util.Collections;
 import org.apache.iotdb.db.metadata.MManager;
+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;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 
 /**
  * @author liukun
@@ -36,26 +41,52 @@ public class MetadataManagerHelper {
       mmanager.setStorageLevelToMTree("root.vehicle.d1");
       mmanager.setStorageLevelToMTree("root.vehicle.d2");
 
-      mmanager.addPathToMTree("root.vehicle.d0.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s5", "TEXT", "PLAIN", new String[0]);
-
-      mmanager.addPathToMTree("root.vehicle.d1.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s5", "TEXT", "PLAIN", new String[0]);
-
-      mmanager.addPathToMTree("root.vehicle.d2.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s5", "TEXT", "PLAIN", new String[0]);
+      CompressionType compressionType =CompressionType.valueOf(TSFileConfig.compressor);
+
+      mmanager.addPathToMTree("root.vehicle.d0.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType,
+          Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s1", TSDataType.valueOf("INT64"),
+          TSEncoding.valueOf("RLE"), compressionType,
+          Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s2", TSDataType.valueOf("FLOAT"),
+          TSEncoding.valueOf("RLE"), compressionType,
+          Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s3", TSDataType.valueOf("DOUBLE"),
+          TSEncoding.valueOf("RLE"), compressionType,
+          Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s4", TSDataType.valueOf("BOOLEAN"),
+          TSEncoding.valueOf("PLAIN"), compressionType,
+          Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s5", TSDataType.valueOf("TEXT"),
+          TSEncoding.valueOf("PLAIN"), compressionType,
+          Collections.emptyMap());
+
+      mmanager.addPathToMTree("root.vehicle.d1.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s1", TSDataType.valueOf("INT64"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s2", TSDataType.valueOf("FLOAT"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s3", TSDataType.valueOf("DOUBLE"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s4", TSDataType.valueOf("BOOLEAN"),
+          TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s5", TSDataType.valueOf("TEXT"),
+          TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+
+      mmanager.addPathToMTree("root.vehicle.d2.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s1", TSDataType.valueOf("INT64"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s2", TSDataType.valueOf("FLOAT"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s3", TSDataType.valueOf("DOUBLE"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s4", TSDataType.valueOf("BOOLEAN"),
+          TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s5", TSDataType.valueOf("TEXT"),
+          TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
 
     } catch (Exception e) {
       throw new RuntimeException("Initialize the metadata manager failed", e);
@@ -68,27 +99,28 @@ public class MetadataManagerHelper {
     mmanager.clear();
     try {
       mmanager.setStorageLevelToMTree("root.vehicle");
-
-      mmanager.addPathToMTree("root.vehicle.d0.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d0.s5", "TEXT", "PLAIN", new String[0]);
-
-      mmanager.addPathToMTree("root.vehicle.d1.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d1.s5", "TEXT", "PLAIN", new String[0]);
-
-      mmanager.addPathToMTree("root.vehicle.d2.s0", "INT32", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s1", "INT64", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s2", "FLOAT", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s3", "DOUBLE", "RLE", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s4", "BOOLEAN", "PLAIN", new String[0]);
-      mmanager.addPathToMTree("root.vehicle.d2.s5", "TEXT", "PLAIN", new String[0]);
+      CompressionType compressionType =CompressionType.valueOf(TSFileConfig.compressor);
+
+      mmanager.addPathToMTree("root.vehicle.d0.s0", TSDataType.valueOf("INT32"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s1", TSDataType.valueOf("INT64"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s2", TSDataType.valueOf("FLOAT"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s3", TSDataType.valueOf("DOUBLE"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s4", TSDataType.valueOf("BOOLEAN"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d0.s5", TSDataType.valueOf("TEXT"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+
+      mmanager.addPathToMTree("root.vehicle.d1.s0", TSDataType.valueOf("INT32"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s1", TSDataType.valueOf("INT64"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s2", TSDataType.valueOf("FLOAT"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s3", TSDataType.valueOf("DOUBLE"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s4", TSDataType.valueOf("BOOLEAN"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d1.s5", TSDataType.valueOf("TEXT"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+
+      mmanager.addPathToMTree("root.vehicle.d2.s0", TSDataType.valueOf("INT32"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s1", TSDataType.valueOf("INT64"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s2", TSDataType.valueOf("FLOAT"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s3", TSDataType.valueOf("DOUBLE"), TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s4", TSDataType.valueOf("BOOLEAN"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
+      mmanager.addPathToMTree("root.vehicle.d2.s5", TSDataType.valueOf("TEXT"), TSEncoding.valueOf("PLAIN"), compressionType, Collections.emptyMap());
 
     } catch (Exception e) {
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/filenodev2/FileNodeManagerBenchmark.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/filenodev2/FileNodeManagerBenchmark.java
index 97f2383..5829f0e 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/filenodev2/FileNodeManagerBenchmark.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/filenodev2/FileNodeManagerBenchmark.java
@@ -67,7 +67,7 @@ public class FileNodeManagerBenchmark {
     for (String device : devices) {
       for (String measurement : measurements) {
         manager.addPathToMTree(device + "." + measurement, TSDataType.INT64.toString(),
-            TSEncoding.PLAIN.toString(), new String[0]);
+            TSEncoding.PLAIN.toString());
       }
     }
   }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteFileSizeControlTest.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteFileSizeControlTest.java
index a947254..a61fa07 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteFileSizeControlTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteFileSizeControlTest.java
@@ -38,9 +38,9 @@ import org.apache.iotdb.db.engine.bufferwrite.BufferWriteProcessor;
 import org.apache.iotdb.db.engine.bufferwrite.FileNodeConstants;
 import org.apache.iotdb.db.engine.version.SysTimeVersionController;
 import org.apache.iotdb.db.exception.BufferWriteProcessorException;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.db.utils.FileSchemaUtils;
 import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -48,6 +48,7 @@ import org.apache.iotdb.tsfile.common.constant.JsonFormatConstant;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.write.schema.FileSchema;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.junit.After;
@@ -144,7 +145,7 @@ public class BufferwriteFileSizeControlTest {
     try {
       processor = new BufferWriteProcessor(Directories.getInstance().getFolderForTest(), nsp,
           filename,
-          parameters, SysTimeVersionController.INSTANCE, constructFileSchema(nsp));
+          parameters, SysTimeVersionController.INSTANCE, FileSchemaUtils.constructFileSchema(nsp));
     } catch (BufferWriteProcessorException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -168,45 +169,4 @@ public class BufferwriteFileSizeControlTest {
     assertTrue(processor.getFileSize() < dbConfig.bufferwriteFileSizeThreshold);
     fail("Method unimplemented");
   }
-
-  private FileSchema constructFileSchema(String processorName) throws WriteProcessException {
-
-    List<ColumnSchema> columnSchemaList;
-    columnSchemaList = MManager.getInstance().getSchemaForFileName(processorName);
-
-    FileSchema fileSchema = null;
-    try {
-      fileSchema = getFileSchemaFromColumnSchema(columnSchemaList, processorName);
-    } catch (WriteProcessException e) {
-      throw e;
-    }
-    return fileSchema;
-
-  }
-
-  private FileSchema getFileSchemaFromColumnSchema(List<ColumnSchema> schemaList,
-      String deviceIdType)
-      throws WriteProcessException {
-    JSONArray rowGroup = new JSONArray();
-
-    for (ColumnSchema columnSchema : schemaList) {
-      JSONObject measurement = new JSONObject();
-      measurement.put(JsonFormatConstant.MEASUREMENT_UID, columnSchema.getName());
-      measurement.put(JsonFormatConstant.DATA_TYPE, columnSchema.dataType.toString());
-      measurement.put(JsonFormatConstant.MEASUREMENT_ENCODING, columnSchema.encoding.toString());
-      for (Entry<String, String> entry : columnSchema.getArgsMap().entrySet()) {
-        if (JsonFormatConstant.ENUM_VALUES.equals(entry.getKey())) {
-          String[] valueArray = entry.getValue().split(",");
-          measurement.put(JsonFormatConstant.ENUM_VALUES, new JSONArray(valueArray));
-        } else {
-          measurement.put(entry.getKey(), entry.getValue().toString());
-        }
-      }
-      rowGroup.put(measurement);
-    }
-    JSONObject jsonSchema = new JSONObject();
-    jsonSchema.put(JsonFormatConstant.JSON_SCHEMA, rowGroup);
-    jsonSchema.put(JsonFormatConstant.DELTA_TYPE, deviceIdType);
-    return new FileSchema(jsonSchema);
-  }
 }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteMetaSizeControlTest.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteMetaSizeControlTest.java
index 0f5f259..dbacdf4 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteMetaSizeControlTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/memcontrol/BufferwriteMetaSizeControlTest.java
@@ -38,9 +38,9 @@ import org.apache.iotdb.db.engine.bufferwrite.BufferWriteProcessor;
 import org.apache.iotdb.db.engine.bufferwrite.FileNodeConstants;
 import org.apache.iotdb.db.engine.version.SysTimeVersionController;
 import org.apache.iotdb.db.exception.BufferWriteProcessorException;
-import org.apache.iotdb.db.metadata.ColumnSchema;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.db.utils.FileSchemaUtils;
 import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor;
@@ -48,6 +48,7 @@ import org.apache.iotdb.tsfile.common.constant.JsonFormatConstant;
 import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.write.schema.FileSchema;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.junit.After;
@@ -144,7 +145,7 @@ public class BufferwriteMetaSizeControlTest {
     try {
       processor = new BufferWriteProcessor(Directories.getInstance().getFolderForTest(), nsp,
           filename,
-          parameters, SysTimeVersionController.INSTANCE, constructFileSchema(nsp));
+          parameters, SysTimeVersionController.INSTANCE, FileSchemaUtils.constructFileSchema(nsp));
     } catch (BufferWriteProcessorException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -169,44 +170,4 @@ public class BufferwriteMetaSizeControlTest {
     fail("Method unimplemented");
 
   }
-
-  private FileSchema constructFileSchema(String processorName) throws WriteProcessException {
-
-    List<ColumnSchema> columnSchemaList;
-    columnSchemaList = MManager.getInstance().getSchemaForFileName(processorName);
-
-    FileSchema fileSchema = null;
-    try {
-      fileSchema = getFileSchemaFromColumnSchema(columnSchemaList, processorName);
-    } catch (WriteProcessException e) {
-      throw e;
-    }
-    return fileSchema;
-
-  }
-
-  private FileSchema getFileSchemaFromColumnSchema(List<ColumnSchema> schemaList, String deviceType)
-      throws WriteProcessException {
-    JSONArray rowGroup = new JSONArray();
-
-    for (ColumnSchema columnSchema : schemaList) {
-      JSONObject measurement = new JSONObject();
-      measurement.put(JsonFormatConstant.MEASUREMENT_UID, columnSchema.getName());
-      measurement.put(JsonFormatConstant.DATA_TYPE, columnSchema.dataType.toString());
-      measurement.put(JsonFormatConstant.MEASUREMENT_ENCODING, columnSchema.encoding.toString());
-      for (Entry<String, String> entry : columnSchema.getArgsMap().entrySet()) {
-        if (JsonFormatConstant.ENUM_VALUES.equals(entry.getKey())) {
-          String[] valueArray = entry.getValue().split(",");
-          measurement.put(JsonFormatConstant.ENUM_VALUES, new JSONArray(valueArray));
-        } else {
-          measurement.put(entry.getKey(), entry.getValue().toString());
-        }
-      }
-      rowGroup.put(measurement);
-    }
-    JSONObject jsonSchema = new JSONObject();
-    jsonSchema.put(JsonFormatConstant.JSON_SCHEMA, rowGroup);
-    jsonSchema.put(JsonFormatConstant.DELTA_TYPE, deviceType);
-    return new FileSchema(jsonSchema);
-  }
 }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
index 2c3bd20..1a76dd7 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionFileNodeTest.java
@@ -25,6 +25,7 @@ import static org.junit.Assert.assertEquals;
 import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.conf.directories.Directories;
@@ -38,6 +39,8 @@ import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.TimeValuePair;
+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;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -55,7 +58,6 @@ public class DeletionFileNodeTest {
   private static String[] measurements = new String[10];
   private String dataType = TSDataType.DOUBLE.toString();
   private String encoding = TSEncoding.PLAIN.toString();
-  private String[] args = new String[0];
 
   static {
     for (int i = 0; i < 10; i++) {
@@ -69,10 +71,11 @@ public class DeletionFileNodeTest {
     MManager.getInstance().setStorageLevelToMTree(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().addPathToMTree(processorName + "." + measurements[i], dataType,
-          encoding, args);
+          encoding);
       FileNodeManager.getInstance()
-          .addTimeSeries(new Path(processorName, measurements[i]), dataType,
-              encoding);
+          .addTimeSeries(new Path(processorName, measurements[i]), TSDataType.valueOf(dataType),
+              TSEncoding.valueOf(encoding), CompressionType.valueOf(TSFileConfig.compressor),
+              Collections.emptyMap());
     }
   }
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
index e7890ab..c3e7dc3 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/modification/DeletionQueryTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.engine.filenode.FileNodeManager;
 import org.apache.iotdb.db.engine.memcontrol.BasicMemController.UsageLevel;
@@ -32,6 +33,8 @@ import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.query.executor.EngineQueryRouter;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+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;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
@@ -50,7 +53,6 @@ public class DeletionQueryTest {
   private static String[] measurements = new String[10];
   private String dataType = TSDataType.DOUBLE.toString();
   private String encoding = TSEncoding.PLAIN.toString();
-  private String[] args = new String[0];
   private EngineQueryRouter router = new EngineQueryRouter();
 
   static {
@@ -65,10 +67,11 @@ public class DeletionQueryTest {
     MManager.getInstance().setStorageLevelToMTree(processorName);
     for (int i = 0; i < 10; i++) {
       MManager.getInstance().addPathToMTree(processorName + "." + measurements[i], dataType,
-          encoding, args);
+          encoding);
       FileNodeManager.getInstance()
-          .addTimeSeries(new Path(processorName, measurements[i]), dataType,
-              encoding);
+          .addTimeSeries(new Path(processorName, measurements[i]), TSDataType.valueOf(dataType),
+              TSEncoding.valueOf(encoding), CompressionType.valueOf(TSFileConfig.compressor),
+              Collections.emptyMap());
     }
   }
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 4a92d97..d5bcb68 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -46,19 +46,19 @@ public class MManagerAdvancedTest {
     mmanager.setStorageLevelToMTree("root.vehicle.d1");
     mmanager.setStorageLevelToMTree("root.vehicle.d0");
 
-    mmanager.addPathToMTree("root.vehicle.d0.s0", "INT32", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d0.s1", "INT64", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d0.s2", "FLOAT", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d0.s3", "DOUBLE", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d0.s4", "BOOLEAN", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d0.s5", "TEXT", "PLAIN", new String[0]);
-
-    mmanager.addPathToMTree("root.vehicle.d1.s0", "INT32", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d1.s1", "INT64", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d1.s2", "FLOAT", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d1.s3", "DOUBLE", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d1.s4", "BOOLEAN", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d1.s5", "TEXT", "PLAIN", new String[0]);
+    mmanager.addPathToMTree("root.vehicle.d0.s0", "INT32", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d0.s1", "INT64", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d0.s2", "FLOAT", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d0.s3", "DOUBLE", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d0.s4", "BOOLEAN", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d0.s5", "TEXT", "PLAIN");
+
+    mmanager.addPathToMTree("root.vehicle.d1.s0", "INT32", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d1.s1", "INT64", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d1.s2", "FLOAT", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d1.s3", "DOUBLE", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d1.s4", "BOOLEAN", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d1.s5", "TEXT", "PLAIN");
   }
 
   @After
@@ -96,10 +96,10 @@ public class MManagerAdvancedTest {
 
   @Test
   public void testCache() throws PathErrorException, IOException, MetadataArgsErrorException {
-    mmanager.addPathToMTree("root.vehicle.d2.s0", "DOUBLE", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s1", "BOOLEAN", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s2.g0", "TEXT", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s3", "TEXT", "PLAIN", new String[0]);
+    mmanager.addPathToMTree("root.vehicle.d2.s0", "DOUBLE", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d2.s1", "BOOLEAN", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d2.s2.g0", "TEXT", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d2.s3", "TEXT", "PLAIN");
 
     Assert.assertEquals(TSDataType.INT32,
         mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s0").getDataType());
@@ -112,7 +112,7 @@ public class MManagerAdvancedTest {
         mmanager.checkPathStorageLevelAndGetDataType("root.vehicle.d0.s100").getDataType());
 
     MNode node = mmanager.getNodeByDeviceIdFromCache("root.vehicle.d0");
-    Assert.assertEquals(TSDataType.INT32, node.getChild("s0").getSchema().dataType);
+    Assert.assertEquals(TSDataType.INT32, node.getChild("s0").getSchema().getType());
 
     try {
       MNode node1 = mmanager.getNodeByDeviceIdFromCache("root.vehicle.d100");
@@ -125,10 +125,10 @@ public class MManagerAdvancedTest {
   @Test
   public void testGetNextLevelPath()
       throws PathErrorException, IOException, MetadataArgsErrorException {
-    mmanager.addPathToMTree("root.vehicle.d2.s0", "DOUBLE", "RLE", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s1", "BOOLEAN", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s2.g0", "TEXT", "PLAIN", new String[0]);
-    mmanager.addPathToMTree("root.vehicle.d2.s3", "TEXT", "PLAIN", new String[0]);
+    mmanager.addPathToMTree("root.vehicle.d2.s0", "DOUBLE", "RLE");
+    mmanager.addPathToMTree("root.vehicle.d2.s1", "BOOLEAN", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d2.s2.g0", "TEXT", "PLAIN");
+    mmanager.addPathToMTree("root.vehicle.d2.s3", "TEXT", "PLAIN");
 
     List<String> paths = mmanager.getLeafNodePathInNextLevel("root.vehicle.d2");
     Assert.assertEquals(3, paths.size());
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index e82e5bd..dbd619e 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -23,10 +23,15 @@ import static org.junit.Assert.fail;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.apache.iotdb.db.exception.MetadataArgsErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
+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;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.Path;
 import org.junit.After;
 import org.junit.Assert;
@@ -35,8 +40,11 @@ import org.junit.Test;
 
 public class MManagerBasicTest {
 
+  CompressionType compressionType;
+
   @Before
   public void setUp() throws Exception {
+    compressionType = CompressionType.valueOf(TSFileConfig.compressor);
   }
 
   @After
@@ -68,7 +76,9 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s0", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections
+              .emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e) {
       e.printStackTrace();
       fail(e.getMessage());
@@ -78,7 +88,8 @@ public class MManagerBasicTest {
     assertEquals(manager.pathExist("root.laptop.d1.s0"), true);
     assertEquals(manager.pathExist("root.laptop.d1.s1"), false);
     try {
-      manager.addPathToMTree("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s1", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
@@ -112,14 +123,16 @@ public class MManagerBasicTest {
     // fail(e.getMessage());
     // }
     try {
-      manager.addPathToMTree("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s1", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s0", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
@@ -163,14 +176,16 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d2.s1", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d2.s1", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d2.s0", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d2.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
@@ -190,14 +205,16 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s0", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s0", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s1", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
@@ -213,7 +230,8 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s2", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s2", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
@@ -228,7 +246,8 @@ public class MManagerBasicTest {
     }
 
     try {
-      manager.addPathToMTree("root.laptop.d1.s3", "INT32", "RLE", new String[0]);
+      manager.addPathToMTree("root.laptop.d1.s3", TSDataType.valueOf("INT32"),
+          TSEncoding.valueOf("RLE"), compressionType, Collections.emptyMap());
     } catch (PathErrorException | MetadataArgsErrorException | IOException e1) {
       e1.printStackTrace();
       fail(e1.getMessage());
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerEfficiencyTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerEfficiencyTest.java
index 7cb52ef..f04a43f 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerEfficiencyTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerEfficiencyTest.java
@@ -39,7 +39,6 @@ public class MManagerEfficiencyTest {
   String[] storageGroup = new String[storageGroupCount];
   String[] devices = new String[deviceCount];
   String[] sensors = new String[sensorCount];
-  String args[] = new String[0];
   String[] paths;
   private MManager manager;
 
@@ -136,7 +135,7 @@ public class MManagerEfficiencyTest {
         for (String sensor : sensors) {
           String path = new StringBuilder(root).append(".").append(group).append(".").append(device)
               .append(".").append(sensor).toString();
-          manager.addPathToMTree(path, dataType, encoding, args);
+          manager.addPathToMTree(path, dataType, encoding);
         }
       }
     }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
index 721c1ce..999dce5 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
@@ -48,7 +48,7 @@ public class MManagerImproveTest {
       for (int i = 0; i < TIMESERIES_NUM; i++) {
         String p = new StringBuilder().append("root.t1.v2.d").append(j).append(".s").append(i)
             .toString();
-        mManager.addPathToMTree(p, "TEXT", "RLE", new String[0]);
+        mManager.addPathToMTree(p, "TEXT", "RLE");
       }
     }
 
@@ -215,7 +215,7 @@ public class MManagerImproveTest {
       assertEquals(true, node.hasChild(measurementList.get(i)));
       MNode measurementNode = node.getChild(measurementList.get(i));
       assertEquals(true, measurementNode.isLeaf());
-      TSDataType dataType = measurementNode.getSchema().dataType;
+      TSDataType dataType = measurementNode.getSchema().getType();
       assertEquals(TSDataType.TEXT, dataType);
     }
   }
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
index 1888cd4..fdd6f47 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MTreeTest.java
@@ -46,13 +46,13 @@ public class MTreeTest {
   public void testAddLeftNodePath() {
     MTree root = new MTree("root");
     try {
-      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE");
     } catch (PathErrorException e) {
       e.printStackTrace();
       fail(e.getMessage());
     }
     try {
-      root.addTimeseriesPath("root.laptop.d1.s1.b", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d1.s1.b", "INT32", "RLE");
     } catch (PathErrorException e) {
       Assert.assertEquals(
           String.format("The Node [%s] is left node, the timeseries %s can't be created", "s1",
@@ -67,7 +67,7 @@ public class MTreeTest {
     assertEquals(root.isPathExist(path1), true);
     assertEquals(root.isPathExist("root.laptop.d1"), false);
     try {
-      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE");
     } catch (PathErrorException e1) {
       fail(e1.getMessage());
     }
@@ -75,7 +75,7 @@ public class MTreeTest {
     assertEquals(root.isPathExist("root.laptop"), true);
     assertEquals(root.isPathExist("root.laptop.d1.s2"), false);
     try {
-      root.addTimeseriesPath("aa.bb.cc", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("aa.bb.cc", "INT32", "RLE");
     } catch (PathErrorException e) {
       Assert.assertEquals(String.format("Timeseries %s is not right.", "aa.bb.cc"), e.getMessage());
     }
@@ -88,17 +88,17 @@ public class MTreeTest {
       assertEquals(false, root.isPathExist("root.a.d0"));
       assertEquals(false, root.checkFileNameByPath("root.a.d0"));
       root.setStorageGroup("root.a.d0");
-      root.addTimeseriesPath("root.a.d0.s0", "INT32", "RLE", new String[0]);
-      root.addTimeseriesPath("root.a.d0.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.a.d0.s0", "INT32", "RLE");
+      root.addTimeseriesPath("root.a.d0.s1", "INT32", "RLE");
 
       assertEquals(false, root.isPathExist("root.a.d1"));
       assertEquals(false, root.checkFileNameByPath("root.a.d1"));
       root.setStorageGroup("root.a.d1");
-      root.addTimeseriesPath("root.a.d1.s0", "INT32", "RLE", new String[0]);
-      root.addTimeseriesPath("root.a.d1.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.a.d1.s0", "INT32", "RLE");
+      root.addTimeseriesPath("root.a.d1.s1", "INT32", "RLE");
 
       root.setStorageGroup("root.a.b.d0");
-      root.addTimeseriesPath("root.a.b.d0.s0", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.a.b.d0.s0", "INT32", "RLE");
 
     } catch (PathErrorException e1) {
       e1.printStackTrace();
@@ -159,13 +159,13 @@ public class MTreeTest {
 
     try {
       assertEquals("root.laptop.d1", root.getFileNameByPath("root.laptop.d1.s0"));
-      root.addTimeseriesPath("root.laptop.d1.s0", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d1.s0", "INT32", "RLE");
       assertEquals("root.laptop.d1", root.getFileNameByPath("root.laptop.d1.s1"));
-      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d1.s1", "INT32", "RLE");
       assertEquals("root.laptop.d2", root.getFileNameByPath("root.laptop.d2.s0"));
-      root.addTimeseriesPath("root.laptop.d2.s0", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d2.s0", "INT32", "RLE");
       assertEquals("root.laptop.d2", root.getFileNameByPath("root.laptop.d2.s1"));
-      root.addTimeseriesPath("root.laptop.d2.s1", "INT32", "RLE", new String[0]);
+      root.addTimeseriesPath("root.laptop.d2.s1", "INT32", "RLE");
     } catch (PathErrorException e) {
       e.printStackTrace();
       fail(e.getMessage());
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java b/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
index c21bed2..e3b81c4 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/writelog/PerformanceTest.java
@@ -141,17 +141,15 @@ public class PerformanceTest {
     }
     MManager.getInstance().addPathToMTree("root.logTestDevice.s1",
         TSDataType.DOUBLE.name(),
-        TSEncoding.PLAIN.name(), new String[]{});
+        TSEncoding.PLAIN.name());
     MManager.getInstance()
         .addPathToMTree("root.logTestDevice.s2", TSDataType.INT32.name(),
-            TSEncoding.PLAIN.name(),
-            new String[]{});
+            TSEncoding.PLAIN.name());
     MManager.getInstance()
         .addPathToMTree("root.logTestDevice.s3", TSDataType.TEXT.name(),
-            TSEncoding.PLAIN.name(),
-            new String[]{});
+            TSEncoding.PLAIN.name());
     MManager.getInstance().addPathToMTree("root.logTestDevice.s4", TSDataType.BOOLEAN.name(),
-        TSEncoding.PLAIN.name(), new String[]{});
+        TSEncoding.PLAIN.name());
     WriteLogNode logNode = new ExclusiveWriteLogNode("root.logTestDevice",
         tempRestore.getPath(),
         tempProcessorStore.getPath());
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeManagerTest.java b/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeManagerTest.java
index 448ef2c..b6fa93e 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeManagerTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/writelog/WriteLogNodeManagerTest.java
@@ -109,13 +109,13 @@ public class WriteLogNodeManagerTest {
       try {
         MManager.getInstance().setStorageLevelToMTree(deviceName);
         MManager.getInstance().addPathToMTree(deviceName + ".s1", TSDataType.DOUBLE.name(),
-            TSEncoding.PLAIN.name(), new String[]{});
+            TSEncoding.PLAIN.name());
         MManager.getInstance().addPathToMTree(deviceName + ".s2", TSDataType.INT32.name(),
-            TSEncoding.PLAIN.name(), new String[]{});
+            TSEncoding.PLAIN.name());
         MManager.getInstance().addPathToMTree(deviceName + ".s3", TSDataType.TEXT.name(),
-            TSEncoding.PLAIN.name(), new String[]{});
+            TSEncoding.PLAIN.name());
         MManager.getInstance().addPathToMTree(deviceName + ".s4", TSDataType.BOOLEAN.name(),
-            TSEncoding.PLAIN.name(), new String[]{});
+            TSEncoding.PLAIN.name());
       } catch (PathErrorException ignored) {
       }
       WriteLogNode logNode = manager
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/compress/ICompressor.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/compress/ICompressor.java
index 0b04a8d..d54580d 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/compress/ICompressor.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/compress/ICompressor.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.tsfile.compress;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import org.apache.iotdb.tsfile.exception.compress.CompressionTypeNotSupportedException;
 import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -27,8 +28,9 @@ import org.xerial.snappy.Snappy;
 
 /**
  * compress data according to type in schema.
+ * TODO we need to modify MManger.flush method to avoid add Serializable interface
  */
-public interface ICompressor {
+public interface ICompressor extends Serializable {
 
   static ICompressor getCompressor(String name) {
     return getCompressor(CompressionType.valueOf(name));
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
index 5154050..c8169c1 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/encoding/encoder/TSEncodingBuilder.java
@@ -68,7 +68,7 @@ public abstract class TSEncodingBuilder {
   }
 
   /**
-   * return a series's encoder with different types and parameters according to its measurement id
+   * return a thread safe series's encoder with different types and parameters according to its measurement id
    * and data type.
    *
    * @param type - given data type
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
index a65a434..6717d9a 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/schema/MeasurementSchema.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.tsfile.write.schema;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.HashMap;
@@ -47,14 +48,15 @@ import org.apache.iotdb.tsfile.utils.StringContainer;
  * @author kangrong
  * @since version 0.1.0
  */
-public class MeasurementSchema implements Comparable<MeasurementSchema> {
+public class MeasurementSchema implements Comparable<MeasurementSchema>, Serializable {
 
   private TSDataType type;
   private TSEncoding encoding;
   private String measurementId;
+  //TODO serializable interface may serialize this field. So it is time to
+  // improve how to serialize MGraph in MManager.
   private TSEncodingBuilder encodingConverter;
   private ICompressor compressor;
-  private TSFileConfig conf;
   private Map<String, String> props = new HashMap<>();
 
   public MeasurementSchema() {
@@ -86,11 +88,6 @@ public class MeasurementSchema implements Comparable<MeasurementSchema> {
     this.measurementId = measurementId;
     this.encoding = encoding;
     this.props = props == null ? Collections.emptyMap() : props;
-    // get config from TSFileDescriptor
-    this.conf = TSFileDescriptor.getInstance().getConfig();
-    // initialize TSEncoding. e.g. set max error for PLA and SDT
-    encodingConverter = TSEncodingBuilder.getConverter(encoding);
-    encodingConverter.initFromProps(props);
     this.compressor = ICompressor.getCompressor(compressionType);
   }
 
@@ -174,6 +171,10 @@ public class MeasurementSchema implements Comparable<MeasurementSchema> {
     return type;
   }
 
+  public void setProps(Map<String, String> props) {
+    this.props = props;
+  }
+
   /**
    * return the max possible length of given type.
    *
@@ -202,6 +203,7 @@ public class MeasurementSchema implements Comparable<MeasurementSchema> {
 
   /**
    * function for getting time encoder.
+   * TODO can I be optimized?
    */
   public Encoder getTimeEncoder() {
     TSEncoding timeSeriesEncoder = TSEncoding.valueOf(TSFileConfig.timeSeriesEncoder);
@@ -211,10 +213,16 @@ public class MeasurementSchema implements Comparable<MeasurementSchema> {
 
   /**
    * get Encoder of value from encodingConverter by measurementID and data type.
-   *
+   * TODO can I be optimized?
    * @return Encoder for value
    */
   public Encoder getValueEncoder() {
+    //it is ok even if encodingConverter is constructed two instances for concurrent scenario..
+    if (encodingConverter == null) {
+      // initialize TSEncoding. e.g. set max error for PLA and SDT
+      encodingConverter = TSEncodingBuilder.getConverter(encoding);
+      encodingConverter.initFromProps(props);
+    }
     return encodingConverter.getEncoder(type);
   }
 
@@ -288,13 +296,12 @@ public class MeasurementSchema implements Comparable<MeasurementSchema> {
     return type == that.type && encoding == that.encoding && Objects
         .equals(measurementId, that.measurementId)
         && Objects.equals(encodingConverter, that.encodingConverter)
-        && Objects.equals(compressor, that.compressor) && Objects.equals(conf, that.conf)
-        && Objects.equals(props, that.props);
+        && Objects.equals(compressor, that.compressor) && Objects.equals(props, that.props);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(type, encoding, measurementId, encodingConverter, compressor, conf, props);
+    return Objects.hash(type, encoding, measurementId, encodingConverter, compressor, props);
   }
 
   /**