You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ta...@apache.org on 2024/09/26 11:12:45 UTC
(iotdb) branch rc/1.3.3 updated: Fix NodeInfo processLoadSnapshot method (avoid compatibility issues caused by ainode serialization) (#13622) (#13637)
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 <li...@126.com>
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();
}