Specialize TransactionContextWrapper
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / AbstractTransactionContextWrapper.java
1 /*
2  * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.cluster.datastore;
9
10 import static java.util.Objects.requireNonNull;
11
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;
21
22 /**
23  * A helper class that wraps an eventual TransactionContext instance. We have two specializations:
24  * <ul>
25  *   <li>{@link DelayedTransactionContextWrapper}, which enqueues operations towards the backend</li>
26  *   <li>{@link DirectTransactionContextWrapper}, which sends operations to the backend</li>
27  * </ul>
28  */
29 abstract class AbstractTransactionContextWrapper {
30     private final TransactionIdentifier identifier;
31     private final OperationLimiter limiter;
32     private final String shardName;
33
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()));
42     }
43
44     final TransactionIdentifier getIdentifier() {
45         return identifier;
46     }
47
48     final OperationLimiter getLimiter() {
49         return limiter;
50     }
51
52     final String getShardName() {
53         return shardName;
54     }
55
56     abstract @Nullable TransactionContext getTransactionContext();
57
58     /**
59      * Either enqueue or execute specified operation.
60      *
61      * @param op Operation to (eventually) execute
62      */
63     abstract void maybeExecuteTransactionOperation(TransactionOperation op);
64
65     /**
66      * Mark the transaction as ready.
67      *
68      * @param participatingShardNames Shards which participate on the transaction
69      * @return Future indicating the transaction has been readied on the backend
70      */
71     abstract @NonNull Future<ActorSelection> readyTransaction(Optional<SortedSet<String>> participatingShardNames);
72 }