You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ea...@apache.org on 2020/06/08 03:13:47 UTC

[incubator-iotdb] 01/04: fix conflicts

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

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

commit 5db70006889d34445ec387857853f08cd7cab9c2
Author: mdf369 <95...@qq.com>
AuthorDate: Sat Jun 6 00:16:55 2020 +0800

    fix conflicts
---
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |   1 +
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   2 +-
 .../iotdb/db/engine/flush/MemTableFlushTask.java   |   5 +
 .../iotdb/db/engine/memtable/AbstractMemTable.java |   4 +-
 ...MemChunk.java => AbstractWritableMemChunk.java} |  35 +--
 .../db/engine/memtable/PrimitiveMemTable.java      |  18 --
 .../iotdb/db/engine/memtable/WritableMemChunk.java | 206 +---------------
 .../db/nvm/exception/NVMSpaceManagerException.java |   7 +-
 .../db/nvm/memtable/NVMPrimitiveMemTable.java      |  49 ++--
 .../iotdb/db/nvm/memtable/NVMWritableMemChunk.java | 269 +--------------------
 .../iotdb/db/nvm/rescon/NVMPrimitiveArrayPool.java |  14 +-
 .../iotdb/db/nvm/space/NVMBinaryDataSpace.java     |  43 +++-
 .../apache/iotdb/db/nvm/space/NVMDataSpace.java    |   4 +-
 .../db/query/executor/AggregationExecutor.java     |   1 +
 .../iotdb/db/query/reader/series/SeriesReader.java |   1 +
 .../org/apache/iotdb/db/rescon/MemTablePool.java   |   1 -
 .../db/utils/datastructure/AbstractTVList.java     |  25 ++
 .../iotdb/db/utils/datastructure/BinaryTVList.java |   5 -
 .../db/utils/datastructure/BooleanTVList.java      |   5 -
 .../iotdb/db/utils/datastructure/DoubleTVList.java |   5 -
 .../iotdb/db/utils/datastructure/FloatTVList.java  |   5 -
 .../iotdb/db/utils/datastructure/IntTVList.java    |   5 -
 .../iotdb/db/utils/datastructure/LongTVList.java   |   5 -
 .../db/utils/datastructure/NVMBinaryTVList.java    |  88 +++----
 .../db/utils/datastructure/NVMBooleanTVList.java   |  38 +--
 .../db/utils/datastructure/NVMDoubleTVList.java    |  47 +---
 .../db/utils/datastructure/NVMFloatTVList.java     |  38 +--
 .../iotdb/db/utils/datastructure/NVMIntTVList.java |  38 +--
 .../db/utils/datastructure/NVMLongTVList.java      |  38 +--
 .../iotdb/db/utils/datastructure/NVMTVList.java    |  31 ++-
 .../iotdb/db/writelog/recover/LogReplayer.java     |   1 -
 .../writelog/recover/TsFileRecoverPerformer.java   |   2 +-
 .../iotdb/db/integration/IoTDBAggregationIT.java   |   8 -
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |   8 +-
 .../recover/RecoverResourceFromReaderTest.java     |   2 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |   2 +-
 server/src/test/resources/iotdb-engine.properties  |   3 +-
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   2 +-
 .../apache/iotdb/tsfile/read/common/BatchData.java |   2 +-
 .../tsfile/read/reader/chunk/ChunkReader.java      |   1 +
 40 files changed, 238 insertions(+), 826 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 29abfb5..f0c3b04 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -646,6 +646,7 @@ public class IoTDBConfig {
     schemaDir = addHomeDir(schemaDir);
     syncDir = addHomeDir(syncDir);
     walFolder = addHomeDir(walFolder);
+    nvmDir = addHomeDir(nvmDir);
 
     if (TSFileDescriptor.getInstance().getConfig().getTSFileStorageFs().equals(FSType.HDFS)) {
       String hdfsDir = getHdfsDir();
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index ba10dbb..65f99d4 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -157,7 +157,7 @@ public class StorageEngine implements IService {
     /*
      * recover all storage group processors.
      */
-    List<StorageGroupMNode> sgNodes = MManager.getInstance().getAllStorageGroups();
+    List<StorageGroupMNode> sgNodes = MManager.getInstance().getAllStorageGroupNodes();
     List<Future> futures = new ArrayList<>();
     for (StorageGroupMNode storageGroup : sgNodes) {
       futures.add(recoveryThreadPool.submit((Callable<Void>) () -> {
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/flush/MemTableFlushTask.java b/server/src/main/java/org/apache/iotdb/db/engine/flush/MemTableFlushTask.java
index 77ec37c..8c9983c 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/flush/MemTableFlushTask.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/flush/MemTableFlushTask.java
@@ -80,6 +80,11 @@ public class MemTableFlushTask {
         IWritableMemChunk series = memTable.getMemTableMap().get(deviceId).get(measurementId);
         MeasurementSchema desc = series.getSchema();
         AbstractTVList tvList = series.getSortedTVList();
+        System.out.println("flush size:" + tvList.size());
+        for (int i = 0; i < tvList.size(); i++) {
+          System.out.print("<" + tvList.getTime(i) + ":" + tvList.getInt(i) + "> ");
+        }
+        System.out.println();
         sortTime += System.currentTimeMillis() - startTime;
         encodingTaskQueue.add(new Pair<>(tvList, desc));
         // register active time series to the ActiveTimeSeriesCounter
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
index a2bb763..f7d1183 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractMemTable.java
@@ -144,10 +144,12 @@ public abstract class AbstractMemTable implements IMemTable {
   }
 
 
+  @Override
   public int getSeriesNumber() {
     return seriesNumber;
   }
 
+  @Override
   public long getTotalPointsNum() {
     return totalPointsNum;
   }
@@ -197,7 +199,7 @@ public abstract class AbstractMemTable implements IMemTable {
     }
     long undeletedTime = findUndeletedTime(deviceId, measurement, timeLowerBound);
     IWritableMemChunk memChunk = memTableMap.get(deviceId).get(measurement);
-    TVList chunkCopy = memChunk.getTVList().clone();
+    TVList chunkCopy = (TVList) memChunk.getTVList().clone();
 
     chunkCopy.setTimeOffset(undeletedTime);
     return new ReadOnlyMemChunk(measurement, dataType, encoding, chunkCopy, props, getVersion());
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractWritableMemChunk.java
similarity index 81%
copy from server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java
copy to server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractWritableMemChunk.java
index 4e115b6..eb277e0 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/AbstractWritableMemChunk.java
@@ -1,38 +1,16 @@
-/*
- * 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.engine.memtable;
 
+import org.apache.iotdb.db.utils.datastructure.AbstractTVList;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
-public class WritableMemChunk implements IWritableMemChunk {
+public abstract class AbstractWritableMemChunk implements IWritableMemChunk {
 
-  private MeasurementSchema schema;
-  private TVList list;
-
-  public WritableMemChunk(MeasurementSchema schema, TVList list) {
-    this.schema = schema;
-    this.list = list;
-  }
+  protected MeasurementSchema schema;
+  protected AbstractTVList list;
 
   @Override
   public void write(long insertTime, Object objectValue) {
@@ -92,7 +70,6 @@ public class WritableMemChunk implements IWritableMemChunk {
     }
   }
 
-
   @Override
   public void putLong(long t, long v) {
     list.putLong(t, v);
@@ -184,13 +161,13 @@ public class WritableMemChunk implements IWritableMemChunk {
   }
 
   @Override
-  public synchronized TVList getSortedTVList() {
+  public synchronized AbstractTVList getSortedTVList() {
     list.sort();
     return list;
   }
 
   @Override
-  public TVList getTVList() {
+  public AbstractTVList getTVList() {
     return list;
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
index 52bda30..779d89f 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/PrimitiveMemTable.java
@@ -22,7 +22,6 @@ package org.apache.iotdb.db.engine.memtable;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.iotdb.db.engine.querycontext.ReadOnlyMemChunk;
 import org.apache.iotdb.db.rescon.TVListAllocator;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
@@ -62,21 +61,4 @@ public class PrimitiveMemTable extends AbstractMemTable {
   public boolean equals(Object obj) {
     return this == obj;
   }
-
-  @Override
-  public ReadOnlyMemChunk query(String deviceId, String measurement, TSDataType dataType,
-      Map<String, String> props, long timeLowerBound) {
-    TimeValuePairSorter sorter;
-    if (!checkPath(deviceId, measurement)) {
-      return null;
-    } else {
-      long undeletedTime = findUndeletedTime(deviceId, measurement, timeLowerBound);
-      IWritableMemChunk memChunk = memTableMap.get(deviceId).get(measurement);
-      IWritableMemChunk chunkCopy = new WritableMemChunk(dataType,
-          (TVList) memChunk.getTVList().clone());
-      chunkCopy.setTimeOffset(undeletedTime);
-      sorter = chunkCopy;
-    }
-    return new ReadOnlyMemChunk(dataType, sorter, props);
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java b/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java
index 4e115b6..71422ec 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/memtable/WritableMemChunk.java
@@ -18,219 +18,17 @@
  */
 package org.apache.iotdb.db.engine.memtable;
 
+import org.apache.iotdb.db.utils.datastructure.AbstractTVList;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.utils.Binary;
 import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
-public class WritableMemChunk implements IWritableMemChunk {
-
-  private MeasurementSchema schema;
-  private TVList list;
+public class WritableMemChunk extends AbstractWritableMemChunk {
 
   public WritableMemChunk(MeasurementSchema schema, TVList list) {
     this.schema = schema;
     this.list = list;
   }
-
-  @Override
-  public void write(long insertTime, Object objectValue) {
-    switch (schema.getType()) {
-      case BOOLEAN:
-        putBoolean(insertTime, (boolean) objectValue);
-        break;
-      case INT32:
-        putInt(insertTime, (int) objectValue);
-        break;
-      case INT64:
-        putLong(insertTime, (long) objectValue);
-        break;
-      case FLOAT:
-        putFloat(insertTime, (float) objectValue);
-        break;
-      case DOUBLE:
-        putDouble(insertTime, (double) objectValue);
-        break;
-      case TEXT:
-        putBinary(insertTime, (Binary) objectValue);
-        break;
-      default:
-        throw new UnSupportedDataTypeException("Unsupported data type:" + schema.getType());
-    }
-  }
-
-  @Override
-  public void write(long[] times, Object valueList, TSDataType dataType, int start, int end) {
-    switch (dataType) {
-      case BOOLEAN:
-        boolean[] boolValues = (boolean[]) valueList;
-        putBooleans(times, boolValues, start, end);
-        break;
-      case INT32:
-        int[] intValues = (int[]) valueList;
-        putInts(times, intValues, start, end);
-        break;
-      case INT64:
-        long[] longValues = (long[]) valueList;
-        putLongs(times, longValues, start, end);
-        break;
-      case FLOAT:
-        float[] floatValues = (float[]) valueList;
-        putFloats(times, floatValues, start, end);
-        break;
-      case DOUBLE:
-        double[] doubleValues = (double[]) valueList;
-        putDoubles(times, doubleValues, start, end);
-        break;
-      case TEXT:
-        Binary[] binaryValues = (Binary[]) valueList;
-        putBinaries(times, binaryValues, start, end);
-        break;
-      default:
-        throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
-    }
-  }
-
-
-  @Override
-  public void putLong(long t, long v) {
-    list.putLong(t, v);
-  }
-
-  @Override
-  public void putInt(long t, int v) {
-    list.putInt(t, v);
-  }
-
-  @Override
-  public void putFloat(long t, float v) {
-    list.putFloat(t, v);
-  }
-
-  @Override
-  public void putDouble(long t, double v) {
-    list.putDouble(t, v);
-  }
-
-  @Override
-  public void putBinary(long t, Binary v) {
-    list.putBinary(t, v);
-  }
-
-  @Override
-  public void putBoolean(long t, boolean v) {
-    list.putBoolean(t, v);
-  }
-
-  @Override
-  public void putLongs(long[] t, long[] v) {
-    list.putLongs(t, v);
-  }
-
-  @Override
-  public void putInts(long[] t, int[] v) {
-    list.putInts(t, v);
-  }
-
-  @Override
-  public void putFloats(long[] t, float[] v) {
-    list.putFloats(t, v);
-  }
-
-  @Override
-  public void putDoubles(long[] t, double[] v) {
-    list.putDoubles(t, v);
-  }
-
-  @Override
-  public void putBinaries(long[] t, Binary[] v) {
-    list.putBinaries(t, v);
-  }
-
-  @Override
-  public void putBooleans(long[] t, boolean[] v) {
-    list.putBooleans(t, v);
-  }
-
-  @Override
-  public void putLongs(long[] t, long[] v, int start, int end) {
-    list.putLongs(t, v, start, end);
-  }
-
-  @Override
-  public void putInts(long[] t, int[] v, int start, int end) {
-    list.putInts(t, v, start, end);
-  }
-
-  @Override
-  public void putFloats(long[] t, float[] v, int start, int end) {
-    list.putFloats(t, v, start, end);
-  }
-
-  @Override
-  public void putDoubles(long[] t, double[] v, int start, int end) {
-    list.putDoubles(t, v, start, end);
-  }
-
-  @Override
-  public void putBinaries(long[] t, Binary[] v, int start, int end) {
-    list.putBinaries(t, v, start, end);
-  }
-
-  @Override
-  public void putBooleans(long[] t, boolean[] v, int start, int end) {
-    list.putBooleans(t, v, start, end);
-  }
-
-  @Override
-  public synchronized TVList getSortedTVList() {
-    list.sort();
-    return list;
-  }
-
-  @Override
-  public TVList getTVList() {
-    return list;
-  }
-
-  @Override
-  public long count() {
-    return list.size();
-  }
-
-  @Override
-  public MeasurementSchema getSchema() {
-    return schema;
-  }
-
-  @Override
-  public void setTimeOffset(long offset) {
-    list.setTimeOffset(offset);
-  }
-
-  @Override
-  public long getMinTime() {
-    return list.getMinTime();
-  }
-
-  @Override
-  public int delete(long upperBound) {
-    return list.delete(upperBound);
-  }
-
-  @Override
-  public String toString() {
-    int size = getSortedTVList().size();
-    StringBuilder out = new StringBuilder("MemChunk Size: " + size + System.lineSeparator());
-    if (size != 0) {
-      out.append("Data type:").append(schema.getType()).append(System.lineSeparator());
-      out.append("First point:").append(getSortedTVList().getTimeValuePair(0))
-          .append(System.lineSeparator());
-      out.append("Last point:").append(getSortedTVList().getTimeValuePair(size - 1))
-          .append(System.lineSeparator());
-      ;
-    }
-    return out.toString();
-  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/exception/NVMSpaceManagerException.java b/server/src/main/java/org/apache/iotdb/db/nvm/exception/NVMSpaceManagerException.java
index 891acc0..1043f46 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/exception/NVMSpaceManagerException.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/exception/NVMSpaceManagerException.java
@@ -1,14 +1,13 @@
 package org.apache.iotdb.db.nvm.exception;
 
-import org.apache.iotdb.db.exception.ProcessException;
+import org.apache.iotdb.db.exception.IoTDBException;
 import org.apache.iotdb.rpc.TSStatusCode;
 
-public class NVMSpaceManagerException extends ProcessException {
+public class NVMSpaceManagerException extends IoTDBException {
 
   private static final long serialVersionUID = 3502239072309147687L;
 
   public NVMSpaceManagerException(String message) {
-    super(message);
-    errorCode = TSStatusCode.NVMSPACE_MANAGER_EROOR.getStatusCode();
+    super(message, TSStatusCode.NVMSPACE_MANAGER_ERROR.getStatusCode());
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMPrimitiveMemTable.java b/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMPrimitiveMemTable.java
index 175e2ab..9012d4a 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMPrimitiveMemTable.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMPrimitiveMemTable.java
@@ -7,18 +7,20 @@ import java.util.Map.Entry;
 import org.apache.iotdb.db.engine.memtable.AbstractMemTable;
 import org.apache.iotdb.db.engine.memtable.IMemTable;
 import org.apache.iotdb.db.engine.memtable.IWritableMemChunk;
-import org.apache.iotdb.db.engine.memtable.TimeValuePairSorter;
-import org.apache.iotdb.db.engine.memtable.WritableMemChunk;
-import org.apache.iotdb.db.engine.querycontext.ReadOnlyMemChunk;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.nvm.space.NVMDataSpace;
-import org.apache.iotdb.db.utils.datastructure.NVMTVList;
 import org.apache.iotdb.db.rescon.TVListAllocator;
-import org.apache.iotdb.db.utils.datastructure.TVList;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.db.utils.datastructure.NVMTVList;
 import org.apache.iotdb.tsfile.utils.Pair;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class NVMPrimitiveMemTable extends AbstractMemTable {
 
+  private static final Logger logger = LoggerFactory.getLogger(NVMPrimitiveMemTable.class);
+
   public NVMPrimitiveMemTable(String sgId) {
     super(sgId);
   }
@@ -28,9 +30,9 @@ public class NVMPrimitiveMemTable extends AbstractMemTable {
   }
 
   @Override
-  protected IWritableMemChunk genMemSeries(String deviceId, String measurementId, TSDataType dataType) {
-    return new NVMWritableMemChunk(dataType,
-        (NVMTVList) TVListAllocator.getInstance().allocate(storageGroupId, deviceId, measurementId, dataType, true));
+  protected IWritableMemChunk genMemSeries(String deviceId, String measurementId, MeasurementSchema schema) {
+    return new NVMWritableMemChunk(schema,
+        (NVMTVList) TVListAllocator.getInstance().allocate(storageGroupId, deviceId, measurementId, schema.getType(), true));
   }
 
   @Override
@@ -53,23 +55,6 @@ public class NVMPrimitiveMemTable extends AbstractMemTable {
     return this == obj;
   }
 
-  @Override
-  public ReadOnlyMemChunk query(String deviceId, String measurement, TSDataType dataType,
-      Map<String, String> props, long timeLowerBound) {
-    TimeValuePairSorter sorter;
-    if (!checkPath(deviceId, measurement)) {
-      return null;
-    } else {
-      long undeletedTime = findUndeletedTime(deviceId, measurement, timeLowerBound);
-      IWritableMemChunk memChunk = memTableMap.get(deviceId).get(measurement);
-      IWritableMemChunk chunkCopy = new WritableMemChunk(dataType,
-          (TVList) memChunk.getTVList().clone());
-      chunkCopy.setTimeOffset(undeletedTime);
-      sorter = chunkCopy;
-    }
-    return new ReadOnlyMemChunk(dataType, sorter, props);
-  }
-
   public void loadData(Map<String, Map<String, Pair<List<NVMDataSpace>, List<NVMDataSpace>>>> dataMap) {
     if (dataMap == null) {
       return;
@@ -83,10 +68,16 @@ public class NVMPrimitiveMemTable extends AbstractMemTable {
           .entrySet()) {
         String measurementId = measurementDataEntry.getKey();
         Pair<List<NVMDataSpace>, List<NVMDataSpace>> tvListPair = measurementDataEntry.getValue();
-        TSDataType dataType = tvListPair.right.get(0).getDataType();
 
-        NVMWritableMemChunk memChunk = (NVMWritableMemChunk) createIfNotExistAndGet(deviceId, measurementId, dataType);
-        memChunk.loadData(tvListPair.left, tvListPair.right);
+        try {
+          MeasurementSchema[] schemas = MManager.getInstance().getSchemas(deviceId, new String[]{measurementId});
+          NVMWritableMemChunk memChunk = (NVMWritableMemChunk) createIfNotExistAndGet(deviceId, measurementId, schemas[0]);
+          memChunk.loadData(tvListPair.left, tvListPair.right);
+        } catch (MetadataException e) {
+          logger.error(
+              "occurs exception when reloading records from path ({}.{}): {}.(Will ignore the records)",
+              deviceId, measurementId, e.getMessage());
+        }
       }
     }
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMWritableMemChunk.java b/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMWritableMemChunk.java
index 6a4f72e..602a418 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMWritableMemChunk.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/memtable/NVMWritableMemChunk.java
@@ -1,276 +1,19 @@
 package org.apache.iotdb.db.nvm.memtable;
 
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.iotdb.db.engine.memtable.IWritableMemChunk;
+import org.apache.iotdb.db.engine.memtable.AbstractWritableMemChunk;
 import org.apache.iotdb.db.nvm.space.NVMDataSpace;
 import org.apache.iotdb.db.utils.datastructure.NVMTVList;
-import org.apache.iotdb.db.utils.TimeValuePair;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsBinary;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsBoolean;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsDouble;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsFloat;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsInt;
-import org.apache.iotdb.db.utils.TsPrimitiveType.TsLong;
-import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.utils.Binary;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.iotdb.tsfile.write.schema.MeasurementSchema;
 
-public class NVMWritableMemChunk implements IWritableMemChunk {
+public class NVMWritableMemChunk extends AbstractWritableMemChunk {
 
-  private static final Logger logger = LoggerFactory.getLogger(NVMWritableMemChunk.class);
-
-  private TSDataType dataType;
-  private NVMTVList list;
-  private List<TimeValuePair> sortedList;
-
-  public NVMWritableMemChunk(TSDataType dataType, NVMTVList list) {
-    this.dataType = dataType;
+  public NVMWritableMemChunk(MeasurementSchema schema, NVMTVList list) {
+    this.schema = schema;
     this.list = list;
   }
 
-  @Override
-  public void write(long insertTime, Object objectValue) {
-    switch (dataType) {
-      case BOOLEAN:
-        putBoolean(insertTime, (boolean) objectValue);
-        break;
-      case INT32:
-        putInt(insertTime, (int) objectValue);
-        break;
-      case INT64:
-        putLong(insertTime, (long) objectValue);
-        break;
-      case FLOAT:
-        putFloat(insertTime, (float) objectValue);
-        break;
-      case DOUBLE:
-        putDouble(insertTime, (double) objectValue);
-        break;
-      case TEXT:
-        putBinary(insertTime, (Binary) objectValue);
-        break;
-      default:
-        throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
-    }
-    sortedList = null;
-  }
-
-  @Override
-  public void write(long[] times, Object valueList, TSDataType dataType, List<Integer> indexes) {
-    switch (dataType) {
-      case BOOLEAN:
-        boolean[] boolValues = (boolean[]) valueList;
-        if (times.length == indexes.size()) {
-          putBooleans(times, boolValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putBoolean(times[index], boolValues[index]);
-        }
-        break;
-      case INT32:
-        int[] intValues = (int[]) valueList;
-        if (times.length == indexes.size()) {
-          putInts(times, intValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putInt(times[index], intValues[index]);
-        }
-        break;
-      case INT64:
-        long[] longValues = (long[]) valueList;
-        if (times.length == indexes.size()) {
-          putLongs(times, longValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putLong(times[index], longValues[index]);
-        }
-        break;
-      case FLOAT:
-        float[] floatValues = (float[]) valueList;
-        if (times.length == indexes.size()) {
-          putFloats(times, floatValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putFloat(times[index], floatValues[index]);
-        }
-        break;
-      case DOUBLE:
-        double[] doubleValues = (double[]) valueList;
-        if (times.length == indexes.size()) {
-          putDoubles(times, doubleValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putDouble(times[index], doubleValues[index]);
-        }
-        break;
-      case TEXT:
-        Binary[] binaryValues = (Binary[]) valueList;
-        if (times.length == indexes.size()) {
-          putBinaries(times, binaryValues);
-          break;
-        }
-        for (Integer index : indexes) {
-          putBinary(times[index], binaryValues[index]);
-        }
-        break;
-      default:
-        throw new UnSupportedDataTypeException("Unsupported data type:" + dataType);
-    }
-    sortedList = null;
-  }
-
-
-  @Override
-  public void putLong(long t, long v) {
-    list.putLong(t, v);
-  }
-
-  @Override
-  public void putInt(long t, int v) {
-    list.putInt(t, v);
-  }
-
-  @Override
-  public void putFloat(long t, float v) {
-    list.putFloat(t, v);
-  }
-
-  @Override
-  public void putDouble(long t, double v) {
-    list.putDouble(t, v);
-  }
-
-  @Override
-  public void putBinary(long t, Binary v) {
-    list.putBinary(t, v);
-  }
-
-  @Override
-  public void putBoolean(long t, boolean v) {
-    list.putBoolean(t, v);
-  }
-
-  @Override
-  public void putLongs(long[] t, long[] v) {
-    list.putLongs(t, v);
-  }
-
-  @Override
-  public void putInts(long[] t, int[] v) {
-    list.putInts(t, v);
-  }
-
-  @Override
-  public void putFloats(long[] t, float[] v) {
-    list.putFloats(t, v);
-  }
-
-  @Override
-  public void putDoubles(long[] t, double[] v) {
-    list.putDoubles(t, v);
-  }
-
-  @Override
-  public void putBinaries(long[] t, Binary[] v) {
-    list.putBinaries(t, v);
-  }
-
-  @Override
-  public void putBooleans(long[] t, boolean[] v) {
-    list.putBooleans(t, v);
-  }
-
-  @Override
-  public synchronized NVMTVList getSortedTVList() {
-    list.sort();
-    return list;
-  }
-
-  @Override
-  public NVMTVList getTVList() {
-    return list;
-  }
-
-  @Override
-  public long count() {
-    return list.size();
-  }
-
-  @Override
-  public TSDataType getType() {
-    return dataType;
-  }
-
-  @Override
-  public void setTimeOffset(long offset) {
-    list.setTimeOffset(offset);
-  }
-
-  @Override
-  public synchronized List<TimeValuePair> getSortedTimeValuePairList() {
-    if (sortedList != null) {
-      return sortedList;
-    }
-    sortedList = new ArrayList<>();
-    list.sort();
-    for (int i = 0; i < list.size(); i++) {
-      long time = list.getTime(i);
-      if (time < list.getTimeOffset() ||
-          (i + 1 < list.size() && (time == list.getTime(i + 1)))) {
-        continue;
-      }
-      switch (dataType) {
-        case BOOLEAN:
-          sortedList.add(new TimeValuePair(time, new TsBoolean(list.getBoolean(i))));
-          break;
-        case INT32:
-          sortedList.add(new TimeValuePair(time, new TsInt(list.getInt(i))));
-          break;
-        case INT64:
-          sortedList.add(new TimeValuePair(time, new TsLong(list.getLong(i))));
-          break;
-        case FLOAT:
-          sortedList.add(new TimeValuePair(time, new TsFloat(list.getFloat(i))));
-          break;
-        case DOUBLE:
-          sortedList.add(new TimeValuePair(time, new TsDouble(list.getDouble(i))));
-          break;
-        case TEXT:
-          sortedList.add(new TimeValuePair(time, new TsBinary(list.getBinary(i))));
-          break;
-        default:
-          logger.error("Unsupported data type: {}", dataType);
-          break;
-      }
-    }
-    return this.sortedList;
-  }
-
-  @Override
-  public boolean isEmpty() {
-    return list.size() == 0;
-  }
-
-  @Override
-  public long getMinTime() {
-    return list.getMinTime();
-  }
-
-  @Override
-  public void delete(long upperBound) {
-    list.delete(upperBound);
-  }
-
   public void loadData(List<NVMDataSpace> timeSpaceList, List<NVMDataSpace> valueSpaceList) {
-    // TODO how about abstract
-    list.loadData(timeSpaceList, valueSpaceList);
+    ((NVMTVList) list).loadData(timeSpaceList, valueSpaceList);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/rescon/NVMPrimitiveArrayPool.java b/server/src/main/java/org/apache/iotdb/db/nvm/rescon/NVMPrimitiveArrayPool.java
index 1ea4f6e..81080c2 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/rescon/NVMPrimitiveArrayPool.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/rescon/NVMPrimitiveArrayPool.java
@@ -4,8 +4,11 @@ import java.util.ArrayDeque;
 import java.util.EnumMap;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.nvm.exception.NVMSpaceManagerException;
+import org.apache.iotdb.db.nvm.space.NVMBinaryDataSpace;
 import org.apache.iotdb.db.nvm.space.NVMDataSpace;
 import org.apache.iotdb.db.nvm.space.NVMSpaceManager;
+import org.apache.iotdb.db.rescon.PrimitiveArrayPool;
+import org.apache.iotdb.db.utils.datastructure.NVMBinaryTVList;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 public class NVMPrimitiveArrayPool {
@@ -15,7 +18,8 @@ public class NVMPrimitiveArrayPool {
    */
   private static final EnumMap<TSDataType, ArrayDeque<NVMDataSpace>> primitiveArraysMap = new EnumMap<>(TSDataType.class);
 
-  public static final int ARRAY_SIZE = 128;
+  public static final int ARRAY_SIZE =
+      IoTDBDescriptor.getInstance().getConfig().getPrimitiveArraySize();
 
   static {
     primitiveArraysMap.put(TSDataType.BOOLEAN, new ArrayDeque());
@@ -35,17 +39,19 @@ public class NVMPrimitiveArrayPool {
   private NVMPrimitiveArrayPool() {}
 
   public synchronized NVMDataSpace getPrimitiveDataListByType(TSDataType dataType, boolean isTime) {
-    ArrayDeque<NVMDataSpace> dataListQueue = primitiveArraysMap.computeIfAbsent(dataType, k ->new ArrayDeque<>());
+    ArrayDeque<NVMDataSpace> dataListQueue = primitiveArraysMap
+        .computeIfAbsent(dataType, k -> new ArrayDeque<>());
     NVMDataSpace nvmSpace = dataListQueue.poll();
 
     if (nvmSpace == null) {
       try {
         long size = NVMSpaceManager.getPrimitiveTypeByteSize(dataType);
-        nvmSpace = NVMSpaceManager.getInstance().allocateDataSpace(size * ARRAY_SIZE, dataType, isTime);
+        nvmSpace = NVMSpaceManager.getInstance().allocateDataSpace(
+            size * (dataType == TSDataType.TEXT ? NVMBinaryDataSpace.NUM_OF_TEXT_IN_SPACE
+                : ARRAY_SIZE), dataType, isTime);
       } catch (NVMSpaceManagerException e) {
         e.printStackTrace();
         System.exit(0);
-        // TODO
       }
     }
     return nvmSpace;
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMBinaryDataSpace.java b/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMBinaryDataSpace.java
index abde477..3e3932f 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMBinaryDataSpace.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMBinaryDataSpace.java
@@ -8,33 +8,41 @@ import org.apache.iotdb.tsfile.utils.Binary;
 
 public class NVMBinaryDataSpace extends NVMDataSpace {
 
+  public static final int NUM_OF_TEXT_IN_SPACE = 1;
+
+  private int endPos;
+
   private int cacheSize;
   private Binary[] cachedBinaries;
+  private int[] cachedOffset;
 
   NVMBinaryDataSpace(long offset, long size, ByteBuffer byteBuffer, int index, boolean recover) {
     super(offset, size, byteBuffer, index, TSDataType.TEXT, false);
 
-    cacheSize = 0;
-    cachedBinaries = new Binary[ARRAY_SIZE];
+    reset();
+    cachedBinaries = new Binary[NUM_OF_TEXT_IN_SPACE];
+    cachedOffset = new int[NUM_OF_TEXT_IN_SPACE];
     if (recover) {
       recoverCache();
     }
   }
 
   private void recoverCache() {
-    int size = byteBuffer.getInt();
-    cacheSize = size;
-    for (int i = 0; i < size; i++) {
+    cacheSize = byteBuffer.getInt();
+    for (int i = 0; i < cacheSize; i++) {
       int len = byteBuffer.getInt();
       byte[] bytes = new byte[len];
       byteBuffer.get(bytes);
+
       cachedBinaries[i] = new Binary(bytes);
+      cachedOffset[i] = endPos;
+      endPos += len + NVMSpaceManager.getPrimitiveTypeByteSize(TSDataType.INT32);
     }
   }
 
   @Override
   public int getUnitNum() {
-    return cachedBinaries.length;
+    return cacheSize;
   }
 
   @Override
@@ -44,13 +52,21 @@ public class NVMBinaryDataSpace extends NVMDataSpace {
 
   @Override
   public void setData(int index, Object object) {
-    // todo nos support index
     Binary binary = (Binary) object;
+    cachedOffset[index] = endPos;
     cachedBinaries[index] = binary;
-    if (index >= cacheSize) {
-      byteBuffer.putInt(0, index);
-      cacheSize = index;
-    }
+    endPos = binary.getLength() + 2 * NVMSpaceManager.getPrimitiveTypeByteSize(TSDataType.INT32);
+    byteBuffer.position(NVMSpaceManager.getPrimitiveTypeByteSize(TSDataType.INT32));
+    byteBuffer.putInt(binary.getLength());
+    byteBuffer.put(binary.getValues());
+  }
+
+  public void appendData(Binary binary) {
+    cachedOffset[cacheSize] = endPos;
+    cachedBinaries[cacheSize] = binary;
+    cacheSize++;
+    endPos += binary.getLength() + NVMSpaceManager.getPrimitiveTypeByteSize(TSDataType.INT32);
+    byteBuffer.putInt(0, cacheSize);
     byteBuffer.putInt(binary.getLength());
     byteBuffer.put(binary.getValues());
   }
@@ -59,4 +75,9 @@ public class NVMBinaryDataSpace extends NVMDataSpace {
   public Object toArray() {
     return cachedBinaries;
   }
+
+  public void reset() {
+    cacheSize = 0;
+    endPos = NVMSpaceManager.getPrimitiveTypeByteSize(TSDataType.INT32);
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMDataSpace.java b/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMDataSpace.java
index 06be125..d299b32 100644
--- a/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMDataSpace.java
+++ b/server/src/main/java/org/apache/iotdb/db/nvm/space/NVMDataSpace.java
@@ -35,7 +35,7 @@ public class NVMDataSpace extends NVMSpace {
   }
 
   public int getValidUnitNum() {
-    // TODO only for time
+    // only for time space
     int count = 0;
     while (count < unitNum) {
       long v = (long) getData(count);
@@ -67,7 +67,7 @@ public class NVMDataSpace extends NVMSpace {
         object = byteBuffer.getDouble(index);
         break;
       case TEXT:
-        // TODO
+        // override in NVMBinaryDataSpace
         break;
     }
     return object;
diff --git a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
index 04e80f2..fae41c4 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/executor/AggregationExecutor.java
@@ -231,6 +231,7 @@ public class AggregationExecutor {
         continue;
       }
       BatchData nextOverlappedPageData = seriesReader.nextPage();
+      System.out.println("read:" + nextOverlappedPageData.count);
       for (int i = 0; i < aggregateResultList.size(); i++) {
         if (!isCalculatedArray[i]) {
           AggregateResult aggregateResult = aggregateResultList.get(i);
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index 816be29..b1e2eb6 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -477,6 +477,7 @@ class SeriesReader {
            * get current first point in mergeReader, this maybe overlapped latter
            */
           TimeValuePair timeValuePair = mergeReader.currentTimeValuePair();
+          System.out.println("read:" + timeValuePair);
 
           if (timeValuePair.getTimestamp() > currentPageEndTime) {
             break;
diff --git a/server/src/main/java/org/apache/iotdb/db/rescon/MemTablePool.java b/server/src/main/java/org/apache/iotdb/db/rescon/MemTablePool.java
index fdb6728..23f2a90 100644
--- a/server/src/main/java/org/apache/iotdb/db/rescon/MemTablePool.java
+++ b/server/src/main/java/org/apache/iotdb/db/rescon/MemTablePool.java
@@ -42,7 +42,6 @@ public class MemTablePool {
   private int nvmSize = 0;
 
   private static final int WAIT_TIME = 2000;
-  private int size = 0;
 
   private MemTablePool() {
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AbstractTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AbstractTVList.java
index 507be77..d8728f3 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AbstractTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/AbstractTVList.java
@@ -80,6 +80,30 @@ public abstract class AbstractTVList {
     throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
   }
 
+  public void putLongs(long[] time, long[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public void putInts(long[] time, int[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public void putFloats(long[] time, float[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public void putDoubles(long[] time, double[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public void putBinaries(long[] time, Binary[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
+  public void putBooleans(long[] time, boolean[] value, int start, int end) {
+    throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
+  }
+
   public long getLong(int index) {
     throw new UnsupportedOperationException(ERR_DATATYPE_NOT_CONSISTENT);
   }
@@ -260,6 +284,7 @@ public abstract class AbstractTVList {
       int n = start - left;  // The number of elements to move
       for (int i = n; i >= 1; i--) {
         set(left + i - 1, left + i);
+        setToSorted(left + i - 1, left + i);
       }
       setPivotTo(left);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
index f146d28..3b6b89f 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BinaryTVList.java
@@ -262,11 +262,6 @@ public class BinaryTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getBinary(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (Binary) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
index ce42960..0ad2ecc 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/BooleanTVList.java
@@ -262,11 +262,6 @@ public class BooleanTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getBoolean(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (boolean) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
index 131e9fb..90a39fc 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/DoubleTVList.java
@@ -266,11 +266,6 @@ public class DoubleTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getDouble(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (double) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
index 6861365..9ea5086 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/FloatTVList.java
@@ -269,11 +269,6 @@ public class FloatTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getFloat(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (float) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
index f3c73bb..75d2248 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/IntTVList.java
@@ -262,11 +262,6 @@ public class IntTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getInt(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (int) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
index 9f8a0ee..5922caa 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/LongTVList.java
@@ -261,11 +261,6 @@ public class LongTVList extends TVList {
   }
 
   @Override
-  protected Object getValueForSort(int index) {
-    return getLong(index);
-  }
-
-  @Override
   protected void setForSort(int index, long timestamp, Object value) {
     set(index, timestamp, (long) value);
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBinaryTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBinaryTVList.java
index 0b8ce51..88c37fc 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBinaryTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBinaryTVList.java
@@ -4,6 +4,7 @@ import static org.apache.iotdb.db.nvm.rescon.NVMPrimitiveArrayPool.ARRAY_SIZE;
 
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.nvm.rescon.NVMPrimitiveArrayPool;
+import org.apache.iotdb.db.nvm.space.NVMBinaryDataSpace;
 import org.apache.iotdb.db.nvm.space.NVMDataSpace;
 import org.apache.iotdb.db.nvm.space.NVMSpaceManager;
 import org.apache.iotdb.db.nvm.space.NVMSpaceMetadataManager;
@@ -14,7 +15,6 @@ import org.apache.iotdb.tsfile.utils.Binary;
 // TODO how to organize data
 public class NVMBinaryTVList extends NVMTVList {
 
-  // TODO
   private Binary[][] sortedValues;
   private Binary[][] tempValuesForSort;
 
@@ -27,10 +27,9 @@ public class NVMBinaryTVList extends NVMTVList {
   public void putBinary(long timestamp, Binary value) {
     checkExpansion();
     int arrayIndex = size;
-    int elementIndex = 0;
     minTime = minTime <= timestamp ? minTime : timestamp;
-    timestamps.get(arrayIndex).setData(elementIndex, timestamp);
-    values.get(arrayIndex).setData(elementIndex, value);
+    timestamps.get(arrayIndex).setData(0, timestamp);
+    ((NVMBinaryDataSpace)values.get(arrayIndex)).appendData(value);
     size++;
     if (sorted && size > 1 && timestamp < getTime(size - 2)) {
       sorted = false;
@@ -39,7 +38,8 @@ public class NVMBinaryTVList extends NVMTVList {
 
   @Override
   protected void checkExpansion() {
-    NVMDataSpace valueSpace = expandValues();
+    NVMBinaryDataSpace valueSpace = (NVMBinaryDataSpace) expandValues();
+    valueSpace.reset();
     NVMDataSpace timeSpace = NVMPrimitiveArrayPool
         .getInstance().getPrimitiveDataListByType(TSDataType.INT64, true);
     timestamps.add(timeSpace);
@@ -48,22 +48,46 @@ public class NVMBinaryTVList extends NVMTVList {
   }
 
   @Override
+  public long getTime(int index) {
+    if (index >= size) {
+      throw new ArrayIndexOutOfBoundsException(index);
+    }
+    return (long) timestamps.get(index).getData(0);
+  }
+
+  @Override
   public Binary getBinary(int index) {
+    return (Binary) getValue(index);
+  }
+
+  @Override
+  public Object getValue(int index) {
     if (index >= size) {
       throw new ArrayIndexOutOfBoundsException(index);
     }
-    int arrayIndex = index;
-    int elementIndex = 0;
-    return (Binary) values.get(arrayIndex).getData(elementIndex);
+    return values.get(index).getData(0);
+  }
+
+  @Override
+  protected void set(int index, long timestamp, Object value) {
+    if (index >= size) {
+      throw new ArrayIndexOutOfBoundsException(index);
+    }
+    timestamps.get(index).setData(0, timestamp);
+    values.get(index).setData(0, value);
   }
 
   @Override
   public BinaryTVList clone() {
     BinaryTVList cloneList = new BinaryTVList();
-    cloneAs(cloneList);
-    for (NVMDataSpace valueSpace : values) {
-      cloneList.addBatchValue((Binary[]) cloneValue(valueSpace));
+
+    long[] cloneTimestamps = new long[size];
+    Binary[] cloneValues = new Binary[size];
+    for (int i = 0; i < size; i++) {
+      cloneTimestamps[i] = timestamps.get(i).getLong(0);
+      cloneValues[i] = (Binary) values.get(i).getData(0);
     }
+    cloneList.putBinaries(cloneTimestamps, cloneValues);
     return cloneList;
   }
 
@@ -172,49 +196,17 @@ public class NVMBinaryTVList extends NVMTVList {
   
   @Override
   public void putBinaries(long[] time, Binary[] value) {
-    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putBinary(time[i], value[i]);
     }
+  }
 
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
-  }
-
-  public static void main(String[] args) throws StartupException {
-    NVMSpaceManager.getInstance().init();
-
-    NVMBinaryTVList tvList = new NVMBinaryTVList("sg", "d0", "s0");
-    int size = 5000;
-    for (int i = 0; i < size; i++) {
-      String v = String.valueOf(size - i);
-      tvList.putBinary(i, Binary.valueOf(v));
+  @Override
+  public void putBinaries(long[] time, Binary[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putBinary(time[i], value[i]);
     }
-
-    tvList.sort();
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBooleanTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBooleanTVList.java
index 3c8a8e7..726fb1e 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBooleanTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMBooleanTVList.java
@@ -33,12 +33,7 @@ public class NVMBooleanTVList extends NVMTVList {
 
   @Override
   public boolean getBoolean(int index) {
-    if (index >= size) {
-      throw new ArrayIndexOutOfBoundsException(index);
-    }
-    int arrayIndex = index / ARRAY_SIZE;
-    int elementIndex = index % ARRAY_SIZE;
-    return (boolean) values.get(arrayIndex).getData(elementIndex);
+    return (boolean) getValue(index);
   }
 
   @Override
@@ -156,36 +151,17 @@ public class NVMBooleanTVList extends NVMTVList {
   
   @Override
   public void putBooleans(long[] time, boolean[] value) {
-    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putBoolean(time[i], value[i]);
     }
+  }
 
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
+  @Override
+  public void putBooleans(long[] time, boolean[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putBoolean(time[i], value[i]);
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMDoubleTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMDoubleTVList.java
index 7455d18..c8bdee4 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMDoubleTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMDoubleTVList.java
@@ -34,12 +34,7 @@ public class NVMDoubleTVList extends NVMTVList {
 
   @Override
   public double getDouble(int index) {
-    if (index >= size) {
-      throw new ArrayIndexOutOfBoundsException(index);
-    }
-    int arrayIndex = index / ARRAY_SIZE;
-    int elementIndex = index % ARRAY_SIZE;
-    return (double) values.get(arrayIndex).getData(elementIndex);
+    return (double) getValue(index);
   }
 
   @Override
@@ -157,45 +152,17 @@ public class NVMDoubleTVList extends NVMTVList {
 
   @Override
   public void putDoubles(long[] time, double[] value) {
-//    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putDouble(time[i], value[i]);
     }
+  }
 
-//    long startTime = System.currentTimeMillis();
-//    for (NVMDataSpace timeSpace : timestamps) {
-//      timeSpace.force();
-//    }
-//    for (NVMDataSpace valueSpace : values) {
-//      valueSpace.force();
-//    }
-//    PerfMonitor.add("NVMTVList.force", System.currentTimeMillis() - startTime);
-
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
+  @Override
+  public void putDoubles(long[] time, double[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putDouble(time[i], value[i]);
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMFloatTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMFloatTVList.java
index b9814e8..d72e05a 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMFloatTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMFloatTVList.java
@@ -33,12 +33,7 @@ public class NVMFloatTVList extends NVMTVList {
 
   @Override
   public float getFloat(int index) {
-    if (index >= size) {
-      throw new ArrayIndexOutOfBoundsException(index);
-    }
-    int arrayIndex = index / ARRAY_SIZE;
-    int elementIndex = index % ARRAY_SIZE;
-    return (float) values.get(arrayIndex).getData(elementIndex);
+    return (float) getValue(index);
   }
 
   @Override
@@ -156,36 +151,17 @@ public class NVMFloatTVList extends NVMTVList {
 
   @Override
   public void putFloats(long[] time, float[] value) {
-    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putFloat(time[i], value[i]);
     }
+  }
 
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
+  @Override
+  public void putFloats(long[] time, float[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putFloat(time[i], value[i]);
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMIntTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMIntTVList.java
index 5ff1403..13e5e0a 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMIntTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMIntTVList.java
@@ -33,12 +33,7 @@ public class NVMIntTVList extends NVMTVList {
 
   @Override
   public int getInt(int index) {
-    if (index >= size) {
-      throw new ArrayIndexOutOfBoundsException(index);
-    }
-    int arrayIndex = index / ARRAY_SIZE;
-    int elementIndex = index % ARRAY_SIZE;
-    return (int) values.get(arrayIndex).getData(elementIndex);
+    return (int) getValue(index);
   }
 
   @Override
@@ -156,36 +151,17 @@ public class NVMIntTVList extends NVMTVList {
 
   @Override
   public void putInts(long[] time, int[] value) {
-    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putInt(time[i], value[i]);
     }
+  }
 
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
+  @Override
+  public void putInts(long[] time, int[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putInt(time[i], value[i]);
+    }
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMLongTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMLongTVList.java
index 956880f..98823be 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMLongTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMLongTVList.java
@@ -33,12 +33,7 @@ public class NVMLongTVList extends NVMTVList {
 
   @Override
   public long getLong(int index) {
-    if (index >= size) {
-      throw new ArrayIndexOutOfBoundsException(index);
-    }
-    int arrayIndex = index / ARRAY_SIZE;
-    int elementIndex = index % ARRAY_SIZE;
-    return (long) values.get(arrayIndex).getData(elementIndex);
+    return (long) getValue(index);
   }
 
   @Override
@@ -156,37 +151,18 @@ public class NVMLongTVList extends NVMTVList {
 
   @Override
   public void putLongs(long[] time, long[] value) {
-    checkExpansion();
-    int idx = 0;
     int length = time.length;
 
     for (int i = 0; i < length; i++) {
       putLong(time[i], value[i]);
     }
+  }
 
-//    updateMinTimeAndSorted(time);
-//
-//    while (idx < length) {
-//      int inputRemaining = length - idx;
-//      int arrayIdx = size / ARRAY_SIZE;
-//      int elementIdx = size % ARRAY_SIZE;
-//      int internalRemaining  = ARRAY_SIZE - elementIdx;
-//      if (internalRemaining >= inputRemaining) {
-//        // the remaining inputs can fit the last array, copy all remaining inputs into last array
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, inputRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, inputRemaining);
-//        size += inputRemaining;
-//        break;
-//      } else {
-//        // the remaining inputs cannot fit the last array, fill the last array and create a new
-//        // one and enter the next loop
-//        System.arraycopy(time, idx, timestamps.get(arrayIdx), elementIdx, internalRemaining);
-//        System.arraycopy(value, idx, values.get(arrayIdx), elementIdx, internalRemaining);
-//        idx += internalRemaining;
-//        size += internalRemaining;
-//        checkExpansion();
-//      }
-//    }
+  @Override
+  public void putLongs(long[] time, long[] value, int start, int end) {
+    for (int i = start; i < end; i++) {
+      putLong(time[i], value[i]);
+    }
   }
 }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMTVList.java b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMTVList.java
index eda0cb6..6e4d2d1 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMTVList.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/datastructure/NVMTVList.java
@@ -9,6 +9,9 @@ import org.apache.iotdb.db.nvm.space.NVMDataSpace;
 import org.apache.iotdb.db.nvm.space.NVMSpaceMetadataManager;
 import org.apache.iotdb.db.rescon.PrimitiveArrayPool;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
+import org.apache.iotdb.tsfile.read.TimeValuePair;
+import org.apache.iotdb.tsfile.utils.TsPrimitiveType;
 
 public abstract class NVMTVList extends AbstractTVList {
 
@@ -102,7 +105,7 @@ public abstract class NVMTVList extends AbstractTVList {
   }
 
   @Override
-  public void delete(long upperBound) {
+  public int delete(long upperBound) {
     int newSize = 0;
     minTime = Long.MAX_VALUE;
     for (int i = 0; i < size; i++) {
@@ -112,6 +115,7 @@ public abstract class NVMTVList extends AbstractTVList {
         minTime = time < minTime ? time : minTime;
       }
     }
+    int deletedNumber = size - newSize;
     size = newSize;
     // release primitive arrays that are empty
     int newArrayNum = newSize / ARRAY_SIZE;
@@ -122,6 +126,7 @@ public abstract class NVMTVList extends AbstractTVList {
       releaseLastTimeArray();
       releaseLastValueArray();
     }
+    return deletedNumber;
   }
 
   @Override
@@ -279,6 +284,17 @@ public abstract class NVMTVList extends AbstractTVList {
     return tempTimestampsForSort[arrayIndex][elementIndex];
   }
 
+  protected abstract Object getValueForSort(int index);
+
+  public Object getValue(int index) {
+    if (index >= size) {
+      throw new ArrayIndexOutOfBoundsException(index);
+    }
+    int arrayIndex = index / ARRAY_SIZE;
+    int elementIndex = index % ARRAY_SIZE;
+    return values.get(arrayIndex).getData(elementIndex);
+  }
+
   @Override
   protected void setForSort(int index, long timestamp, Object value) {
     if (index >= size) {
@@ -302,4 +318,17 @@ public abstract class NVMTVList extends AbstractTVList {
   protected void setPivotTo(int pos) {
     setForSort(pos, pivotTime, pivotValue);
   }
+
+  @Override
+  public TimeValuePair getTimeValuePair(int index) {
+    return new TimeValuePair(getTime(index),
+        TsPrimitiveType.getByType(dataType, getValue(index)));
+  }
+
+  @Override
+  protected TimeValuePair getTimeValuePair(int index, long time, Integer floatPrecision,
+      TSEncoding encoding) {
+    return new TimeValuePair(time, TsPrimitiveType.getByType(dataType, getValue(index)));
+
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
index 7663065..d9dfcd3 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/LogReplayer.java
@@ -178,7 +178,6 @@ public class LogReplayer {
           MManager.getInstance().getSchemas(insertPlan.getDeviceId(), insertPlan.getMeasurements());
       insertPlan.setSchemasAndTransferType(schemas);
       recoverMemTable.insert(insertPlan);
-      // TODO how about NVM
     } catch (Exception e) {
       logger.error(
           "occurs exception when replaying the record {} at timestamp {}: {}.(Will ignore the record)",
diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
index 05b6553..425d0d3 100644
--- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
+++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java
@@ -73,8 +73,8 @@ public class TsFileRecoverPerformer {
     this.versionController = versionController;
     this.resource = currentTsFileResource;
     this.acceptUnseq = acceptUnseq;
-    this.storageGroupId = sgId;
     this.isLastFile = isLastFile;
+    this.storageGroupId = sgId;
   }
 
   /**
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
index f180ec2..26bc141 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBAggregationIT.java
@@ -85,14 +85,12 @@ public class IoTDBAggregationIT {
 
   @Before
   public void setUp() throws Exception {
-    System.out.println("set up start");
     EnvironmentUtils.closeStatMonitor();
     prevPartitionInterval = IoTDBDescriptor.getInstance().getConfig().getPartitionInterval();
     IoTDBDescriptor.getInstance().getConfig().setPartitionInterval(1000);
     EnvironmentUtils.envSetUp();
     Class.forName(Config.JDBC_DRIVER_NAME);
     prepareData();
-    System.out.println("set up end");
   }
 
   @After
@@ -105,7 +103,6 @@ public class IoTDBAggregationIT {
   //details in: https://issues.apache.org/jira/projects/IOTDB/issues/IOTDB-54
   @Test
   public void test() throws SQLException {
-    System.out.println("test start");
     String[] retArray = new String[]{
         "0,2",
         "0,4",
@@ -167,7 +164,6 @@ public class IoTDBAggregationIT {
 
   @Test
   public void countTest() throws SQLException {
-    System.out.println("countTest start");
     String[] retArray = new String[]{
         "0,2001,2001,2001,2001",
         "0,7500,7500,7500,7500"
@@ -214,7 +210,6 @@ public class IoTDBAggregationIT {
 
   @Test
   public void firstTest() {
-    System.out.println("firstTest start");
     String[] retArray = new String[]{
         "0,2000,2000,2000.0,2000",
         "0,500,500,500.0,500"
@@ -269,7 +264,6 @@ public class IoTDBAggregationIT {
 
   @Test
   public void lastTest() throws SQLException {
-    System.out.println("lastTest start");
     String[] retArray = new String[]{
         "0,8499,8499.0",
         "0,1499,1499.0",
@@ -333,7 +327,6 @@ public class IoTDBAggregationIT {
 
   @Test
   public void maxminTimeTest() throws SQLException {
-    System.out.println("maxminTimeTest start");
     String[] retArray = new String[]{
         "0,8499,500",
         "0,2499,2000"
@@ -428,7 +421,6 @@ public class IoTDBAggregationIT {
 
   @Test
   public void avgSumTest() {
-    System.out.println("avgSumTest start");
     String[] retArray = new String[]{
         "0,1.4508E7,7250.374812593702",
         "0,626750.0,1250.9980039920158"
diff --git a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index 6ceb46d..955ee4d 100644
--- a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.constant.TestConstant;
 import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.engine.cache.ChunkMetadataCache;
+import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.monitor.StatMonitor;
@@ -212,7 +213,12 @@ public class EnvironmentUtils {
     TEST_QUERY_JOB_ID = QueryResourceManager.getInstance().assignQueryId(true);
     TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID);
 
-    NVMSpaceManager.getInstance().init();
+    try {
+      NVMSpaceManager.getInstance().init();
+    } catch (StartupException e) {
+      logger.error("init NVM space failed", e);
+      fail(e.getMessage());
+    }
   }
 
   public static void stopDaemon() {
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
index 00e3e4c..1a4857d 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/RecoverResourceFromReaderTest.java
@@ -182,7 +182,7 @@ public class RecoverResourceFromReaderTest {
     }
 
     TsFileRecoverPerformer performer = new TsFileRecoverPerformer(logNodePrefix,
-        versionController, resource, true, false);
+        versionController, resource, true, false, "root.sg");
     ActiveTimeSeriesCounter.getInstance()
         .init(resource.getFile().getParentFile().getParentFile().getName());
     performer.recover();
diff --git a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
index 0e34574..c448855 100644
--- a/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/writelog/recover/SeqTsFileRecoverTest.java
@@ -219,7 +219,7 @@ public class SeqTsFileRecoverTest {
   @Test
   public void testLastRecovery() throws StorageGroupProcessorException, IOException {
     TsFileRecoverPerformer performer = new TsFileRecoverPerformer(logNodePrefix,
-        versionController, resource, true, true);
+        versionController, resource, true, true, "root.sg");
     ActiveTimeSeriesCounter.getInstance().init(storageGroup);
     RestorableTsFileIOWriter writer = performer.recover();
 
diff --git a/server/src/test/resources/iotdb-engine.properties b/server/src/test/resources/iotdb-engine.properties
index b213e4c..c792aba 100644
--- a/server/src/test/resources/iotdb-engine.properties
+++ b/server/src/test/resources/iotdb-engine.properties
@@ -18,4 +18,5 @@
 
 base_dir=target/tmp
 data_dirs=target/data
-wal_dir=target/wal
\ No newline at end of file
+wal_dir=target/wal
+nvm_dir=target/nvm
\ No newline at end of file
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
index af191b9..5d4e96e 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/TSStatusCode.java
@@ -43,7 +43,7 @@ public enum TSStatusCode {
   TSFILE_PROCESSOR_ERROR(314),
   PATH_ILLEGAL(315),
   LOAD_FILE_ERROR(316),
-  NVMSPACE_MANAGER_EROOR(317),
+  NVMSPACE_MANAGER_ERROR(317),
 
   EXECUTE_STATEMENT_ERROR(400),
   SQL_PARSE_ERROR(401),
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
index a893c1b..da9dd83 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/common/BatchData.java
@@ -68,7 +68,7 @@ public class BatchData implements Serializable {
   private int writeCurArrayIndex;
 
   // the insert timestamp number of timeRet
-  private int count;
+  public int count;
 
 
   private List<long[]> timeRet;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
index aa334d8..4289952 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/chunk/ChunkReader.java
@@ -93,6 +93,7 @@ public class ChunkReader implements IChunkReader {
       // deserialize a PageHeader from chunkDataBuffer
       PageHeader pageHeader = isFromOldTsFile ? HeaderUtils.deserializePageHeaderV1(chunkDataBuffer, chunkHeader.getDataType()) :
           PageHeader.deserializeFrom(chunkDataBuffer, chunkHeader.getDataType());
+      System.out.println("statistics:" + pageHeader.getStatistics());
       // if the current page satisfies
       if (pageSatisfied(pageHeader)) {
         pageReaderList.add(constructPageReaderForNextPage(pageHeader));