From 01d87e48543865be3d802c6b5497191623b0ae37 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 29 May 2019 18:17:13 +0200 Subject: [PATCH] Switch default output stream version All versioned callers have been converted to use appropriate stream versions, this patch bumps the default unversioned stream to Sodium version. Since we're changing the serialization format for ExecuteRpc, make sure we fully embrace writer/reader, so that we get better instantiation. JIRA: CONTROLLER-1888 Change-Id: I17deeda1a49394600a5b0f93bd46d3b2c812123c Signed-off-by: Robert Varga --- .../AbstractNormalizedNodeDataOutput.java | 2 -- .../ForwardingNormalizedNodeDataInput.java | 6 ++++++ .../LithiumNormalizedNodeInputStreamReader.java | 3 ++- ...LithiumNormalizedNodeOutputStreamWriter.java | 2 +- .../utils/stream/NormalizedNodeDataInput.java | 9 +++++++++ .../utils/stream/NormalizedNodeDataOutput.java | 3 +++ .../NormalizedNodeOutputStreamWriter.java | 3 +-- .../SodiumNormalizedNodeInputStreamReader.java | 2 +- .../SodiumNormalizedNodeOutputStreamWriter.java | 2 +- .../remote/rpc/messages/ExecuteRpc.java | 17 ++++++++++------- 10 files changed, 34 insertions(+), 15 deletions(-) diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/AbstractNormalizedNodeDataOutput.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/AbstractNormalizedNodeDataOutput.java index 002781a9b3..447a588a10 100755 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/AbstractNormalizedNodeDataOutput.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/AbstractNormalizedNodeDataOutput.java @@ -60,8 +60,6 @@ abstract class AbstractNormalizedNodeDataOutput implements NormalizedNodeDataOut protected abstract short streamVersion(); - protected abstract void writeQName(QName qname) throws IOException; - protected abstract void writeString(String string) throws IOException; @Override diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ForwardingNormalizedNodeDataInput.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ForwardingNormalizedNodeDataInput.java index 97beda38aa..cc28b03e65 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ForwardingNormalizedNodeDataInput.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/ForwardingNormalizedNodeDataInput.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.cluster.datastore.node.utils.stream; import java.io.IOException; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -29,6 +30,11 @@ abstract class ForwardingNormalizedNodeDataInput extends ForwardingDataInput imp return delegate().readYangInstanceIdentifier(); } + @Override + public final QName readQName() throws IOException { + return delegate().readQName(); + } + @Override public final PathArgument readPathArgument() throws IOException { return delegate().readPathArgument(); diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java index 1484f735d0..1a0d6dd94b 100755 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeInputStreamReader.java @@ -208,7 +208,8 @@ class LithiumNormalizedNodeInputStreamReader extends ForwardingDataInput impleme } } - QName readQName() throws IOException { + @Override + public QName readQName() throws IOException { // Read in the same sequence of writing String localName = readCodedString(); String namespace = readCodedString(); diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeOutputStreamWriter.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeOutputStreamWriter.java index a0aa813f64..493d35c9fe 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeOutputStreamWriter.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/LithiumNormalizedNodeOutputStreamWriter.java @@ -42,7 +42,7 @@ class LithiumNormalizedNodeOutputStreamWriter extends AbstractNormalizedNodeData } @Override - protected void writeQName(final QName qname) throws IOException { + public void writeQName(final QName qname) throws IOException { writeString(qname.getLocalName()); writeModule(qname.getModule()); } diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataInput.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataInput.java index 93eb55cc8e..37152f32e9 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataInput.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataInput.java @@ -10,6 +10,9 @@ package org.opendaylight.controller.cluster.datastore.node.utils.stream; import com.google.common.annotations.Beta; import java.io.DataInput; import java.io.IOException; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -32,6 +35,8 @@ public interface NormalizedNodeDataInput extends DataInput { YangInstanceIdentifier readYangInstanceIdentifier() throws IOException; + @NonNull QName readQName() throws IOException; + PathArgument readPathArgument() throws IOException; SchemaPath readSchemaPath() throws IOException; @@ -43,4 +48,8 @@ public interface NormalizedNodeDataInput extends DataInput { * @throws IOException if the version cannot be ascertained */ NormalizedNodeStreamVersion getVersion() throws IOException; + + default Optional> readOptionalNormalizedNode() throws IOException { + return readBoolean() ? Optional.of(readNormalizedNode()) : Optional.empty(); + } } diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataOutput.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataOutput.java index dd267a0bfa..681553eb58 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataOutput.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeDataOutput.java @@ -12,6 +12,7 @@ import java.io.DataOutput; import java.io.IOException; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -23,6 +24,8 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; */ @Beta public interface NormalizedNodeDataOutput extends AutoCloseable, DataOutput { + void writeQName(@NonNull QName qname) throws IOException; + void writeNormalizedNode(@NonNull NormalizedNode normalizedNode) throws IOException; void writePathArgument(PathArgument pathArgument) throws IOException; diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java index a9515d29ff..3857634e8b 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/NormalizedNodeOutputStreamWriter.java @@ -23,8 +23,7 @@ import java.io.DataOutput; *

