This is an automated email from the ASF dual-hosted git repository.

zstan pushed a commit to branch ignite-3.1.0
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/ignite-3.1.0 by this push:
     new 6d17ee916ad IGNITE-26559 Fix assignments serialization issue between 
3.0 to 3.1 (#6722)
6d17ee916ad is described below

commit 6d17ee916ad861472f3f98cc85eb8440f430e1e8
Author: Cyrill <[email protected]>
AuthorDate: Tue Oct 14 08:47:44 2025 +0300

    IGNITE-26559 Fix assignments serialization issue between 3.0 to 3.1 (#6722)
---
 .../AssignmentsQueueSerializer.java                | 25 ++++++++++++++++++++++
 .../AssignmentsQueueSerializerTest.java            | 21 ++++++++++--------
 2 files changed, 37 insertions(+), 9 deletions(-)

diff --git 
a/modules/partition-distribution/src/main/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializer.java
 
b/modules/partition-distribution/src/main/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializer.java
index 53bbf047ac0..d3960b6e245 100644
--- 
a/modules/partition-distribution/src/main/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializer.java
+++ 
b/modules/partition-distribution/src/main/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializer.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.partitiondistribution;
 
+import static java.util.List.of;
+
 import java.io.IOException;
 import java.util.LinkedList;
 import org.apache.ignite.internal.util.io.IgniteDataInput;
@@ -40,6 +42,14 @@ public class AssignmentsQueueSerializer extends 
VersionedSerializer<AssignmentsQ
 
     @Override
     protected AssignmentsQueue readExternalData(byte protoVer, IgniteDataInput 
in) throws IOException {
+        if (protoVer == 1) {
+            return readLegacySchema(protoVer, in);
+        }
+
+        return readActualSchema(protoVer, in);
+    }
+
+    private static AssignmentsQueue readActualSchema(byte protoVer, 
IgniteDataInput in) throws IOException {
         int length = in.readVarIntAsInt();
 
         LinkedList<Assignments> queue = new LinkedList<>();
@@ -49,4 +59,19 @@ public class AssignmentsQueueSerializer extends 
VersionedSerializer<AssignmentsQ
 
         return new AssignmentsQueue(queue);
     }
+
+    /**
+     * Previously the bytes we are trying to read was having Assignments, at 
some point it was replaced with AssignmentsQueue, but no
+     * specific handling was made to maintain backward compatibility.
+     *
+     * <p>Here we know this proto version might be either Assignments or 
AssignmentsQueue, so do our best to read it.
+     */
+    private static AssignmentsQueue readLegacySchema(byte protoVer, 
IgniteDataInput in) throws IOException {
+        return new 
AssignmentsQueue(of(AssignmentsSerializer.INSTANCE.readExternalData(protoVer, 
in)));
+    }
+
+    @Override
+    protected byte getProtocolVersion() {
+        return 2;
+    }
 }
diff --git 
a/modules/partition-distribution/src/test/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializerTest.java
 
b/modules/partition-distribution/src/test/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializerTest.java
index 023ecea6b4e..4a7780ca5dc 100644
--- 
a/modules/partition-distribution/src/test/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializerTest.java
+++ 
b/modules/partition-distribution/src/test/java/org/apache/ignite/internal/partitiondistribution/AssignmentsQueueSerializerTest.java
@@ -19,9 +19,7 @@ package org.apache.ignite.internal.partitiondistribution;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
-import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.time.LocalDateTime;
 import java.time.Month;
@@ -29,6 +27,7 @@ import java.time.ZoneOffset;
 import java.util.Base64;
 import java.util.Set;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
+import org.apache.ignite.internal.lang.IgniteInternalException;
 import org.apache.ignite.internal.versioned.VersionedSerialization;
 import org.apache.ignite.internal.versioned.VersionedSerializer;
 import org.junit.jupiter.api.Test;
@@ -62,15 +61,19 @@ class AssignmentsQueueSerializerTest {
     @Test
     void v1CanBeDeserialized() {
         byte[] bytes = Base64.getDecoder().decode(ASSIGNMENTS_QUEUE_V1);
-        AssignmentsQueue restoredAssignmentsQueue = 
VersionedSerialization.fromBytes(bytes, serializer);
+        // In order to maintain 3.1 to 3.0 backward compatibility we drop 
AssignmentsQueue v1 support.
+        assertThrows(IgniteInternalException.class, () -> 
VersionedSerialization.fromBytes(bytes, serializer));
+    }
+
+    @Test
+    void assignmentsCanBeDeserialized() {
+        AssignmentsSerializer assignmentsSerializer = new 
AssignmentsSerializer();
+        Assignments assignments = testAssignments(true, false);
+        byte[] assignmentsBytes = VersionedSerialization.toBytes(assignments, 
assignmentsSerializer);
 
-        assertFalse(restoredAssignmentsQueue.isEmpty());
-        assertThat(restoredAssignmentsQueue.poll(), 
equalTo(testAssignments(true, false)));
-        assertThat(restoredAssignmentsQueue.poll(), 
equalTo(testAssignments(false, true)));
-        assertThat(restoredAssignmentsQueue.poll(), 
equalTo(testAssignments(false, false)));
+        AssignmentsQueue restoredAssignmentsQueue = 
VersionedSerialization.fromBytes(assignmentsBytes, serializer);
 
-        assertTrue(restoredAssignmentsQueue.isEmpty());
-        assertThrows(AssertionError.class, restoredAssignmentsQueue::poll);
+        assertThat(restoredAssignmentsQueue.poll(), equalTo(assignments));
     }
 
     private static Assignments testAssignments(boolean force, boolean 
fromReset) {

Reply via email to