This is an automated email from the ASF dual-hosted git repository.
tanxinyu pushed a commit to branch rc/1.3.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rc/1.3.3 by this push:
new f27a2495872 Fix NodeInfo processLoadSnapshot method (avoid
compatibility issues caused by ainode serialization) (#13622) (#13637)
f27a2495872 is described below
commit f27a24958720a0a9f423e7e6a96140d8bede77f6
Author: Li Yu Heng <[email protected]>
AuthorDate: Thu Sep 26 19:12:38 2024 +0800
Fix NodeInfo processLoadSnapshot method (avoid compatibility issues caused
by ainode serialization) (#13622) (#13637)
---
.../confignode/persistence/node/NodeInfo.java | 33 ++++++++++++++++------
1 file changed, 25 insertions(+), 8 deletions(-)
diff --git
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/node/NodeInfo.java
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/node/NodeInfo.java
index 7dd4af334a7..54570321e9e 100644
---
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/node/NodeInfo.java
+++
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/node/NodeInfo.java
@@ -51,12 +51,13 @@ import org.apache.tsfile.utils.ReadWriteIOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.ByteArrayInputStream;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -722,21 +723,24 @@ public class NodeInfo implements SnapshotProcessor {
aiNodeInfoReadWriteLock.writeLock().lock();
versionInfoReadWriteLock.writeLock().lock();
- try (FileInputStream fileInputStream = new FileInputStream(snapshotFile);
- TIOStreamTransport tioStreamTransport = new
TIOStreamTransport(fileInputStream)) {
+ try (ByteArrayInputStream inputStream =
+ new
ByteArrayInputStream(Files.readAllBytes(snapshotFile.toPath()));
+ TIOStreamTransport tioStreamTransport = new
TIOStreamTransport(inputStream)) {
TProtocol protocol = new TBinaryProtocol(tioStreamTransport);
clear();
- nextNodeId.set(ReadWriteIOUtils.readInt(fileInputStream));
+ nextNodeId.set(ReadWriteIOUtils.readInt(inputStream));
- deserializeRegisteredConfigNode(fileInputStream, protocol);
+ deserializeRegisteredConfigNode(inputStream, protocol);
- deserializeRegisteredDataNode(fileInputStream, protocol);
+ deserializeRegisteredDataNode(inputStream, protocol);
- deserializeRegisteredAINode(fileInputStream, protocol);
+ // TODO: Compatibility design. Should replace this function to actual
deserialization method
+ // in IoTDB 2.2 / 1.5
+ tryDeserializeRegisteredAINode(inputStream, protocol);
- deserializeBuildInfo(fileInputStream);
+ deserializeBuildInfo(inputStream);
} finally {
versionInfoReadWriteLock.writeLock().unlock();
@@ -770,6 +774,18 @@ public class NodeInfo implements SnapshotProcessor {
}
}
+ private void tryDeserializeRegisteredAINode(ByteArrayInputStream
inputStream, TProtocol protocol)
+ throws IOException {
+ try {
+ // 0 has no meaning here
+ inputStream.mark(0);
+ deserializeRegisteredAINode(inputStream, protocol);
+ } catch (IOException | TException ignore) {
+ // Exception happens here means that the data is upgraded from the old
version
+ inputStream.reset();
+ }
+ }
+
private void deserializeRegisteredAINode(InputStream inputStream, TProtocol
protocol)
throws IOException, TException {
int size = ReadWriteIOUtils.readInt(inputStream);
@@ -805,6 +821,7 @@ public class NodeInfo implements SnapshotProcessor {
nextNodeId.set(-1);
registeredDataNodes.clear();
registeredConfigNodes.clear();
+ registeredAINodes.clear();
nodeVersionInfo.clear();
}