Based on the each node, the node type is also written to the stream, that helps in reconstructing the object, * while reading. */ -// FIXME: CONTROLLER-1888: switch this to Sodium once we have a corresponding datastore version -class NormalizedNodeOutputStreamWriter extends LithiumNormalizedNodeOutputStreamWriter { +class NormalizedNodeOutputStreamWriter extends SodiumNormalizedNodeOutputStreamWriter { NormalizedNodeOutputStreamWriter(final DataOutput output) { super(output); } diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeInputStreamReader.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeInputStreamReader.java index fdc6adf225..ac5d9fdd78 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeInputStreamReader.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeInputStreamReader.java @@ -35,7 +35,7 @@ final class SodiumNormalizedNodeInputStreamReader extends LithiumNormalizedNodeI } @Override - QName readQName() throws IOException { + public QName readQName() throws IOException { final byte valueType = readByte(); switch (valueType) { case TokenTypes.IS_QNAME_CODE: diff --git a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeOutputStreamWriter.java b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeOutputStreamWriter.java index 5f5c0a01fd..26a6613fdc 100644 --- a/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeOutputStreamWriter.java +++ b/opendaylight/md-sal/sal-clustering-commons/src/main/java/org/opendaylight/controller/cluster/datastore/node/utils/stream/SodiumNormalizedNodeOutputStreamWriter.java @@ -44,7 +44,7 @@ class SodiumNormalizedNodeOutputStreamWriter extends LithiumNormalizedNodeOutput } @Override - protected final void writeQName(final QName qname) throws IOException { + public final void writeQName(final QName qname) throws IOException { final Integer value = qnameCodeMap.get(qname); if (value == null) { // Fresh QName, remember it and emit as three strings 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 23fdfdc679..c9fb52b606 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 @@ -18,7 +18,9 @@ import java.io.ObjectOutput; import java.io.Serializable; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.opendaylight.controller.cluster.datastore.node.utils.stream.SerializationUtils; +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.NormalizedNodeInputOutput; import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -78,16 +80,17 @@ public final class ExecuteRpc implements Serializable { @Override public void writeExternal(final ObjectOutput out) throws IOException { - // FIXME: QName is a WritableObject - out.writeObject(executeRpc.getRpc()); - SerializationUtils.writeNormalizedNode(out, executeRpc.getInputNormalizedNode()); + try (NormalizedNodeDataOutput stream = NormalizedNodeInputOutput.newDataOutput(out)) { + stream.writeQName(executeRpc.getRpc()); + stream.writeOptionalNormalizedNode(executeRpc.getInputNormalizedNode()); + } } @Override public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { - // FIXME: QName is a WritableObject - QName qname = (QName) in.readObject(); - executeRpc = new ExecuteRpc(SerializationUtils.readNormalizedNode(in).orElse(null), qname); + final NormalizedNodeDataInput stream = NormalizedNodeInputOutput.newDataInput(in); + final QName qname = stream.readQName(); + executeRpc = new ExecuteRpc(stream.readOptionalNormalizedNode().orElse(null), qname); } private Object readResolve() { -- 2.36.6