X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2Fpersisted%2FCommitTransactionPayload.java;h=4d38c35d48edbc47be194b32ff4793acc8604c7d;hb=a2b838f96589b502578fa4e15cef2769f886a378;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..4d38c35d48 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 @@ -8,6 +8,7 @@ package org.opendaylight.controller.cluster.datastore.persisted; import com.google.common.annotations.Beta; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; @@ -22,6 +23,9 @@ 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.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,10 +35,15 @@ 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 } @@ -50,7 +59,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); @@ -70,17 +79,33 @@ public final class CommitTransactionPayload extends Payload implements Serializa } 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 ReusableImmutableNormalizedNodeStreamWriter writer) throws IOException { final DataInput in = ByteStreams.newDataInput(serialized); return new SimpleImmutableEntry<>(TransactionIdentifier.readFrom(in), - DataTreeCandidateInputOutput.readDataTreeCandidate(in)); + DataTreeCandidateInputOutput.readDataTreeCandidate(in, writer)); } @Override