X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fpersisted%2FCommitTransactionPayload.java;h=fb66581c28f1d9d4f0b8a01c8e7ada7225357e1d;hb=refs%2Fchanges%2F65%2F84765%2F3;hp=c348727cf89f4136a8e00ec1719621a1154e5d9c;hpb=6276a65120a674b545ea787a5e1d9311bcdbf2af;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/CommitTransactionPayload.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/CommitTransactionPayload.java index c348727cf8..fb66581c28 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/CommitTransactionPayload.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/persisted/CommitTransactionPayload.java @@ -7,8 +7,10 @@ */ package org.opendaylight.controller.cluster.datastore.persisted; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.Beta; -import com.google.common.base.Preconditions; +import com.google.common.annotations.VisibleForTesting; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; import java.io.DataInput; @@ -21,7 +23,11 @@ import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Map.Entry; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.raft.protobuff.client.messages.Payload; +import org.opendaylight.yangtools.yang.data.api.schema.stream.ReusableStreamReceiver; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; +import org.opendaylight.yangtools.yang.data.impl.schema.ReusableImmutableNormalizedNodeStreamWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Payload persisted when a transaction commits. It contains the transaction identifier and the @@ -31,16 +37,21 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; */ @Beta public final class CommitTransactionPayload extends Payload implements Serializable { + private static final Logger LOG = LoggerFactory.getLogger(CommitTransactionPayload.class); + private static final class Proxy implements Externalizable { private static final long serialVersionUID = 1L; private byte[] serialized; + // checkstyle flags the public modifier as redundant which really doesn't make sense since it clearly isn't + // redundant. It is explicitly needed for Java serialization to be able to create instances via reflection. + @SuppressWarnings("checkstyle:RedundantModifier") public Proxy() { // For Externalizable } Proxy(final byte[] serialized) { - this.serialized = Preconditions.checkNotNull(serialized); + this.serialized = requireNonNull(serialized); } @Override @@ -50,7 +61,7 @@ public final class CommitTransactionPayload extends Payload implements Serializa } @Override - public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException { + public void readExternal(final ObjectInput in) throws IOException { final int length = in.readInt(); serialized = new byte[length]; in.readFully(serialized); @@ -66,21 +77,37 @@ public final class CommitTransactionPayload extends Payload implements Serializa private final byte[] serialized; CommitTransactionPayload(final byte[] serialized) { - this.serialized = Preconditions.checkNotNull(serialized); + this.serialized = requireNonNull(serialized); } public static CommitTransactionPayload create(final TransactionIdentifier transactionId, - final DataTreeCandidate candidate) throws IOException { - final ByteArrayDataOutput out = ByteStreams.newDataOutput(); + final DataTreeCandidate candidate, final int initialSerializedBufferCapacity) throws IOException { + final ByteArrayDataOutput out = ByteStreams.newDataOutput(initialSerializedBufferCapacity); transactionId.writeTo(out); DataTreeCandidateInputOutput.writeDataTreeCandidate(out, candidate); - return new CommitTransactionPayload(out.toByteArray()); + final byte[] serialized = out.toByteArray(); + + LOG.debug("Initial buffer capacity {}, actual serialized size {}", + initialSerializedBufferCapacity, serialized.length); + + return new CommitTransactionPayload(serialized); + } + + @VisibleForTesting + public static CommitTransactionPayload create(final TransactionIdentifier transactionId, + final DataTreeCandidate candidate) throws IOException { + return create(transactionId, candidate, 512); } public Entry getCandidate() throws IOException { + return getCandidate(ReusableImmutableNormalizedNodeStreamWriter.create()); + } + + public Entry getCandidate(final ReusableStreamReceiver receiver) + throws IOException { final DataInput in = ByteStreams.newDataInput(serialized); return new SimpleImmutableEntry<>(TransactionIdentifier.readFrom(in), - DataTreeCandidateInputOutput.readDataTreeCandidate(in)); + DataTreeCandidateInputOutput.readDataTreeCandidate(in, receiver)); } @Override