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