From e6e14f87df36c0c704ec012d07bfd0ac5b9f1848 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 3 Jun 2019 21:37:43 +0200 Subject: [PATCH] Remove use of thread-local input All callers are only called from top-level constructs, thus not having a relationship with the context in which they are deserialized. JIRA: CONTROLLER-1888 Change-Id: I856f9109480fb83475a20ce4430d02a1dd055522 Signed-off-by: Robert Varga (cherry picked from commit 728a8db811f7a257a0b69243cbf76bb5ccf69658) --- .../node/utils/stream/SerializationUtils.java | 36 +++++++++++++++++++ .../utils/stream/SerializationUtilsTest.java | 4 +-- .../datastore/messages/AbstractRead.java | 4 +-- .../datastore/messages/ReadDataReply.java | 2 +- .../RegisterDataTreeChangeListener.java | 2 +- .../modification/DeleteModification.java | 10 ++++-- .../modification/MergeModification.java | 6 +++- .../modification/WriteModification.java | 19 +++++----- .../MetadataShardDataTreeSnapshot.java | 3 +- .../remote/rpc/messages/ExecuteRpc.java | 3 +- .../remote/rpc/messages/RpcResponse.java | 4 +-- 11 files changed, 69 insertions(+), 24 deletions(-) diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java index 46bcf08929..7d46d3cab3 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java @@ -15,6 +15,7 @@ import java.io.DataInputStream; import java.io.DataOutput; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -28,11 +29,14 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public final class SerializationUtils { @Deprecated public static final ThreadLocal REUSABLE_WRITER_TL = new ThreadLocal<>(); + @Deprecated public static final ThreadLocal REUSABLE_READER_TL = new ThreadLocal<>(); private SerializationUtils() { + } + @FunctionalInterface public interface Applier { void apply(T instance, YangInstanceIdentifier path, NormalizedNode node); } @@ -47,6 +51,7 @@ public final class SerializationUtils { return streamWriter; } + @Deprecated private static NormalizedNodeDataInput streamReader(final DataInput in) throws IOException { NormalizedNodeDataInput streamReader = REUSABLE_READER_TL.get(); if (streamReader == null) { @@ -70,6 +75,7 @@ public final class SerializationUtils { } } + @Deprecated public static void deserializePathAndNode(final DataInput in, final T instance, final Applier applier) { try { NormalizedNodeDataInput streamReader = streamReader(in); @@ -91,6 +97,7 @@ public final class SerializationUtils { return null; } + @Deprecated public static NormalizedNode deserializeNormalizedNode(final DataInput in) { try { return tryDeserializeNormalizedNode(in); @@ -99,6 +106,7 @@ public final class SerializationUtils { } } + @Deprecated public static NormalizedNode deserializeNormalizedNode(final byte [] bytes) { try { return tryDeserializeNormalizedNode(new DataInputStream(new ByteArrayInputStream(bytes))); @@ -107,6 +115,13 @@ public final class SerializationUtils { } } + public static Optional> readNormalizedNode(final DataInput in) throws IOException { + if (!in.readBoolean()) { + return Optional.empty(); + } + return Optional.of(NormalizedNodeInputOutput.newDataInput(in).readNormalizedNode()); + } + @Deprecated public static void serializeNormalizedNode(final NormalizedNode node, final DataOutput out) { try { @@ -150,6 +165,10 @@ public final class SerializationUtils { } } + public static YangInstanceIdentifier readPath(final DataInput in) throws IOException { + return NormalizedNodeInputOutput.newDataInput(in).readYangInstanceIdentifier(); + } + public static void writePath(final DataOutput out, final @NonNull YangInstanceIdentifier path) throws IOException { try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { @@ -157,6 +176,14 @@ public final class SerializationUtils { } } + public static void readNodeAndPath(final DataInput in, final T instance, final Applier applier) + throws IOException { + final NormalizedNodeDataInput stream = NormalizedNodeInputOutput.newDataInput(in); + NormalizedNode node = stream.readNormalizedNode(); + YangInstanceIdentifier path = stream.readYangInstanceIdentifier(); + applier.apply(instance, path, node); + } + public static void writeNodeAndPath(final DataOutput out, final YangInstanceIdentifier path, final NormalizedNode node) throws IOException { try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { @@ -165,6 +192,14 @@ public final class SerializationUtils { } } + public static void readPathAndNode(final DataInput in, final T instance, final Applier applier) + throws IOException { + final NormalizedNodeDataInput stream = NormalizedNodeInputOutput.newDataInput(in); + YangInstanceIdentifier path = stream.readYangInstanceIdentifier(); + NormalizedNode node = stream.readNormalizedNode(); + applier.apply(instance, path, node); + } + public static void writePathAndNode(final DataOutput out, final YangInstanceIdentifier path, final NormalizedNode node) throws IOException { try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { @@ -173,6 +208,7 @@ public final class SerializationUtils { } } + @Deprecated public static YangInstanceIdentifier deserializePath(final DataInput in) { try { NormalizedNodeDataInput streamReader = streamReader(in); diff --git a/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtilsTest.java b/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtilsTest.java index f0cfdc41f2..96a93104b2 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtilsTest.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtilsTest.java @@ -83,7 +83,7 @@ public class SerializationUtilsTest { .build(); SerializationUtils.writePath(out, path); final YangInstanceIdentifier deserialized = - SerializationUtils.deserializePath(new DataInputStream(new ByteArrayInputStream(bos.toByteArray()))); + SerializationUtils.readPath(new DataInputStream(new ByteArrayInputStream(bos.toByteArray()))); Assert.assertEquals(path, deserialized); } @@ -96,7 +96,7 @@ public class SerializationUtilsTest { SerializationUtils.writeNodeAndPath(out, path, node); final DataInputStream in = new DataInputStream(new ByteArrayInputStream(bos.toByteArray())); final AtomicBoolean applierCalled = new AtomicBoolean(false); - SerializationUtils.deserializePathAndNode(in, applierCalled, (instance, deserializedPath, deserializedNode) -> { + SerializationUtils.readNodeAndPath(in, applierCalled, (instance, deserializedPath, deserializedNode) -> { Assert.assertEquals(path, deserializedPath); Assert.assertEquals(node, deserializedNode); applierCalled.set(true); diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java index 5b92545c82..acd35d210f 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java @@ -41,9 +41,9 @@ public abstract class AbstractRead extends VersionedExternalizableMessage { } @Override - public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { + public final void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); - path = SerializationUtils.deserializePath(in); + path = SerializationUtils.readPath(in); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java index 93bf2ece0c..5c00cf1650 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java @@ -34,7 +34,7 @@ public class ReadDataReply extends VersionedExternalizableMessage { @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); - normalizedNode = SerializationUtils.deserializeNormalizedNode(in); + normalizedNode = SerializationUtils.readNormalizedNode(in).orElse(null); } @Override diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java index 83542a0de2..cbe9dbf5d0 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java @@ -62,7 +62,7 @@ public final class RegisterDataTreeChangeListener implements Externalizable { @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { dataTreeChangeListenerPath = (ActorRef) in.readObject(); - path = SerializationUtils.deserializePath(in); + path = SerializationUtils.readPath(in); registerOnAllInstances = in.readBoolean(); } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java index c1cd61dea0..d3f0d4bd20 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java @@ -57,8 +57,8 @@ public class DeleteModification extends AbstractModification { } @Override - public void readExternal(final ObjectInput in) { - setPath(SerializationUtils.deserializePath(in)); + public void readExternal(final ObjectInput in) throws IOException { + setPath(SerializationUtils.readPath(in)); } @Override @@ -74,7 +74,11 @@ public class DeleteModification extends AbstractModification { @Deprecated public static DeleteModification fromStream(final ObjectInput in, final short version) { DeleteModification mod = new DeleteModification(version); - mod.readExternal(in); + try { + mod.readExternal(in); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing DeleteModification", e); + } return mod; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MergeModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MergeModification.java index 64c75f4620..6f512acb63 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MergeModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MergeModification.java @@ -57,7 +57,11 @@ public class MergeModification extends WriteModification { @Deprecated public static MergeModification fromStream(final ObjectInput in, final short version) { MergeModification mod = new MergeModification(version); - mod.readExternal(in); + try { + mod.readExternal(in); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing MergeModification", e); + } return mod; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java index 80de2e8b07..f2b2d01046 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java @@ -15,7 +15,6 @@ import org.opendaylight.controller.cluster.datastore.DataStoreVersions; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataInput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.NormalizedNodeDataOutput; import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; -import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils.Applier; import org.opendaylight.mdsal.dom.spi.store.DOMStoreWriteTransaction; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -67,8 +66,11 @@ public class WriteModification extends AbstractModification { } @Override - public void readExternal(final ObjectInput in) { - SerializationUtils.deserializePathAndNode(in, this, APPLIER); + public void readExternal(final ObjectInput in) throws IOException { + SerializationUtils.readNodeAndPath(in, this, (instance, path, node) -> { + instance.setPath(path); + instance.data = node; + }); } @Override @@ -79,7 +81,11 @@ public class WriteModification extends AbstractModification { @Deprecated public static WriteModification fromStream(final ObjectInput in, final short version) { WriteModification mod = new WriteModification(version); - mod.readExternal(in); + try { + mod.readExternal(in); + } catch (IOException e) { + throw new IllegalArgumentException("Error deserializing WriteModification", e); + } return mod; } @@ -96,9 +102,4 @@ public class WriteModification extends AbstractModification { out.writeNormalizedNode(data); out.writeYangInstanceIdentifier(getPath()); } - - private static final Applier APPLIER = (instance, path, node) -> { - instance.setPath(path); - instance.data = node; - }; } diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java index fa8877fd9f..320ae61cd3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java @@ -10,7 +10,6 @@ package org.opendaylight.controller.cluster.datastore.persisted; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import com.google.common.base.Verify; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -80,7 +79,7 @@ public final class MetadataShardDataTreeSnapshot extends AbstractVersionedShardD } metadata = metaBuilder.build(); - rootNode = Verify.verifyNotNull(SerializationUtils.deserializeNormalizedNode(in)); + rootNode = SerializationUtils.readNormalizedNode(in).get(); } private Object readResolve() { diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/ExecuteRpc.java b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/ExecuteRpc.java index e32ef3dc0d..23fdfdc679 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/ExecuteRpc.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/ExecuteRpc.java @@ -85,8 +85,9 @@ public final class ExecuteRpc implements Serializable { @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { + // FIXME: QName is a WritableObject QName qname = (QName) in.readObject(); - executeRpc = new ExecuteRpc(SerializationUtils.deserializeNormalizedNode(in), qname); + executeRpc = new ExecuteRpc(SerializationUtils.readNormalizedNode(in).orElse(null), qname); } private Object readResolve() { diff --git a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/RpcResponse.java b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/RpcResponse.java index 35e5611781..6f1b44b8f8 100644 --- a/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/RpcResponse.java +++ b/opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/RpcResponse.java @@ -58,8 +58,8 @@ public class RpcResponse implements Serializable { } @Override - public void readExternal(final ObjectInput in) { - rpcResponse = new RpcResponse(SerializationUtils.deserializeNormalizedNode(in)); + public void readExternal(final ObjectInput in) throws IOException { + rpcResponse = new RpcResponse(SerializationUtils.readNormalizedNode(in).orElse(null)); } private Object readResolve() { -- 2.36.6