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();
   }
 

Reply via email to