You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sd...@apache.org on 2022/01/11 23:56:53 UTC

[ignite-3] 25/27: - resolve a TODO

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

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

commit 0dab994d92a086651938df8651fbbd6f54d7b651
Author: Roman Puchkovskiy <ro...@gmail.com>
AuthorDate: Tue Jan 11 19:12:56 2022 +0400

    - resolve a TODO
---
 .../marshal/DefaultUserObjectMarshaller.java       |  1 -
 ...ltUserObjectMarshallerWithSerializableTest.java | 55 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java b/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
index 36a8c6d..b15f6be 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshaller.java
@@ -315,7 +315,6 @@ public class DefaultUserObjectMarshaller implements UserObjectMarshaller {
     private <T> T unmarshalFromInput(DataInputStream input, UnmarshallingContext context) throws IOException, UnmarshalException {
         int commandOrDescriptorId = ProtocolMarshalling.readDescriptorOrCommandId(input);
         if (commandOrDescriptorId == SerializedStreamCommands.REFERENCE) {
-            // TODO: IGNITE-16165 - make sure readResolve() is applied correctly when we exit early due to reading a reference
             return unmarshalReference(input, context);
         }
 
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithSerializableTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithSerializableTest.java
index 66e421e..2cd2388 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithSerializableTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/serialization/marshal/DefaultUserObjectMarshallerWithSerializableTest.java
@@ -25,6 +25,7 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.sameInstance;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -216,6 +217,28 @@ class DefaultUserObjectMarshallerWithSerializableTest {
         assertFalse(constructorCalled);
     }
 
+    @Test
+    void resolveObjectWorksCorrectlyWhenInSelfCycle() throws Exception {
+        SelfRefWithResolveToSelf deserialized = marshalAndUnmarshalNonNull(new SelfRefWithResolveToSelf(42));
+
+        assertThat(deserialized.value, is(42 + READ_RESOLVE_INCREMENT));
+        assertThat(deserialized.self, is(sameInstance(deserialized)));
+    }
+
+    @Test
+    void resolveObjectProducesUnrolledCyclesAsInJavaSerializationWhenObjectIsInCycleWithLengthOfMoreThanOne() throws Exception {
+        RelativeSelfRefWithResolveToSelf first = new RelativeSelfRefWithResolveToSelf(42);
+        RelativeSelfRefWithResolveToSelf second = new RelativeSelfRefWithResolveToSelf(43);
+        first.ref = second;
+        second.ref = first;
+
+        RelativeSelfRefWithResolveToSelf deserialized = marshalAndUnmarshalNonNull(first);
+
+        assertThat(deserialized.value, is(42 + READ_RESOLVE_INCREMENT));
+        assertThat(deserialized.ref.value, is(43 + READ_RESOLVE_INCREMENT));
+        assertThat(deserialized.ref.ref, is(not(sameInstance(deserialized))));
+    }
+
     /**
      * An {@link Serializable} that does not have {@code writeReplace()}/{@code readResolve()} methods or other customizations.
      */
@@ -427,4 +450,36 @@ class DefaultUserObjectMarshallerWithSerializableTest {
             constructorCalled = true;
         }
     }
+
+    private static class SelfRefWithResolveToSelf implements Serializable {
+        private final int value;
+        private final SelfRefWithResolveToSelf self;
+
+        private SelfRefWithResolveToSelf(int value) {
+            this.value = value;
+            this.self = this;
+        }
+
+        private Object readResolve() {
+            return new SelfRefWithResolveToSelf(value + READ_RESOLVE_INCREMENT);
+        }
+    }
+
+    private static class RelativeSelfRefWithResolveToSelf implements Serializable {
+        private final int value;
+        private RelativeSelfRefWithResolveToSelf ref;
+
+        private RelativeSelfRefWithResolveToSelf(int value) {
+            this.value = value;
+        }
+
+        private RelativeSelfRefWithResolveToSelf(int value, RelativeSelfRefWithResolveToSelf ref) {
+            this.value = value;
+            this.ref = ref;
+        }
+
+        private Object readResolve() {
+            return new RelativeSelfRefWithResolveToSelf(value + READ_RESOLVE_INCREMENT, ref);
+        }
+    }
 }