+public abstract sealed class CommitTransactionPayload extends IdentifiablePayload<TransactionIdentifier>
+ implements Serializable {
+ @NonNullByDefault
+ public record CandidateTransaction(
+ TransactionIdentifier transactionId,
+ DataTreeCandidate candidate,
+ NormalizedNodeStreamVersion streamVersion) {
+ public CandidateTransaction {
+ requireNonNull(transactionId);
+ requireNonNull(candidate);
+ requireNonNull(streamVersion);
+ }
+ }
+
+ private static final Logger LOG = LoggerFactory.getLogger(CommitTransactionPayload.class);
+ private static final long serialVersionUID = 1L;
+
+ static final int MAX_ARRAY_SIZE = ceilingPowerOfTwo(Integer.getInteger(
+ "org.opendaylight.controller.cluster.datastore.persisted.max-array-size", 256 * 1024));
+
+ private volatile CandidateTransaction candidate = null;
+
+ private CommitTransactionPayload() {
+ // hidden on purpose
+ }
+
+ public static @NonNull CommitTransactionPayload create(final TransactionIdentifier transactionId,
+ final DataTreeCandidate candidate, final PayloadVersion version, final int initialSerializedBufferCapacity)
+ throws IOException {
+ final var cos = new ChunkedOutputStream(initialSerializedBufferCapacity, MAX_ARRAY_SIZE);
+ try (var dos = new DataOutputStream(cos)) {
+ transactionId.writeTo(dos);
+ DataTreeCandidateInputOutput.writeDataTreeCandidate(dos, version, candidate);
+ }
+
+ final var source = cos.toVariant();
+ LOG.debug("Initial buffer capacity {}, actual serialized size {}", initialSerializedBufferCapacity, cos.size());
+ return source.isFirst() ? new Simple(source.getFirst()) : new Chunked(source.getSecond());
+ }
+
+ @VisibleForTesting
+ public static @NonNull CommitTransactionPayload create(final TransactionIdentifier transactionId,
+ final DataTreeCandidate candidate, final PayloadVersion version) throws IOException {
+ return create(transactionId, candidate, version, 512);
+ }