2 * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.datastore;
10 import static java.util.Objects.requireNonNull;
12 import akka.actor.ActorSelection;
13 import java.util.Optional;
14 import java.util.SortedSet;
15 import java.util.concurrent.TimeUnit;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
19 import org.opendaylight.controller.cluster.datastore.utils.ActorUtils;
20 import scala.concurrent.Future;
23 * A helper class that wraps an eventual TransactionContext instance. We have two specializations:
25 * <li>{@link DelayedTransactionContextWrapper}, which enqueues operations towards the backend</li>
26 * <li>{@link DirectTransactionContextWrapper}, which sends operations to the backend</li>
29 abstract class AbstractTransactionContextWrapper {
30 private final TransactionIdentifier identifier;
31 private final OperationLimiter limiter;
32 private final String shardName;
34 AbstractTransactionContextWrapper(@NonNull final TransactionIdentifier identifier,
35 @NonNull final ActorUtils actorUtils, @NonNull final String shardName) {
36 this.identifier = requireNonNull(identifier);
37 this.shardName = requireNonNull(shardName);
38 limiter = new OperationLimiter(identifier,
39 // 1 extra permit for the ready operation
40 actorUtils.getDatastoreContext().getShardBatchedModificationCount() + 1,
41 TimeUnit.MILLISECONDS.toSeconds(actorUtils.getDatastoreContext().getOperationTimeoutInMillis()));
44 final TransactionIdentifier getIdentifier() {
48 final OperationLimiter getLimiter() {
52 final String getShardName() {
56 abstract @Nullable TransactionContext getTransactionContext();
59 * Either enqueue or execute specified operation.
61 * @param op Operation to (eventually) execute
63 abstract void maybeExecuteTransactionOperation(TransactionOperation op);
66 * Mark the transaction as ready.
68 * @param participatingShardNames Shards which participate on the transaction
69 * @return Future indicating the transaction has been readied on the backend
71 abstract @NonNull Future<ActorSelection> readyTransaction(Optional<SortedSet<String>> participatingShardNames);