From 6195cb724383cd9490ff9586e7d6dd112c7ead24 Mon Sep 17 00:00:00 2001 From: Nero Date: Thu, 8 Jan 2026 18:54:24 +0800 Subject: [PATCH] The key cause by load snapshot failure is that nonclude bytes involved preAlterColumn in these old snapshot data. Due to all data involved tableNode are stored consecutively in the snapshot file. The content of each element during serialization is of variable length, making it impossible to identify the information of preAlteredColumn. So increment a identify to find the position that can read preAlterColumn. --- .../persistence/schema/ConfigMTree.java | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java index 0f1007a65c42..2725053b8439 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java @@ -107,6 +107,8 @@ public class ConfigMTree { private static final String TABLE_ERROR_MSG = "Failed to recover configNode, because there exists data from an older incompatible version, will shutdown soon. Please delete all data, and then restart again."; + private static final int MARKER_HAVE_PREALTERED_COLUMNS = Integer.MIN_VALUE; + private final Logger logger = LoggerFactory.getLogger(ConfigMTree.class); private IConfigMNode root; // this store is only used for traverser invoking @@ -1136,15 +1138,22 @@ private void serializeTableNode(final ConfigTableNode tableNode, final OutputStr tableNode.getTable().serialize(outputStream); tableNode.getStatus().serialize(outputStream); final Set preDeletedColumns = tableNode.getPreDeletedColumns(); - ReadWriteIOUtils.write(preDeletedColumns.size(), outputStream); + + int preAlteredColumnSize = tableNode.getPreAlteredColumns().size(); + int preDeletedColumnSize = preDeletedColumns.size(); + if (preAlteredColumnSize > 0) { + ReadWriteIOUtils.write(MARKER_HAVE_PREALTERED_COLUMNS, outputStream); + ReadWriteForEncodingUtils.writeVarInt(preAlteredColumnSize, outputStream); + for (Entry entry : tableNode.getPreAlteredColumns().entrySet()) { + ReadWriteIOUtils.writeVar(entry.getKey(), outputStream); + ReadWriteIOUtils.write(entry.getValue(), outputStream); + } + } + + ReadWriteIOUtils.write(preDeletedColumnSize, outputStream); for (final String column : preDeletedColumns) { ReadWriteIOUtils.write(column, outputStream); } - ReadWriteForEncodingUtils.writeVarInt(tableNode.getPreAlteredColumns().size(), outputStream); - for (Entry entry : tableNode.getPreAlteredColumns().entrySet()) { - ReadWriteIOUtils.writeVar(entry.getKey(), outputStream); - ReadWriteIOUtils.write(entry.getValue(), outputStream); - } } public void deserialize(final InputStream inputStream) throws IOException { @@ -1238,16 +1247,20 @@ public static ConfigTableNode deserializeTableMNode(final InputStream inputStrea tableNode.setTable(TsTable.deserialize(inputStream)); tableNode.setStatus(TableNodeStatus.deserialize(inputStream)); int size = ReadWriteIOUtils.readInt(inputStream); + if (size == MARKER_HAVE_PREALTERED_COLUMNS) { + size = ReadWriteForEncodingUtils.readVarInt(inputStream); + for (int i = 0; i < size; i++) { + tableNode.addPreAlteredColumn( + ReadWriteIOUtils.readVarIntString(inputStream), + ReadWriteIOUtils.readDataType(inputStream)); + } + size = ReadWriteIOUtils.readInt(inputStream); + } + for (int i = 0; i < size; ++i) { tableNode.addPreDeletedColumn(ReadWriteIOUtils.readString(inputStream)); } - size = ReadWriteForEncodingUtils.readVarInt(inputStream); - for (int i = 0; i < size; i++) { - tableNode.addPreAlteredColumn( - ReadWriteIOUtils.readVarIntString(inputStream), - ReadWriteIOUtils.readDataType(inputStream)); - } return tableNode; }