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

jt2594838 pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 56a0fcce1c9 [to dev/1.3] Fix tree model WAL serialized sizes (#17886)
56a0fcce1c9 is described below

commit 56a0fcce1c93432aac1af8105fd663f37af3068b
Author: Caideyipi <[email protected]>
AuthorDate: Wed Jun 10 14:20:31 2026 +0800

    [to dev/1.3] Fix tree model WAL serialized sizes (#17886)
    
    * [to dev/1.3] Fix tree model WAL serialized sizes
    
    * Fix WAL charset deserialization
    
    * Fix insert node serde charset handling
    
    * spotless
---
 .../planner/plan/node/write/DeleteDataNode.java    |  12 +--
 .../plan/planner/plan/node/write/InsertNode.java   | 105 ++++++++++++++++++++-
 .../planner/plan/node/write/InsertRowNode.java     |  34 ++++---
 .../plan/node/write/InsertRowsOfOneDeviceNode.java |   7 +-
 .../planner/plan/node/write/InsertTabletNode.java  |  27 +++---
 .../dataregion/memtable/AbstractMemTable.java      |   5 +-
 .../dataregion/memtable/WritableMemChunkGroup.java |   8 +-
 .../dataregion/modification/Deletion.java          |  39 +++++++-
 .../dataregion/wal/buffer/WALInfoEntry.java        |   9 +-
 .../dataregion/wal/utils/WALReadUtils.java         | 101 ++++++++++++++++++++
 .../dataregion/wal/utils/WALWriteUtils.java        |  16 +++-
 .../node/write/DeleteDataNodeSerdeTest.java        |  28 ++++++
 .../planner/node/write/InsertRowNodeSerdeTest.java |  12 +--
 .../node/write/InsertTabletNodeSerdeTest.java      |  12 +--
 .../dataregion/modification/DeletionTest.java      |  52 ++++++++++
 .../dataregion/wal/io/WALFileTest.java             |  12 ++-
 16 files changed, 406 insertions(+), 73 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/DeleteDataNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/DeleteDataNode.java
index c4c4159f66d..dda2d245f09 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/DeleteDataNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/DeleteDataNode.java
@@ -36,6 +36,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 
 import org.apache.tsfile.read.filter.factory.TimeFilterApi;
@@ -129,7 +130,7 @@ public class DeleteDataNode extends SearchNode implements 
WALEntryValue {
   public int serializedSize() {
     int size = FIXED_SERIALIZED_SIZE;
     for (PartialPath path : pathList) {
-      size += ReadWriteIOUtils.sizeToWrite(path.getFullPath());
+      size += WALWriteUtils.sizeToWrite(path.getFullPath());
     }
     return size;
   }
@@ -153,10 +154,9 @@ public class DeleteDataNode extends SearchNode implements 
WALEntryValue {
     for (int i = 0; i < size; i++) {
       try {
         pathList.add(
-            DataNodeDevicePathCache.getInstance()
-                .getPartialPath(ReadWriteIOUtils.readString(stream)));
+            
DataNodeDevicePathCache.getInstance().getPartialPath(WALReadUtils.readString(stream)));
       } catch (IllegalPathException e) {
-        throw new IllegalArgumentException("Cannot deserialize InsertRowNode", 
e);
+        throw new IllegalArgumentException("Cannot deserialize 
DeleteDataNode", e);
       }
     }
     long deleteStartTime = stream.readLong();
@@ -174,9 +174,9 @@ public class DeleteDataNode extends SearchNode implements 
WALEntryValue {
     List<PartialPath> pathList = new ArrayList<>(size);
     for (int i = 0; i < size; i++) {
       try {
-        pathList.add(new PartialPath(ReadWriteIOUtils.readString(buffer)));
+        pathList.add(new PartialPath(WALReadUtils.readString(buffer)));
       } catch (IllegalPathException e) {
-        throw new IllegalArgumentException("Cannot deserialize InsertRowNode", 
e);
+        throw new IllegalArgumentException("Cannot deserialize 
DeleteDataNode", e);
       }
     }
     long deleteStartTime = buffer.getLong();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
index c664bbb9ddf..aee5cc1ec93 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertNode.java
@@ -31,11 +31,14 @@ import 
org.apache.iotdb.db.pipe.resource.memory.InsertNodeMemoryEstimator;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.storageengine.dataregion.memtable.DeviceIDFactory;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.NotImplementedException;
 import org.apache.tsfile.file.metadata.IDeviceID;
+import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.schema.MeasurementSchema;
 
 import java.io.DataInputStream;
@@ -43,7 +46,9 @@ import java.io.DataOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -213,6 +218,102 @@ public abstract class InsertNode extends SearchNode 
implements ComparableConsens
     throw new NotImplementedException("serializeAttributes of InsertNode is 
not implemented");
   }
 
+  protected static int serializeString(String value, ByteBuffer buffer) {
+    if (value == null) {
+      return ReadWriteIOUtils.write(-1, buffer);
+    }
+    byte[] bytes = value.getBytes(TSFileConfig.STRING_CHARSET);
+    int len = ReadWriteIOUtils.write(bytes.length, buffer);
+    buffer.put(bytes);
+    return len + bytes.length;
+  }
+
+  protected static int serializeString(String value, DataOutputStream stream) 
throws IOException {
+    if (value == null) {
+      return ReadWriteIOUtils.write(-1, stream);
+    }
+    byte[] bytes = value.getBytes(TSFileConfig.STRING_CHARSET);
+    int len = ReadWriteIOUtils.write(bytes.length, stream);
+    stream.write(bytes);
+    return len + bytes.length;
+  }
+
+  protected static String deserializeString(ByteBuffer buffer) {
+    int strLength = ReadWriteIOUtils.readInt(buffer);
+    if (strLength < 0) {
+      return null;
+    } else if (strLength == 0) {
+      return "";
+    }
+    byte[] bytes = new byte[strLength];
+    buffer.get(bytes);
+    return new String(bytes, TSFileConfig.STRING_CHARSET);
+  }
+
+  protected static void serializeMeasurementSchema(
+      MeasurementSchema measurementSchema, ByteBuffer buffer) {
+    serializeString(measurementSchema.getMeasurementId(), buffer);
+    ReadWriteIOUtils.write(measurementSchema.getTypeInByte(), buffer);
+    ReadWriteIOUtils.write(measurementSchema.getEncodingType().serialize(), 
buffer);
+    ReadWriteIOUtils.write(measurementSchema.getCompressor().serialize(), 
buffer);
+    serializeProps(measurementSchema.getProps(), buffer);
+  }
+
+  protected static void serializeMeasurementSchema(
+      MeasurementSchema measurementSchema, DataOutputStream stream) throws 
IOException {
+    serializeString(measurementSchema.getMeasurementId(), stream);
+    ReadWriteIOUtils.write(measurementSchema.getTypeInByte(), stream);
+    ReadWriteIOUtils.write(measurementSchema.getEncodingType().serialize(), 
stream);
+    ReadWriteIOUtils.write(measurementSchema.getCompressor().serialize(), 
stream);
+    serializeProps(measurementSchema.getProps(), stream);
+  }
+
+  protected static MeasurementSchema deserializeMeasurementSchema(ByteBuffer 
buffer) {
+    String measurementId = deserializeString(buffer);
+    byte type = ReadWriteIOUtils.readByte(buffer);
+    byte encoding = ReadWriteIOUtils.readByte(buffer);
+    byte compressor = ReadWriteIOUtils.readByte(buffer);
+    Map<String, String> props = deserializeProps(buffer);
+    return new MeasurementSchema(measurementId, type, encoding, compressor, 
props);
+  }
+
+  private static void serializeProps(Map<String, String> props, ByteBuffer 
buffer) {
+    if (props == null) {
+      ReadWriteIOUtils.write(0, buffer);
+      return;
+    }
+    ReadWriteIOUtils.write(props.size(), buffer);
+    for (Map.Entry<String, String> entry : props.entrySet()) {
+      serializeString(entry.getKey(), buffer);
+      serializeString(entry.getValue(), buffer);
+    }
+  }
+
+  private static void serializeProps(Map<String, String> props, 
DataOutputStream stream)
+      throws IOException {
+    if (props == null) {
+      ReadWriteIOUtils.write(0, stream);
+      return;
+    }
+    ReadWriteIOUtils.write(props.size(), stream);
+    for (Map.Entry<String, String> entry : props.entrySet()) {
+      serializeString(entry.getKey(), stream);
+      serializeString(entry.getValue(), stream);
+    }
+  }
+
+  private static Map<String, String> deserializeProps(ByteBuffer buffer) {
+    int size = ReadWriteIOUtils.readInt(buffer);
+    if (size <= 0) {
+      return null;
+    }
+    Map<String, String> props = new HashMap<>();
+    for (int i = 0; i < size; i++) {
+      props.put(deserializeString(buffer), deserializeString(buffer));
+    }
+    return props;
+  }
+
   // region Serialization methods for WAL
   /** Serialized size of measurement schemas, ignoring failed time series */
   protected int serializeMeasurementSchemasSize() {
@@ -244,7 +345,7 @@ public abstract class InsertNode extends SearchNode 
implements ComparableConsens
    */
   protected void deserializeMeasurementSchemas(DataInputStream stream) throws 
IOException {
     for (int i = 0; i < measurements.length; i++) {
-      measurementSchemas[i] = MeasurementSchema.deserializeFrom(stream);
+      measurementSchemas[i] = WALReadUtils.readMeasurementSchema(stream);
       measurements[i] = measurementSchemas[i].getMeasurementId();
       dataTypes[i] = measurementSchemas[i].getType();
     }
@@ -252,7 +353,7 @@ public abstract class InsertNode extends SearchNode 
implements ComparableConsens
 
   protected void deserializeMeasurementSchemas(ByteBuffer buffer) {
     for (int i = 0; i < measurements.length; i++) {
-      measurementSchemas[i] = MeasurementSchema.deserializeFrom(buffer);
+      measurementSchemas[i] = WALReadUtils.readMeasurementSchema(buffer);
       measurements[i] = measurementSchemas[i].getMeasurementId();
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
index 6518385c48a..23c17808d49 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowNode.java
@@ -34,6 +34,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 import org.apache.iotdb.db.utils.TypeInferenceUtils;
 
@@ -238,13 +239,13 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
 
   void subSerialize(ByteBuffer buffer) {
     ReadWriteIOUtils.write(time, buffer);
-    ReadWriteIOUtils.write(devicePath.getFullPath(), buffer);
+    serializeString(devicePath.getFullPath(), buffer);
     serializeMeasurementsAndValues(buffer);
   }
 
   void subSerialize(DataOutputStream stream) throws IOException {
     ReadWriteIOUtils.write(time, stream);
-    ReadWriteIOUtils.write(devicePath.getFullPath(), stream);
+    serializeString(devicePath.getFullPath(), stream);
     serializeMeasurementsAndValues(stream);
   }
 
@@ -281,9 +282,9 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
       }
       // serialize measurement schemas when exist
       if (measurementSchemas != null) {
-        measurementSchemas[i].serializeTo(buffer);
+        serializeMeasurementSchema(measurementSchemas[i], buffer);
       } else {
-        ReadWriteIOUtils.write(measurements[i], buffer);
+        serializeString(measurements[i], buffer);
       }
     }
   }
@@ -303,9 +304,9 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
       }
       // serialize measurement schemas when exist
       if (measurementSchemas != null) {
-        measurementSchemas[i].serializeTo(stream);
+        serializeMeasurementSchema(measurementSchemas[i], stream);
       } else {
-        ReadWriteIOUtils.write(measurements[i], stream);
+        serializeString(measurements[i], stream);
       }
     }
   }
@@ -331,7 +332,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
       // and is forwarded to other nodes
       if (isNeedInferType) {
         ReadWriteIOUtils.write(TYPE_RAW_STRING, buffer);
-        ReadWriteIOUtils.write(values[i].toString(), buffer);
+        serializeString(values[i].toString(), buffer);
       } else {
         ReadWriteIOUtils.write(dataTypes[i], buffer);
         switch (dataTypes[i]) {
@@ -386,7 +387,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
       // and is forwarded to other nodes
       if (isNeedInferType) {
         ReadWriteIOUtils.write(TYPE_RAW_STRING, stream);
-        ReadWriteIOUtils.write(values[i].toString(), stream);
+        serializeString(values[i].toString(), stream);
       } else {
         ReadWriteIOUtils.write(dataTypes[i], stream);
         switch (dataTypes[i]) {
@@ -431,8 +432,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
     time = byteBuffer.getLong();
     try {
       devicePath =
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath(ReadWriteIOUtils.readString(byteBuffer));
+          
DataNodeDevicePathCache.getInstance().getPartialPath(deserializeString(byteBuffer));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException(DESERIALIZE_ERROR, e);
     }
@@ -447,12 +447,12 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
     if (hasSchema) {
       measurementSchemas = new MeasurementSchema[measurementSize];
       for (int i = 0; i < measurementSize; i++) {
-        measurementSchemas[i] = MeasurementSchema.deserializeFrom(buffer);
+        measurementSchemas[i] = deserializeMeasurementSchema(buffer);
         measurements[i] = measurementSchemas[i].getMeasurementId();
       }
     } else {
       for (int i = 0; i < measurementSize; i++) {
-        measurements[i] = ReadWriteIOUtils.readString(buffer);
+        measurements[i] = deserializeString(buffer);
       }
     }
 
@@ -476,7 +476,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
       // and is forwarded to other nodes
       byte typeNum = (byte) ReadWriteIOUtils.read(buffer);
       if (typeNum == TYPE_RAW_STRING || typeNum == TYPE_NULL) {
-        values[i] = typeNum == TYPE_RAW_STRING ? 
ReadWriteIOUtils.readString(buffer) : null;
+        values[i] = typeNum == TYPE_RAW_STRING ? deserializeString(buffer) : 
null;
         continue;
       }
       dataTypes[i] = TSDataType.values()[typeNum];
@@ -524,7 +524,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
   protected int subSerializeSize() {
     int size = 0;
     size += Long.BYTES;
-    size += ReadWriteIOUtils.sizeToWrite(devicePath.getFullPath());
+    size += WALWriteUtils.sizeToWrite(devicePath.getFullPath());
     return size + serializeMeasurementsAndValuesSize();
   }
 
@@ -671,8 +671,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
     insertNode.setTime(stream.readLong());
     try {
       insertNode.setDevicePath(
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath(ReadWriteIOUtils.readString(stream)));
+          
DataNodeDevicePathCache.getInstance().getPartialPath(WALReadUtils.readString(stream)));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException(DESERIALIZE_ERROR, e);
     }
@@ -757,8 +756,7 @@ public class InsertRowNode extends InsertNode implements 
WALEntryValue {
     insertNode.setTime(buffer.getLong());
     try {
       insertNode.setDevicePath(
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath(ReadWriteIOUtils.readString(buffer)));
+          
DataNodeDevicePathCache.getInstance().getPartialPath(WALReadUtils.readString(buffer)));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException(DESERIALIZE_ERROR, e);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
index c7b193841d4..d7a6e8b6f5f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
@@ -236,8 +236,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode {
 
     try {
       devicePath =
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath((ReadWriteIOUtils.readString(byteBuffer)));
+          
DataNodeDevicePathCache.getInstance().getPartialPath((deserializeString(byteBuffer)));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException("Cannot deserialize 
InsertRowsOfOneDeviceNode", e);
     }
@@ -269,7 +268,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode {
   @Override
   protected void serializeAttributes(ByteBuffer byteBuffer) {
     PlanNodeType.INSERT_ROWS_OF_ONE_DEVICE.serialize(byteBuffer);
-    ReadWriteIOUtils.write(devicePath.getFullPath(), byteBuffer);
+    serializeString(devicePath.getFullPath(), byteBuffer);
 
     ReadWriteIOUtils.write(insertRowNodeList.size(), byteBuffer);
 
@@ -285,7 +284,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode {
   @Override
   protected void serializeAttributes(DataOutputStream stream) throws 
IOException {
     PlanNodeType.INSERT_ROWS_OF_ONE_DEVICE.serialize(stream);
-    ReadWriteIOUtils.write(devicePath.getFullPath(), stream);
+    serializeString(devicePath.getFullPath(), stream);
 
     ReadWriteIOUtils.write(insertRowNodeList.size(), stream);
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
index 6a1e9bf1bb4..472c1e79d7e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/InsertTabletNode.java
@@ -36,6 +36,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.WritePlanNode;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 import org.apache.iotdb.db.storageengine.dataregion.wal.buffer.WALEntryValue;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 import org.apache.iotdb.db.utils.BitMapUtils;
 import org.apache.iotdb.db.utils.QueryDataSetUtils;
@@ -413,7 +414,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
   }
 
   void subSerialize(ByteBuffer buffer) {
-    ReadWriteIOUtils.write(devicePath.getFullPath(), buffer);
+    serializeString(devicePath.getFullPath(), buffer);
     writeMeasurementsOrSchemas(buffer);
     writeDataTypes(buffer);
     writeTimes(buffer);
@@ -423,7 +424,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
   }
 
   void subSerialize(DataOutputStream stream) throws IOException {
-    ReadWriteIOUtils.write(devicePath.getFullPath(), stream);
+    serializeString(devicePath.getFullPath(), stream);
     writeMeasurementsOrSchemas(stream);
     writeDataTypes(stream);
     writeTimes(stream);
@@ -444,9 +445,9 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
       }
       // serialize measurement schemas when exist
       if (measurementSchemas != null) {
-        measurementSchemas[i].serializeTo(buffer);
+        serializeMeasurementSchema(measurementSchemas[i], buffer);
       } else {
-        ReadWriteIOUtils.write(measurements[i], buffer);
+        serializeString(measurements[i], buffer);
       }
     }
   }
@@ -463,9 +464,9 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
       }
       // serialize measurement schemas when exist
       if (measurementSchemas != null) {
-        measurementSchemas[i].serializeTo(stream);
+        serializeMeasurementSchema(measurementSchemas[i], stream);
       } else {
-        ReadWriteIOUtils.write(measurements[i], stream);
+        serializeString(measurements[i], stream);
       }
     }
   }
@@ -682,8 +683,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
   public void subDeserialize(ByteBuffer buffer) {
     try {
       devicePath =
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath((ReadWriteIOUtils.readString(buffer)));
+          
DataNodeDevicePathCache.getInstance().getPartialPath((deserializeString(buffer)));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException("Cannot deserialize 
InsertTabletNode", e);
     }
@@ -695,12 +695,12 @@ public class InsertTabletNode extends InsertNode 
implements WALEntryValue {
     if (hasSchema) {
       this.measurementSchemas = new MeasurementSchema[measurementSize];
       for (int i = 0; i < measurementSize; i++) {
-        measurementSchemas[i] = MeasurementSchema.deserializeFrom(buffer);
+        measurementSchemas[i] = deserializeMeasurementSchema(buffer);
         measurements[i] = measurementSchemas[i].getMeasurementId();
       }
     } else {
       for (int i = 0; i < measurementSize; i++) {
-        measurements[i] = ReadWriteIOUtils.readString(buffer);
+        measurements[i] = deserializeString(buffer);
       }
     }
 
@@ -738,7 +738,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
   int subSerializeSize(int start, int end) {
     int size = 0;
     size += Long.BYTES;
-    size += ReadWriteIOUtils.sizeToWrite(devicePath.getFullPath());
+    size += WALWriteUtils.sizeToWrite(devicePath.getFullPath());
     // measurements size
     size += Integer.BYTES;
     size += serializeMeasurementSchemasSize();
@@ -943,7 +943,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
     searchIndex = stream.readLong();
     try {
       devicePath =
-          
DataNodeDevicePathCache.getInstance().getPartialPath(ReadWriteIOUtils.readString(stream));
+          
DataNodeDevicePathCache.getInstance().getPartialPath(WALReadUtils.readString(stream));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException("Cannot deserialize 
InsertTabletNode", e);
     }
@@ -979,8 +979,7 @@ public class InsertTabletNode extends InsertNode implements 
WALEntryValue {
     searchIndex = buffer.getLong();
     try {
       devicePath =
-          DataNodeDevicePathCache.getInstance()
-              .getPartialPath((ReadWriteIOUtils.readString(buffer)));
+          
DataNodeDevicePathCache.getInstance().getPartialPath((WALReadUtils.readString(buffer)));
     } catch (IllegalPathException e) {
       throw new IllegalArgumentException("Cannot deserialize 
InsertTabletNode", e);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
index eb49d5325b0..ab95fc57662 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AbstractMemTable.java
@@ -40,6 +40,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.read.filescan.IChunkHandle;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl.MemAlignedChunkHandleImpl;
 import 
org.apache.iotdb.db.storageengine.dataregion.read.filescan.impl.MemChunkHandleImpl;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 import org.apache.iotdb.db.utils.MemUtils;
 import org.apache.iotdb.db.utils.ModificationUtils;
@@ -901,7 +902,7 @@ public abstract class AbstractMemTable implements IMemTable 
{
     }
     int size = FIXED_SERIALIZED_SIZE;
     for (Map.Entry<IDeviceID, IWritableMemChunkGroup> entry : 
memTableMap.entrySet()) {
-      size += ReadWriteIOUtils.sizeToWrite(((PlainDeviceID) 
entry.getKey()).toStringID());
+      size += WALWriteUtils.sizeToWrite(((PlainDeviceID) 
entry.getKey()).toStringID());
       size += Byte.BYTES;
       size += entry.getValue().serializedSize();
     }
@@ -948,7 +949,7 @@ public abstract class AbstractMemTable implements IMemTable 
{
     int memTableMapSize = stream.readInt();
     for (int i = 0; i < memTableMapSize; ++i) {
 
-      IDeviceID deviceID = 
deviceIDFactory.getDeviceID(ReadWriteIOUtils.readString(stream));
+      IDeviceID deviceID = 
deviceIDFactory.getDeviceID(WALReadUtils.readString(stream));
       boolean isAligned = ReadWriteIOUtils.readBool(stream);
       IWritableMemChunkGroup memChunkGroup;
       if (multiTvListMemChunk) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
index 226c2fd3980..ff519a2206a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
@@ -22,10 +22,10 @@ package 
org.apache.iotdb.db.storageengine.dataregion.memtable;
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.path.PathPatternUtil;
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
+import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALReadUtils;
 import org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALWriteUtils;
 
 import org.apache.tsfile.utils.BitMap;
-import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.apache.tsfile.write.schema.IMeasurementSchema;
 
 import java.io.DataInputStream;
@@ -180,7 +180,7 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
     int size = 0;
     size += Integer.BYTES;
     for (Map.Entry<String, IWritableMemChunk> entry : memChunkMap.entrySet()) {
-      size += ReadWriteIOUtils.sizeToWrite(entry.getKey());
+      size += WALWriteUtils.sizeToWrite(entry.getKey());
       size += entry.getValue().serializedSize();
     }
     return size;
@@ -200,7 +200,7 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
     WritableMemChunkGroup memChunkGroup = new WritableMemChunkGroup();
     int memChunkMapSize = stream.readInt();
     for (int i = 0; i < memChunkMapSize; ++i) {
-      String measurement = ReadWriteIOUtils.readString(stream);
+      String measurement = WALReadUtils.readString(stream);
       IWritableMemChunk memChunk = WritableMemChunk.deserialize(stream);
       memChunkGroup.memChunkMap.put(measurement, memChunk);
     }
@@ -212,7 +212,7 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
     WritableMemChunkGroup memChunkGroup = new WritableMemChunkGroup();
     int memChunkMapSize = stream.readInt();
     for (int i = 0; i < memChunkMapSize; ++i) {
-      String measurement = ReadWriteIOUtils.readString(stream);
+      String measurement = WALReadUtils.readString(stream);
       IWritableMemChunk memChunk = 
WritableMemChunk.deserializeSingleTVListMemChunks(stream);
       memChunkGroup.memChunkMap.put(measurement, memChunk);
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/Deletion.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/Deletion.java
index 07f8aecbfc0..c4c74df1623 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/Deletion.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/Deletion.java
@@ -24,10 +24,10 @@ import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.db.queryengine.execution.MemoryEstimationHelper;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.read.common.TimeRange;
 import org.apache.tsfile.utils.RamUsageEstimator;
-import org.apache.tsfile.utils.ReadWriteIOUtils;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -113,7 +113,7 @@ public class Deletion extends Modification implements 
Cloneable {
     serializeSize += Long.BYTES;
     stream.writeLong(getEndTime());
     serializeSize += Long.BYTES;
-    serializeSize += ReadWriteIOUtils.write(getPathString(), stream);
+    serializeSize += writeString(getPathString(), stream);
     return serializeSize;
   }
 
@@ -121,8 +121,30 @@ public class Deletion extends Modification implements 
Cloneable {
       throws IOException, IllegalPathException {
     long startTime = stream.readLong();
     long endTime = stream.readLong();
-    return new Deletion(
-        getMeasurementPath(ReadWriteIOUtils.readString(stream)), 0, startTime, 
endTime);
+    return new Deletion(getMeasurementPath(readString(stream)), 0, startTime, 
endTime);
+  }
+
+  private static int writeString(String value, DataOutputStream stream) throws 
IOException {
+    if (value == null) {
+      stream.writeInt(-1);
+      return Integer.BYTES;
+    }
+    byte[] bytes = value.getBytes(TSFileConfig.STRING_CHARSET);
+    stream.writeInt(bytes.length);
+    stream.write(bytes);
+    return Integer.BYTES + bytes.length;
+  }
+
+  private static String readString(DataInputStream stream) throws IOException {
+    int strLength = stream.readInt();
+    if (strLength < 0) {
+      return null;
+    } else if (strLength == 0) {
+      return "";
+    }
+    byte[] bytes = new byte[strLength];
+    stream.readFully(bytes);
+    return new String(bytes, TSFileConfig.STRING_CHARSET);
   }
 
   private static PartialPath getMeasurementPath(String path) throws 
IllegalPathException {
@@ -137,7 +159,14 @@ public class Deletion extends Modification implements 
Cloneable {
   }
 
   public long getSerializedSize() {
-    return Long.BYTES * 2 + Integer.BYTES + (long) getPathString().length() * 
Character.BYTES;
+    return Long.BYTES * 2L + sizeToWriteString(getPathString());
+  }
+
+  private static int sizeToWriteString(String value) {
+    if (value == null) {
+      return Integer.BYTES;
+    }
+    return Integer.BYTES + value.getBytes(TSFileConfig.STRING_CHARSET).length;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
index 15c8faa8993..a9af8f81c7d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/buffer/WALInfoEntry.java
@@ -64,7 +64,14 @@ public class WALInfoEntry extends WALEntry {
 
   @Override
   public int serializedSize() {
-    return FIXED_SERIALIZED_SIZE + (value == null ? 0 : 
value.serializedSize());
+    if (value == null) {
+      return FIXED_SERIALIZED_SIZE;
+    }
+    if (value instanceof InsertTabletNode && tabletInfo != null) {
+      return FIXED_SERIALIZED_SIZE
+          + ((InsertTabletNode) value).serializedSize(tabletInfo.tabletStart, 
tabletInfo.tabletEnd);
+    }
+    return FIXED_SERIALIZED_SIZE + value.serializedSize();
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALReadUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALReadUtils.java
new file mode 100644
index 00000000000..6d467f19934
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALReadUtils.java
@@ -0,0 +1,101 @@
+/*
+ * 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.storageengine.dataregion.wal.utils;
+
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.write.schema.MeasurementSchema;
+
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Read methods paired with {@link WALWriteUtils}. */
+public class WALReadUtils {
+
+  private WALReadUtils() {}
+
+  public static String readString(DataInputStream stream) throws IOException {
+    int strLength = stream.readInt();
+    if (strLength < 0) {
+      return null;
+    } else if (strLength == 0) {
+      return "";
+    }
+    byte[] bytes = new byte[strLength];
+    stream.readFully(bytes);
+    return new String(bytes, TSFileConfig.STRING_CHARSET);
+  }
+
+  public static String readString(ByteBuffer buffer) {
+    int strLength = buffer.getInt();
+    if (strLength < 0) {
+      return null;
+    } else if (strLength == 0) {
+      return "";
+    }
+    byte[] bytes = new byte[strLength];
+    buffer.get(bytes);
+    return new String(bytes, TSFileConfig.STRING_CHARSET);
+  }
+
+  public static MeasurementSchema readMeasurementSchema(DataInputStream 
stream) throws IOException {
+    String measurementId = readString(stream);
+    byte type = stream.readByte();
+    byte encoding = stream.readByte();
+    byte compressor = stream.readByte();
+    Map<String, String> props = readProps(stream);
+    return new MeasurementSchema(measurementId, type, encoding, compressor, 
props);
+  }
+
+  public static MeasurementSchema readMeasurementSchema(ByteBuffer buffer) {
+    String measurementId = readString(buffer);
+    byte type = buffer.get();
+    byte encoding = buffer.get();
+    byte compressor = buffer.get();
+    Map<String, String> props = readProps(buffer);
+    return new MeasurementSchema(measurementId, type, encoding, compressor, 
props);
+  }
+
+  private static Map<String, String> readProps(DataInputStream stream) throws 
IOException {
+    int size = stream.readInt();
+    if (size <= 0) {
+      return null;
+    }
+    Map<String, String> props = new HashMap<>();
+    for (int i = 0; i < size; i++) {
+      props.put(readString(stream), readString(stream));
+    }
+    return props;
+  }
+
+  private static Map<String, String> readProps(ByteBuffer buffer) {
+    int size = buffer.getInt();
+    if (size <= 0) {
+      return null;
+    }
+    Map<String, String> props = new HashMap<>();
+    for (int i = 0; i < size; i++) {
+      props.put(readString(buffer), readString(buffer));
+    }
+    return props;
+  }
+}
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALWriteUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALWriteUtils.java
index e6c0eb02722..72dd2671fa3 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALWriteUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/wal/utils/WALWriteUtils.java
@@ -21,6 +21,7 @@ package 
org.apache.iotdb.db.storageengine.dataregion.wal.utils;
 
 import 
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
 
+import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -127,13 +128,20 @@ public class WALWriteUtils {
       return write(NO_BYTE_TO_READ, buffer);
     }
     int len = 0;
-    byte[] bytes = s.getBytes();
+    byte[] bytes = s.getBytes(TSFileConfig.STRING_CHARSET);
     len += write(bytes.length, buffer);
     buffer.put(bytes);
     len += bytes.length;
     return len;
   }
 
+  public static int sizeToWrite(String s) {
+    if (s == null) {
+      return INT_LEN;
+    }
+    return INT_LEN + s.getBytes(TSFileConfig.STRING_CHARSET).length;
+  }
+
   /**
    * Write IDeviceID to byteBuffer.
    *
@@ -196,15 +204,15 @@ public class WALWriteUtils {
 
   public static int sizeToWrite(MeasurementSchema measurementSchema) {
     int byteLen = 0;
-    byteLen += 
ReadWriteIOUtils.sizeToWrite(measurementSchema.getMeasurementId());
+    byteLen += sizeToWrite(measurementSchema.getMeasurementId());
     byteLen += 3 * Byte.BYTES;
 
     Map<String, String> props = measurementSchema.getProps();
     byteLen += Integer.BYTES;
     if (props != null) {
       for (Map.Entry<String, String> entry : props.entrySet()) {
-        byteLen += ReadWriteIOUtils.sizeToWrite(entry.getKey());
-        byteLen += ReadWriteIOUtils.sizeToWrite(entry.getValue());
+        byteLen += sizeToWrite(entry.getKey());
+        byteLen += sizeToWrite(entry.getValue());
       }
     }
 
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/DeleteDataNodeSerdeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/DeleteDataNodeSerdeTest.java
index cbfba2a6879..30870855383 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/DeleteDataNodeSerdeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/DeleteDataNodeSerdeTest.java
@@ -25,10 +25,14 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.queryengine.plan.planner.plan.node.PlanNodeType;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.write.DeleteDataNode;
+import 
org.apache.iotdb.db.storageengine.dataregion.wal.utils.WALByteBufferForTest;
 
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -64,4 +68,28 @@ public class DeleteDataNodeSerdeTest {
       Assert.assertEquals(pathList.get(i), deserializedPathList.get(i));
     }
   }
+
+  @Test
+  public void testSerializeAndDeserializeForWAL() throws IllegalPathException, 
IOException {
+    long startTime = 1;
+    long endTime = 10;
+    List<PartialPath> pathList = new ArrayList<>();
+    pathList.add(new PartialPath("root.\u6570\u636e\u5e93.d1.\u6e29\u5ea6"));
+    pathList.add(new PartialPath("root.\u6570\u636e\u5e93.d2.*"));
+    DeleteDataNode deleteDataNode =
+        new DeleteDataNode(new PlanNodeId("DeleteDataNode"), pathList, 
startTime, endTime);
+
+    ByteBuffer byteBuffer = 
ByteBuffer.allocate(deleteDataNode.serializedSize());
+    deleteDataNode.serializeToWAL(new WALByteBufferForTest(byteBuffer));
+    Assert.assertEquals(deleteDataNode.serializedSize(), 
byteBuffer.position());
+
+    DataInputStream dataInputStream =
+        new DataInputStream(new ByteArrayInputStream(byteBuffer.array()));
+    Assert.assertEquals(PlanNodeType.DELETE_DATA.getNodeType(), 
dataInputStream.readShort());
+
+    DeleteDataNode deserializedNode = 
DeleteDataNode.deserializeFromWAL(dataInputStream);
+    Assert.assertEquals(startTime, deserializedNode.getDeleteStartTime());
+    Assert.assertEquals(endTime, deserializedNode.getDeleteEndTime());
+    Assert.assertEquals(pathList, deserializedNode.getPathList());
+  }
 }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertRowNodeSerdeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertRowNodeSerdeTest.java
index 523b0614282..a4e19d97176 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertRowNodeSerdeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertRowNodeSerdeTest.java
@@ -89,8 +89,8 @@ public class InsertRowNodeSerdeTest {
     tmpNode.setPlanNodeId(insertRowNode.getPlanNodeId());
     tmpNode.setMeasurementSchemas(
         new MeasurementSchema[] {
-          new MeasurementSchema("s1", TSDataType.DOUBLE),
-          new MeasurementSchema("s2", TSDataType.FLOAT),
+          new MeasurementSchema("\u6e29\u5ea6", TSDataType.DOUBLE),
+          new MeasurementSchema("\u6e7f\u5ea6", TSDataType.FLOAT),
           new MeasurementSchema("s3", TSDataType.INT64),
           new MeasurementSchema("s4", TSDataType.INT32),
           new MeasurementSchema("s5", TSDataType.BOOLEAN)
@@ -148,9 +148,9 @@ public class InsertRowNodeSerdeTest {
     InsertRowNode insertRowNode =
         new InsertRowNode(
             new PlanNodeId("plannode 2"),
-            new PartialPath("root.isp.d2"),
+            new PartialPath("root.\u6570\u636e\u5e93.d2"),
             false,
-            new String[] {"s1", "s2", "s3", "s4", "s5"},
+            new String[] {"\u6e29\u5ea6", "\u6e7f\u5ea6", "s3", "s4", "s5"},
             dataTypes,
             time,
             columns,
@@ -158,8 +158,8 @@ public class InsertRowNodeSerdeTest {
 
     insertRowNode.setMeasurementSchemas(
         new MeasurementSchema[] {
-          new MeasurementSchema("s1", TSDataType.DOUBLE),
-          new MeasurementSchema("s2", TSDataType.FLOAT),
+          new MeasurementSchema("\u6e29\u5ea6", TSDataType.DOUBLE),
+          new MeasurementSchema("\u6e7f\u5ea6", TSDataType.FLOAT),
           new MeasurementSchema("s3", TSDataType.INT64),
           new MeasurementSchema("s4", TSDataType.INT32),
           new MeasurementSchema("s5", TSDataType.BOOLEAN)
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java
index 754e7a6e138..a883b7d24a8 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/node/write/InsertTabletNodeSerdeTest.java
@@ -84,8 +84,8 @@ public class InsertTabletNodeSerdeTest {
 
     tmpNode.setMeasurementSchemas(
         new MeasurementSchema[] {
-          new MeasurementSchema("s1", TSDataType.DOUBLE),
-          new MeasurementSchema("s2", TSDataType.FLOAT),
+          new MeasurementSchema("\u6e29\u5ea6", TSDataType.DOUBLE),
+          new MeasurementSchema("\u6e7f\u5ea6", TSDataType.FLOAT),
           new MeasurementSchema("s3", TSDataType.INT64),
           new MeasurementSchema("s4", TSDataType.INT32),
           new MeasurementSchema("s5", TSDataType.BOOLEAN)
@@ -191,9 +191,9 @@ public class InsertTabletNodeSerdeTest {
     InsertTabletNode insertTabletNode =
         new InsertTabletNode(
             new PlanNodeId("plannode 1"),
-            new PartialPath("root.isp.d1"),
+            new PartialPath("root.\u6570\u636e\u5e93.d1"),
             false,
-            new String[] {"s1", "s2", "s3", "s4", "s5"},
+            new String[] {"\u6e29\u5ea6", "\u6e7f\u5ea6", "s3", "s4", "s5"},
             dataTypes,
             times,
             null,
@@ -201,8 +201,8 @@ public class InsertTabletNodeSerdeTest {
             times.length);
     insertTabletNode.setMeasurementSchemas(
         new MeasurementSchema[] {
-          new MeasurementSchema("s1", TSDataType.DOUBLE),
-          new MeasurementSchema("s2", TSDataType.FLOAT),
+          new MeasurementSchema("\u6e29\u5ea6", TSDataType.DOUBLE),
+          new MeasurementSchema("\u6e7f\u5ea6", TSDataType.FLOAT),
           new MeasurementSchema("s3", TSDataType.INT64),
           new MeasurementSchema("s4", TSDataType.INT32),
           new MeasurementSchema("s5", TSDataType.BOOLEAN)
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionTest.java
new file mode 100644
index 00000000000..c8c1a7fd0ca
--- /dev/null
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.storageengine.dataregion.modification;
+
+import org.apache.iotdb.commons.path.PartialPath;
+
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+
+import static org.junit.Assert.assertEquals;
+
+public class DeletionTest {
+
+  @Test
+  public void testSerializedSize() throws Exception {
+    Deletion deletion =
+        new Deletion(new 
PartialPath("root.\u6570\u636e\u5e93.d1.\u6e29\u5ea6"), 0, 1, 5);
+
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    long serializedSize =
+        deletion.serializeWithoutFileOffset(new 
DataOutputStream(byteArrayOutputStream));
+    byte[] bytes = byteArrayOutputStream.toByteArray();
+
+    assertEquals(deletion.getSerializedSize(), serializedSize);
+    assertEquals(deletion.getSerializedSize(), bytes.length);
+    assertEquals(
+        deletion,
+        Deletion.deserializeWithoutFileOffset(
+            new DataInputStream(new ByteArrayInputStream(bytes))));
+  }
+}
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
index f483bcfd492..8e2f45ce556 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/wal/io/WALFileTest.java
@@ -61,7 +61,7 @@ public class WALFileTest {
       new File(
           TestConstant.BASE_OUTPUT_PATH.concat(
               WALFileUtils.getLogFileName(0, 0, 
WALFileStatus.CONTAINS_SEARCH_INDEX)));
-  private final String devicePath = "root.test_sg.test_d";
+  private final String devicePath = "root.\u6570\u636e\u5e93.test_d";
 
   @Before
   public void setUp() throws Exception {
@@ -171,6 +171,16 @@ public class WALFileTest {
     assertTrue(walMetaData.getMemTablesId().isEmpty());
   }
 
+  @Test
+  public void testInsertTabletEntrySerializedSizeWithRange()
+      throws IOException, IllegalPathException {
+    WALEntry walEntry = new WALInfoEntry(1, getInsertTabletNode(devicePath), 
1, 3);
+    ByteBuffer byteBuffer = ByteBuffer.allocate(walEntry.serializedSize());
+    WALByteBufferForTest buffer = new WALByteBufferForTest(byteBuffer);
+    walEntry.serialize(buffer);
+    assertEquals(walEntry.serializedSize(), byteBuffer.position());
+  }
+
   public static InsertRowNode getInsertRowNode(String devicePath) throws 
IllegalPathException {
     long time = 110L;
     TSDataType[] dataTypes =

Reply via email to