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) {