X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FTransactionContextWrapper.java;h=3fb129f3817f75b7388a335458e4b67b4c8aca09;hp=b08d4192b48c1ddd7b3cf3162782b68ef129c855;hb=b00bee7547dbba0677347e991a8674f90752f6a2;hpb=d71b6614d6cdb5a98f086edeb56f5c52f365c61c diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionContextWrapper.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionContextWrapper.java index b08d4192b4..3fb129f381 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionContextWrapper.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionContextWrapper.java @@ -14,8 +14,10 @@ import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import javax.annotation.concurrent.GuardedBy; -import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; +import org.opendaylight.controller.cluster.datastore.utils.ActorContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; @@ -37,6 +39,8 @@ class TransactionContextWrapper { @GuardedBy("queuedTxOperations") private final List queuedTxOperations = Lists.newArrayList(); + private final TransactionIdentifier identifier; + /** * The resulting TransactionContext. */ @@ -44,8 +48,12 @@ class TransactionContextWrapper { private final OperationLimiter limiter; - TransactionContextWrapper(final OperationLimiter limiter) { - this.limiter = Preconditions.checkNotNull(limiter); + TransactionContextWrapper(final TransactionIdentifier identifier, final ActorContext actorContext) { + this.identifier = Preconditions.checkNotNull(identifier); + this.limiter = new OperationLimiter(identifier, + // 1 extra permit for the ready operation + actorContext.getDatastoreContext().getShardBatchedModificationCount() + 1, + TimeUnit.MILLISECONDS.toSeconds(actorContext.getDatastoreContext().getOperationTimeoutInMillis())); } TransactionContext getTransactionContext() { @@ -53,7 +61,7 @@ class TransactionContextWrapper { } TransactionIdentifier getIdentifier() { - return limiter.getIdentifier(); + return identifier; } /** @@ -91,7 +99,7 @@ class TransactionContextWrapper { } void executePriorTransactionOperations(final TransactionContext localTransactionContext) { - while(true) { + while (true) { // Access to queuedTxOperations and transactionContext must be protected and atomic // (ie synchronized) with respect to #addTxOperationOnComplete to handle timing // issues and ensure no TransactionOperation is missed and that they are processed @@ -101,12 +109,15 @@ class TransactionContextWrapper { // in case a TransactionOperation results in another transaction operation being // queued (eg a put operation from a client read Future callback that is notified // synchronously). - Collection operationsBatch = null; + final Collection operationsBatch; synchronized (queuedTxOperations) { if (queuedTxOperations.isEmpty()) { // We're done invoking the TransactionOperations so we can now publish the // TransactionContext. - localTransactionContext.operationHandoffComplete(); + localTransactionContext.operationHandOffComplete(); + if (!localTransactionContext.usesOperationLimiting()) { + limiter.releaseAll(); + } transactionContext = localTransactionContext; break; } @@ -133,11 +144,17 @@ class TransactionContextWrapper { final Promise promise = Futures.promise(); enqueueTransactionOperation(new TransactionOperation() { @Override - public void invoke(TransactionContext transactionContext) { - promise.completeWith(transactionContext.readyTransaction()); + public void invoke(TransactionContext newTransactionContext) { + promise.completeWith(newTransactionContext.readyTransaction()); } }); return promise.future(); } + + public OperationLimiter getLimiter() { + return limiter; + } + + }