This is an automated email from the ASF dual-hosted git repository.
jt2594838 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new ab887eb98ea Fix relational delete node serialization (#17867)
ab887eb98ea is described below
commit ab887eb98ea2d4f44a243d2df723a9bfa619df16
Author: Caideyipi <[email protected]>
AuthorDate: Tue Jun 9 12:23:31 2026 +0800
Fix relational delete node serialization (#17867)
* Fix relational delete node serialization
* Fix deletion entry serialized sizes
* Fix remaining serialized size calculations
* Fix ranged WAL serialized size calculations
* Fix relational delete resource identity
---
.../planner/plan/node/write/DeleteDataNode.java | 2 +-
.../plan/planner/plan/node/write/InsertNode.java | 10 +++++
.../planner/plan/node/write/InsertRowNode.java | 2 +-
.../planner/plan/node/write/InsertTabletNode.java | 40 ++++++++++++++---
.../plan/node/write/RelationalDeleteDataNode.java | 21 +++++++--
.../plan/node/write/RelationalInsertRowNode.java | 2 +-
.../node/write/RelationalInsertTabletNode.java | 7 ++-
.../dataregion/modification/DeletionPredicate.java | 9 ++--
.../dataregion/modification/IDPredicate.java | 13 ++----
.../dataregion/modification/ModEntry.java | 12 ++++-
.../dataregion/modification/TreeDeletionEntry.java | 11 +----
.../dataregion/modification/v1/Deletion.java | 10 ++++-
.../dataregion/wal/buffer/WALInfoEntry.java | 9 +++-
.../dataregion/wal/utils/WALWriteUtils.java | 16 +++++--
.../node/write/DeleteDataNodeSerdeTest.java | 28 ++++++++++++
.../planner/node/write/InsertRowNodeSerdeTest.java | 28 ++++++++----
.../node/write/InsertTabletNodeSerdeTest.java | 28 ++++++++----
.../node/write/RelationalDeleteDataNodeTest.java | 9 ++--
.../modification/TableDeletionEntryTest.java | 8 +++-
.../modification/TreeDeletionEntryTest.java | 5 ++-
.../dataregion/modification/v1/DeletionTest.java | 52 ++++++++++++++++++++++
.../dataregion/wal/io/WALFileTest.java | 1 +
22 files changed, 254 insertions(+), 69 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 9193de12cf2..0462a81b243 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
@@ -226,7 +226,7 @@ public class DeleteDataNode extends AbstractDeleteDataNode {
public int serializedSize() {
int size = FIXED_SERIALIZED_SIZE;
for (PartialPath path : pathList) {
- size += ReadWriteIOUtils.sizeToWrite(path.getFullPath());
+ size += WALWriteUtils.sizeToWrite(path.getFullPath());
}
return size;
}
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 e4f60752d2d..5d4d4ad8ffe 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
@@ -340,6 +340,16 @@ public abstract class InsertNode extends SearchNode {
return failedMeasurementNumber;
}
+ protected int getValidMeasurementNumber() {
+ int validMeasurementNumber = 0;
+ for (String measurement : measurements) {
+ if (measurement != null) {
+ validMeasurementNumber++;
+ }
+ }
+ return validMeasurementNumber;
+ }
+
public boolean isMeasurementFailed(int index) {
return measurements[index] == null;
}
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 6edb9efed84..fcb96cf3f07 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
@@ -556,7 +556,7 @@ public class InsertRowNode extends InsertNode implements
WALEntryValue {
protected int subSerializeSize() {
int size = 0;
size += Long.BYTES;
- size += ReadWriteIOUtils.sizeToWrite(targetPath.getFullPath());
+ size += WALWriteUtils.sizeToWrite(targetPath.getFullPath());
return size + serializeMeasurementsAndValuesSize();
}
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 677befc5d1c..98d0eca98b0 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
@@ -816,16 +816,30 @@ public class InsertTabletNode extends InsertNode
implements WALEntryValue {
return Short.BYTES + subSerializeSize(start, end);
}
+ /** Serialized size for wal */
+ public int serializedSize(List<int[]> rangeList) {
+ return Short.BYTES + subSerializeSize(rangeList);
+ }
+
int subSerializeSize(int start, int end) {
+ return subSerializeSizeByRange(Collections.singletonList(new int[] {start,
end}));
+ }
+
+ int subSerializeSize(List<int[]> rangeList) {
+ return subSerializeSizeByRange(rangeList);
+ }
+
+ private int subSerializeSizeByRange(List<int[]> rangeList) {
int size = 0;
size += Long.BYTES;
- size += ReadWriteIOUtils.sizeToWrite(targetPath.getFullPath());
+ size += WALWriteUtils.sizeToWrite(targetPath.getFullPath());
+ int rowNumInRange = getRowNumInRange(rangeList);
// measurements size
size += Integer.BYTES;
size += serializeMeasurementSchemasSize();
// times size
size += Integer.BYTES;
- size += Long.BYTES * (end - start);
+ size += Long.BYTES * rowNumInRange;
// bitmaps size
size += Byte.BYTES;
if (bitMaps != null) {
@@ -837,9 +851,13 @@ public class InsertTabletNode extends InsertNode
implements WALEntryValue {
size += Byte.BYTES;
if (bitMaps[i] != null) {
- int len = end - start;
- BitMap partBitMap = new BitMap(len);
- BitMap.copyOfRange(bitMaps[i], start, partBitMap, 0, len);
+ BitMap partBitMap = new BitMap(rowNumInRange);
+ int copiedLength = 0;
+ for (int[] range : rangeList) {
+ int len = range[1] - range[0];
+ BitMap.copyOfRange(bitMaps[i], range[0], partBitMap, copiedLength,
len);
+ copiedLength += len;
+ }
size += partBitMap.getByteArray().length;
}
}
@@ -847,7 +865,9 @@ public class InsertTabletNode extends InsertNode implements
WALEntryValue {
// values size
for (int i = 0; i < dataTypes.length; i++) {
if (columns[i] != null) {
- size += getColumnSize(dataTypes[i], columns[i], start, end);
+ for (int[] range : rangeList) {
+ size += getColumnSize(dataTypes[i], columns[i], range[0], range[1]);
+ }
}
}
// isAlign
@@ -857,6 +877,14 @@ public class InsertTabletNode extends InsertNode
implements WALEntryValue {
return size;
}
+ private int getRowNumInRange(List<int[]> rangeList) {
+ int rowNumInRange = 0;
+ for (int[] range : rangeList) {
+ rowNumInRange += range[1] - range[0];
+ }
+ return rowNumInRange;
+ }
+
private int getColumnSize(TSDataType dataType, Object column, int start, int
end) {
int size = 0;
switch (dataType) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNode.java
index f970ab70d28..a5a5a61cb9d 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNode.java
@@ -36,6 +36,7 @@ import
org.apache.iotdb.db.storageengine.dataregion.modification.ModEntry;
import
org.apache.iotdb.db.storageengine.dataregion.modification.TableDeletionEntry;
import
org.apache.iotdb.db.storageengine.dataregion.wal.buffer.IWALByteBufferView;
+import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.utils.PublicBAOS;
import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -57,8 +58,8 @@ import java.util.stream.Collectors;
public class RelationalDeleteDataNode extends AbstractDeleteDataNode {
private static final Logger LOGGER =
LoggerFactory.getLogger(RelationalDeleteDataNode.class);
- /** byte: type */
- private static final int FIXED_SERIALIZED_SIZE = Short.BYTES;
+ /** short: type, long: searchIndex */
+ private static final int FIXED_SERIALIZED_SIZE = Short.BYTES + Long.BYTES;
private final List<TableDeletionEntry> modEntries;
@@ -220,9 +221,18 @@ public class RelationalDeleteDataNode extends
AbstractDeleteDataNode {
for (TableDeletionEntry modEntry : modEntries) {
size += modEntry.serializedSize();
}
+ size += sizeToWriteVarString(databaseName);
return size;
}
+ private static int sizeToWriteVarString(final String value) {
+ if (value == null) {
+ return ReadWriteForEncodingUtils.varIntSize(-1);
+ }
+ final int byteLength = value.getBytes(TSFileConfig.STRING_CHARSET).length;
+ return ReadWriteForEncodingUtils.varIntSize(byteLength) + byteLength;
+ }
+
@Override
public void serializeToWAL(IWALByteBufferView buffer) {
serializeToWAL(buffer, getEncodedSearchIndex());
@@ -236,6 +246,7 @@ public class RelationalDeleteDataNode extends
AbstractDeleteDataNode {
for (TableDeletionEntry modEntry : modEntries) {
modEntry.serialize(buffer);
}
+ ReadWriteIOUtils.writeVar(databaseName, buffer);
} catch (IOException e) {
LOGGER.error(DataNodeQueryMessages.FAILED_TO_SERIALIZE_MODENTRY_TO_WAL,
e);
}
@@ -283,12 +294,14 @@ public class RelationalDeleteDataNode extends
AbstractDeleteDataNode {
}
final RelationalDeleteDataNode that = (RelationalDeleteDataNode) obj;
return this.getPlanNodeId().equals(that.getPlanNodeId())
- && Objects.equals(this.modEntries, that.modEntries);
+ && Objects.equals(this.modEntries, that.modEntries)
+ && Objects.equals(this.databaseName, that.databaseName)
+ && Objects.equals(this.progressIndex, that.progressIndex);
}
@Override
public int hashCode() {
- return Objects.hash(getPlanNodeId(), modEntries, progressIndex);
+ return Objects.hash(getPlanNodeId(), modEntries, databaseName,
progressIndex);
}
public String toString() {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
index 8ef6802f047..93838ffaf8b 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
@@ -219,7 +219,7 @@ public class RelationalInsertRowNode extends InsertRowNode {
@Override
protected int subSerializeSize() {
- return super.subSerializeSize() + columnCategories.length * Byte.BYTES;
+ return super.subSerializeSize() + getValidMeasurementNumber() * Byte.BYTES;
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
index ec20e7969da..839c3db5a7c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertTabletNode.java
@@ -329,7 +329,12 @@ public class RelationalInsertTabletNode extends
InsertTabletNode {
@Override
int subSerializeSize(int start, int end) {
- return super.subSerializeSize(start, end) + columnCategories.length *
Byte.BYTES;
+ return super.subSerializeSize(start, end) + getValidMeasurementNumber() *
Byte.BYTES;
+ }
+
+ @Override
+ int subSerializeSize(List<int[]> rangeList) {
+ return super.subSerializeSize(rangeList) + getValidMeasurementNumber() *
Byte.BYTES;
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
index 877c94f7081..fcccaecc60f 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/DeletionPredicate.java
@@ -147,16 +147,13 @@ public class DeletionPredicate implements
StreamSerializable, BufferSerializable
}
public int serializedSize() {
- // table name + id predicate +
+ // table name + id predicate + measurement names
int size =
- ReadWriteForEncodingUtils.varIntSize(tableName.length())
- + tableName.length() * Character.BYTES
+ ModEntry.sizeToWriteVarString(tableName)
+ idPredicate.serializedSize()
+ ReadWriteForEncodingUtils.varIntSize(measurementNames.size());
for (String measurementName : measurementNames) {
- size +=
- ReadWriteForEncodingUtils.varIntSize(
- measurementName.length() * measurementName.length() *
Character.BYTES);
+ size += ModEntry.sizeToWriteVarString(measurementName);
}
return size;
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
index d1f19df10a7..0d657dab9ed 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
@@ -22,7 +22,6 @@ import org.apache.iotdb.db.i18n.StorageEngineMessages;
import org.apache.iotdb.db.utils.io.BufferSerializable;
import org.apache.iotdb.db.utils.io.StreamSerializable;
-import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.IDeviceID.Deserializer;
import org.apache.tsfile.utils.Accountable;
@@ -265,15 +264,9 @@ public abstract class IDPredicate implements
StreamSerializable, BufferSerializa
@Override
public int serializedSize() {
- if (pattern != null) {
- byte[] bytes = pattern.getBytes(TSFileConfig.STRING_CHARSET);
- return super.serializedSize()
- + ReadWriteForEncodingUtils.varIntSize(bytes.length)
- + bytes.length * Character.BYTES
- + ReadWriteForEncodingUtils.varIntSize(segmentIndex);
- } else {
- return ReadWriteForEncodingUtils.varIntSize(-1);
- }
+ return super.serializedSize()
+ + ModEntry.sizeToWriteVarString(pattern)
+ + ReadWriteForEncodingUtils.varIntSize(segmentIndex);
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/ModEntry.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/ModEntry.java
index c538410f359..5e9ba381c30 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/ModEntry.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/ModEntry.java
@@ -24,9 +24,11 @@ import org.apache.iotdb.db.utils.io.BufferSerializable;
import org.apache.iotdb.db.utils.io.StreamSerializable;
import org.apache.tsfile.annotations.TreeModel;
+import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.utils.Accountable;
+import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
import org.apache.tsfile.utils.ReadWriteIOUtils;
import java.io.EOFException;
@@ -47,7 +49,15 @@ public abstract class ModEntry
public int serializedSize() {
// modType + time range
- return Byte.BYTES + Long.BYTES * 2 + Byte.BYTES * 2;
+ return Byte.BYTES + Long.BYTES * 2;
+ }
+
+ static int sizeToWriteVarString(final String value) {
+ if (value == null) {
+ return ReadWriteForEncodingUtils.varIntSize(-1);
+ }
+ final int byteLength = value.getBytes(TSFileConfig.STRING_CHARSET).length;
+ return ReadWriteForEncodingUtils.varIntSize(byteLength) + byteLength;
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntry.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntry.java
index 05436a6c9be..7e8059968a5 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntry.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntry.java
@@ -34,7 +34,6 @@ import org.apache.tsfile.common.constant.TsFileConstant;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.utils.RamUsageEstimator;
-import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
import org.apache.tsfile.utils.ReadWriteIOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -85,11 +84,7 @@ public class TreeDeletionEntry extends ModEntry {
@Override
public int serializedSize() {
- String patternFullPath = pathPattern.getFullPath();
- int length = patternFullPath.length();
- return super.serializedSize()
- + ReadWriteForEncodingUtils.varIntSize(length)
- + length * Character.BYTES;
+ return super.serializedSize() +
sizeToWriteVarString(pathPattern.getFullPath());
}
@Override
@@ -221,9 +216,7 @@ public class TreeDeletionEntry extends ModEntry {
}
public long getSerializedSize() {
- return modType.getSerializedSize()
- + Integer.BYTES
- + (long) pathPattern.getFullPath().length() * Character.BYTES;
+ return serializedSize();
}
@Override
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/Deletion.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/Deletion.java
index 35cd5de5479..795395f4ee1 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/Deletion.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/Deletion.java
@@ -22,6 +22,7 @@ package
org.apache.iotdb.db.storageengine.dataregion.modification.v1;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.MeasurementPath;
+import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.read.common.TimeRange;
import org.apache.tsfile.utils.ReadWriteIOUtils;
@@ -120,7 +121,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 0fa12d84a01..957cf03d892 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
@@ -82,7 +82,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.tabletRangeList);
+ }
+ return FIXED_SERIALIZED_SIZE + value.serializedSize();
}
@Override
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 be55b1785cd..087290c79ec 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.
*
@@ -197,15 +205,15 @@ public class WALWriteUtils {
public static int sizeToWrite(MeasurementSchema measurementSchema) {
int byteLen = 0;
- byteLen +=
ReadWriteIOUtils.sizeToWrite(measurementSchema.getMeasurementName());
+ byteLen += sizeToWrite(measurementSchema.getMeasurementName());
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 16cb07f86c4..2d598936f99 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
@@ -26,10 +26,14 @@ import
org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNode;
import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId;
import
org.apache.iotdb.commons.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;
@@ -66,4 +70,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<MeasurementPath> pathList = new ArrayList<>();
+ pathList.add(new
MeasurementPath("root.\u6570\u636e\u5e93.d1.\u6e29\u5ea6"));
+ pathList.add(new MeasurementPath("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 21bc9e0d120..f0681736329 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
@@ -94,8 +94,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)
@@ -124,8 +124,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)
@@ -164,6 +164,18 @@ public class InsertRowNodeSerdeTest {
Assert.assertFalse(tmpNode.isLastFragment());
}
+ @Test
+ public void testRelationalSerializedSizeWithFailedMeasurement() {
+ RelationalInsertRowNode insertRowNode =
getRelationalInsertRowNodeWithMeasurementSchemas();
+ insertRowNode.markFailedMeasurement(1);
+ insertRowNode.setFailedMeasurementNumber(1);
+
+ ByteBuffer byteBuffer =
ByteBuffer.allocate(insertRowNode.serializedSize());
+ insertRowNode.serializeToWAL(new WALByteBufferForTest(byteBuffer));
+
+ Assert.assertEquals(insertRowNode.serializedSize(), byteBuffer.position());
+ }
+
private InsertRowNode getInsertRowNode() throws IllegalPathException {
long time = 110L;
TSDataType[] dataTypes =
@@ -214,9 +226,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,
@@ -224,8 +236,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 ddc35e1eda9..8cf0ce6e36e 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
@@ -87,8 +87,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)
@@ -117,8 +117,8 @@ public class InsertTabletNodeSerdeTest {
tmpNode.setPlanNodeId(insertTabletNode.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)
@@ -223,6 +223,18 @@ public class InsertTabletNodeSerdeTest {
Assert.assertFalse(tmpNode.isLastFragment());
}
+ @Test
+ public void testRelationalSerializedSizeWithFailedMeasurement() {
+ RelationalInsertTabletNode insertTabletNode =
getRelationalInsertTabletNodeWithSchema("table1");
+ insertTabletNode.markFailedMeasurement(1);
+ insertTabletNode.setFailedMeasurementNumber(1);
+
+ ByteBuffer byteBuffer =
ByteBuffer.allocate(insertTabletNode.serializedSize());
+ insertTabletNode.serializeToWAL(new WALByteBufferForTest(byteBuffer));
+
+ Assert.assertEquals(insertTabletNode.serializedSize(),
byteBuffer.position());
+ }
+
@Test
public void testInitTabletValuesWithAllTypes()
throws NoSuchMethodException, InvocationTargetException,
IllegalAccessException {
@@ -321,9 +333,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,
@@ -331,8 +343,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/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNodeTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNodeTest.java
index 78b7a400283..e97c11c1b47 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNodeTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalDeleteDataNodeTest.java
@@ -75,12 +75,9 @@ public class RelationalDeleteDataNodeTest {
new TableDeletionEntry(
new DeletionPredicate("table1", new NOP(),
Arrays.asList("s1", "s2")),
new TimeRange(0, 10))),
- null);
- relationalDeleteDataNode.setProgressIndex(new IoTProgressIndex(0, 1L));
+ "nezha");
- ByteBuffer buffer =
ByteBuffer.allocate(relationalDeleteDataNode.serializedSize());
- relationalDeleteDataNode.serialize(buffer);
- buffer.flip();
+ ByteBuffer buffer = relationalDeleteDataNode.serializeToByteBuffer();
assertEquals(relationalDeleteDataNode, PlanNodeType.deserialize(buffer));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@@ -92,6 +89,7 @@ public class RelationalDeleteDataNodeTest {
buffer = ByteBuffer.allocate(relationalDeleteDataNode.serializedSize());
WALByteBufferForTest walByteBufferForTest = new
WALByteBufferForTest(buffer);
relationalDeleteDataNode.serializeToWAL(walByteBufferForTest);
+ assertEquals(relationalDeleteDataNode.serializedSize(), buffer.position());
buffer.flip();
PlanNode deserialized = PlanNodeType.deserializeFromWAL(buffer);
// plan node id is not serialized to WAL, manually set it to pass
comparison
@@ -108,6 +106,7 @@ public class RelationalDeleteDataNodeTest {
deserialized.setPlanNodeId(relationalDeleteDataNode.getPlanNodeId());
assertEquals(relationalDeleteDataNode, deserialized);
+ relationalDeleteDataNode.setProgressIndex(new IoTProgressIndex(0, 1L));
buffer = relationalDeleteDataNode.serializeToDAL();
deserialized = DeleteNodeType.deserializeFromDAL(buffer);
// plan node id is not serialized to DAL, manually set it to pass
comparison
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntryTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntryTest.java
index 5c2979a9075..a5d308a2b16 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntryTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TableDeletionEntryTest.java
@@ -32,6 +32,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
@@ -42,9 +43,13 @@ public class TableDeletionEntryTest {
@Test
public void testSerialization() throws IOException {
TableDeletionEntry entry =
- new TableDeletionEntry(new DeletionPredicate("table1", new NOP()), new
TimeRange(1, 5));
+ new TableDeletionEntry(
+ new DeletionPredicate(
+ "表格一", new SegmentExactMatch("区域一", 1), Arrays.asList("温度值",
"状态值")),
+ new TimeRange(1, 5));
ByteBuffer buffer = ByteBuffer.allocate(entry.serializedSize());
entry.serialize(buffer);
+ assertEquals(entry.serializedSize(), buffer.position());
buffer.flip();
ModEntry deserialized1 = ModEntry.createFrom(buffer);
assertEquals(entry, deserialized1);
@@ -52,6 +57,7 @@ public class TableDeletionEntryTest {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
entry.serialize(bos);
byte[] byteArray = bos.toByteArray();
+ assertEquals(entry.serializedSize(), byteArray.length);
ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
ModEntry deserialized2 = ModEntry.createFrom(bis);
assertEquals(entry, deserialized2);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntryTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntryTest.java
index 5087cce1111..961b4bbcdae 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntryTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/TreeDeletionEntryTest.java
@@ -37,9 +37,11 @@ public class TreeDeletionEntryTest {
@Test
public void testSerialization() throws IllegalPathException, IOException {
- TreeDeletionEntry entry = new TreeDeletionEntry(new
MeasurementPath("root.db1.d1.s1"), 1, 5);
+ TreeDeletionEntry entry = new TreeDeletionEntry(new
MeasurementPath("root.数据库.d1.温度"), 1, 5);
+ assertEquals(entry.serializedSize(), entry.getSerializedSize());
ByteBuffer buffer = ByteBuffer.allocate(entry.serializedSize());
entry.serialize(buffer);
+ assertEquals(entry.serializedSize(), buffer.position());
buffer.flip();
ModEntry deserialized1 = ModEntry.createFrom(buffer);
assertEquals(entry, deserialized1);
@@ -47,6 +49,7 @@ public class TreeDeletionEntryTest {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
entry.serialize(bos);
byte[] byteArray = bos.toByteArray();
+ assertEquals(entry.serializedSize(), byteArray.length);
ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
ModEntry deserialized2 = ModEntry.createFrom(bis);
assertEquals(entry, deserialized2);
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/DeletionTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/DeletionTest.java
new file mode 100644
index 00000000000..2bc8dba9c22
--- /dev/null
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/modification/v1/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.v1;
+
+import org.apache.iotdb.commons.path.MeasurementPath;
+
+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
MeasurementPath("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 b9e0f3cdd48..16e9bb36f87 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
@@ -178,6 +178,7 @@ public class WALFileTest {
ByteBuffer byteBuffer = ByteBuffer.allocate(walEntry.serializedSize());
WALByteBufferForTest buffer = new WALByteBufferForTest(byteBuffer);
walEntry.serialize(buffer);
+ assertEquals(walEntry.serializedSize(), byteBuffer.position());
byteBuffer.flip();
byte[] serializedEntry = new byte[byteBuffer.remaining()];
byteBuffer.get(serializedEntry);