Skip to content

Commit dab572d

Browse files
authored
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. (#17004)
1 parent c563f96 commit dab572d

1 file changed

Lines changed: 25 additions & 12 deletions

File tree

  • iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ public class ConfigMTree {
107107
private static final String TABLE_ERROR_MSG =
108108
"Failed to recover configNode, because there exists data from an older incompatible version, will shutdown soon. Please delete all data, and then restart again.";
109109

110+
private static final int MARKER_HAVE_PREALTERED_COLUMNS = Integer.MIN_VALUE;
111+
110112
private final Logger logger = LoggerFactory.getLogger(ConfigMTree.class);
111113
private IConfigMNode root;
112114
// this store is only used for traverser invoking
@@ -1136,15 +1138,22 @@ private void serializeTableNode(final ConfigTableNode tableNode, final OutputStr
11361138
tableNode.getTable().serialize(outputStream);
11371139
tableNode.getStatus().serialize(outputStream);
11381140
final Set<String> preDeletedColumns = tableNode.getPreDeletedColumns();
1139-
ReadWriteIOUtils.write(preDeletedColumns.size(), outputStream);
1141+
1142+
int preAlteredColumnSize = tableNode.getPreAlteredColumns().size();
1143+
int preDeletedColumnSize = preDeletedColumns.size();
1144+
if (preAlteredColumnSize > 0) {
1145+
ReadWriteIOUtils.write(MARKER_HAVE_PREALTERED_COLUMNS, outputStream);
1146+
ReadWriteForEncodingUtils.writeVarInt(preAlteredColumnSize, outputStream);
1147+
for (Entry<String, TSDataType> entry : tableNode.getPreAlteredColumns().entrySet()) {
1148+
ReadWriteIOUtils.writeVar(entry.getKey(), outputStream);
1149+
ReadWriteIOUtils.write(entry.getValue(), outputStream);
1150+
}
1151+
}
1152+
1153+
ReadWriteIOUtils.write(preDeletedColumnSize, outputStream);
11401154
for (final String column : preDeletedColumns) {
11411155
ReadWriteIOUtils.write(column, outputStream);
11421156
}
1143-
ReadWriteForEncodingUtils.writeVarInt(tableNode.getPreAlteredColumns().size(), outputStream);
1144-
for (Entry<String, TSDataType> entry : tableNode.getPreAlteredColumns().entrySet()) {
1145-
ReadWriteIOUtils.writeVar(entry.getKey(), outputStream);
1146-
ReadWriteIOUtils.write(entry.getValue(), outputStream);
1147-
}
11481157
}
11491158

11501159
public void deserialize(final InputStream inputStream) throws IOException {
@@ -1238,16 +1247,20 @@ public static ConfigTableNode deserializeTableMNode(final InputStream inputStrea
12381247
tableNode.setTable(TsTable.deserialize(inputStream));
12391248
tableNode.setStatus(TableNodeStatus.deserialize(inputStream));
12401249
int size = ReadWriteIOUtils.readInt(inputStream);
1250+
if (size == MARKER_HAVE_PREALTERED_COLUMNS) {
1251+
size = ReadWriteForEncodingUtils.readVarInt(inputStream);
1252+
for (int i = 0; i < size; i++) {
1253+
tableNode.addPreAlteredColumn(
1254+
ReadWriteIOUtils.readVarIntString(inputStream),
1255+
ReadWriteIOUtils.readDataType(inputStream));
1256+
}
1257+
size = ReadWriteIOUtils.readInt(inputStream);
1258+
}
1259+
12411260
for (int i = 0; i < size; ++i) {
12421261
tableNode.addPreDeletedColumn(ReadWriteIOUtils.readString(inputStream));
12431262
}
12441263

1245-
size = ReadWriteForEncodingUtils.readVarInt(inputStream);
1246-
for (int i = 0; i < size; i++) {
1247-
tableNode.addPreAlteredColumn(
1248-
ReadWriteIOUtils.readVarIntString(inputStream),
1249-
ReadWriteIOUtils.readDataType(inputStream));
1250-
}
12511264
return tableNode;
12521265
}
12531266

0 commit comments

Comments
 (0)