X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatastore%2FThreePhaseCommitCohortProxy.java;h=09b6568e1ade016accf0ab80788065950d469ec1;hb=30507b196fa240a4176ba12102ac0469280feff9;hp=3a2bcf2336713d2af695065792d62358de4ce9c2;hpb=fe45ad923c8cf83d730cf4d576c310967afabdf3;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java index 3a2bcf2336..09b6568e1a 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/ThreePhaseCommitCohortProxy.java @@ -32,30 +32,15 @@ import scala.runtime.AbstractFunction1; /** * ThreePhaseCommitCohortProxy represents a set of remote cohort proxies */ -public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort { +public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort { private static final Logger LOG = LoggerFactory.getLogger(ThreePhaseCommitCohortProxy.class); - private static final ListenableFuture IMMEDIATE_SUCCESS = - com.google.common.util.concurrent.Futures.immediateFuture(null); - private final ActorContext actorContext; private final List> cohortFutures; private volatile List cohorts; private final String transactionId; - private static final OperationCallback NO_OP_CALLBACK = new OperationCallback() { - @Override - public void run() { - } - - @Override - public void success() { - } - - @Override - public void failure() { - } - }; + private volatile OperationCallback commitOperationCallback; public ThreePhaseCommitCohortProxy(ActorContext actorContext, List> cohortFutures, String transactionId) { @@ -79,7 +64,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort } return null; } - }, TransactionProxy.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); + }, TransactionReadyReplyMapper.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); } @Override @@ -126,6 +111,11 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort return; } + commitOperationCallback = cohortFutures.isEmpty() ? OperationCallback.NO_OP_CALLBACK : + new TransactionRateLimitingCallback(actorContext); + + commitOperationCallback.run(); + final Object message = new CanCommitTransaction(transactionId).toSerializable(); final Iterator iterator = cohorts.iterator(); @@ -138,9 +128,14 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort LOG.debug("Tx {}: a canCommit cohort Future failed: {}", transactionId, failure); } returnFuture.setException(failure); + commitOperationCallback.failure(); return; } + // Only the first call to pause takes effect - subsequent calls before resume are no-ops. So + // this means we'll only time the first transaction canCommit which should be fine. + commitOperationCallback.pause(); + boolean result = true; if (response.getClass().equals(CanCommitTransactionReply.SERIALIZABLE_CLASS)) { CanCommitTransactionReply reply = @@ -190,7 +185,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort public ListenableFuture preCommit() { // We don't need to do anything here - preCommit is done atomically with the commit phase // by the shard. - return IMMEDIATE_SUCCESS; + return IMMEDIATE_VOID_SUCCESS; } @Override @@ -207,8 +202,8 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort @Override public ListenableFuture commit() { - OperationCallback operationCallback = cohortFutures.isEmpty() ? NO_OP_CALLBACK : - new TransactionRateLimitingCallback(actorContext); + OperationCallback operationCallback = commitOperationCallback != null ? commitOperationCallback : + OperationCallback.NO_OP_CALLBACK; return voidOperation("commit", new CommitTransaction(transactionId).toSerializable(), CommitTransactionReply.SERIALIZABLE_CLASS, true, operationCallback); @@ -216,7 +211,8 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort private ListenableFuture voidOperation(final String operationName, final Object message, final Class expectedResponseClass, final boolean propagateException) { - return voidOperation(operationName, message, expectedResponseClass, propagateException, NO_OP_CALLBACK); + return voidOperation(operationName, message, expectedResponseClass, propagateException, + OperationCallback.NO_OP_CALLBACK); } private ListenableFuture voidOperation(final String operationName, final Object message, @@ -265,7 +261,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort LOG.debug("Tx {} finish {}", transactionId, operationName); } - callback.run(); + callback.resume(); Future> combinedFuture = invokeCohorts(message);