Remove use of thread-local input 68/82468/11
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 3 Jun 2019 19:37:43 +0000 (21:37 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 12 Jun 2019 11:23:22 +0000 (13:23 +0200)
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 <robert.varga@pantheon.tech>
(cherry picked from commit 728a8db811f7a257a0b69243cbf76bb5ccf69658)

opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtils.java
opendaylight/md-sal/sal-clustering-commons/src/test/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SerializationUtilsTest.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/AbstractRead.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/ReadDataReply.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/messages/RegisterDataTreeChangeListener.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/DeleteModification.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/MergeModification.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/modification/WriteModification.java
opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/MetadataShardDataTreeSnapshot.java
opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/ExecuteRpc.java
opendaylight/md-sal/sal-remoterpc-connector/src/main/java/org/opendaylight/controller/remote/rpc/messages/RpcResponse.java

index 46bcf0892936017579ec304586f4bb1e8a6d64e1..7d46d3cab33eddb05745c58e9a56c771636e46fe 100644 (file)
@@ -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<NormalizedNodeDataOutput> REUSABLE_WRITER_TL = new ThreadLocal<>();
+    @Deprecated
     public static final ThreadLocal<NormalizedNodeDataInput> REUSABLE_READER_TL = new ThreadLocal<>();
 
     private SerializationUtils() {
+
     }
 
+    @FunctionalInterface
     public interface Applier<T> {
         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 <T> void deserializePathAndNode(final DataInput in, final T instance, final Applier<T> 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<NormalizedNode<?, ?>> 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 <T> void readNodeAndPath(final DataInput in, final T instance, final Applier<T> 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 <T> void readPathAndNode(final DataInput in, final T instance, final Applier<T> 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);
index f0cfdc41f23fa82cc23b6e4be2d51958944f179b..96a93104b243c97d436b61675bd669a322787a84 100644 (file)
@@ -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);
index 5b92545c82ad132f45256962fb01eab93dbf6ad2..acd35d210f0db2da07ca54d3a940f76e9c668e08 100644 (file)
@@ -41,9 +41,9 @@ public abstract class AbstractRead<T> 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
index 93bf2ece0cc6e002b189e6cf4f7deee6155cb854..5c00cf16507344febb6fcce8d87d897863f1145d 100644 (file)
@@ -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
index 83542a0de285fbafe05f5b3e6540b232d6f8873f..cbe9dbf5d041782135102c516d60c8b1f355b63a 100644 (file)
@@ -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();
     }
 
index c1cd61dea0a66fbe94835cfbe7312ad30bbed4f9..d3f0d4bd207480a2fc95c14375d55381dcf4c017 100644 (file)
@@ -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;
     }
 
index 64c75f4620510d0657803af34698d7ed55298f20..6f512acb63cbe1e2252ccab7931dea2fa752a078 100644 (file)
@@ -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;
     }
 
index 80de2e8b07d4c60dd36be6d7e4eb202b1af72b8a..f2b2d0104659a31387cbe072c9e39ddb78edc249 100644 (file)
@@ -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<WriteModification> APPLIER = (instance, path, node) -> {
-        instance.setPath(path);
-        instance.data = node;
-    };
 }
index fa8877fd9fef9b7d3d6f10d475c59793cd92fffd..320ae61cd32f75e89f92514ceeb1bb575e037435 100644 (file)
@@ -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() {
index e32ef3dc0df6c5bae9ffd808d7c3fe2494437e7d..23fdfdc6795ba6b27dd9fce08cd443b2b9de8d9c 100644 (file)
@@ -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() {
index 35e561178102187aef2c5453160b4c61d9d0be65..6f1b44b8f822cd88cac40c528f261a304c2dbb2d 100644 (file)
@@ -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() {