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=aeb4062103d1c0fc77c29f0c733447728a60194f;hpb=994dbb10de67c0d9fd5f78a216ea372326609a49;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 aeb4062103..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 @@ -11,7 +11,6 @@ package org.opendaylight.controller.cluster.datastore; import akka.actor.ActorSelection; import akka.dispatch.Futures; import akka.dispatch.OnComplete; -import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; @@ -25,7 +24,6 @@ import org.opendaylight.controller.cluster.datastore.messages.CanCommitTransacti import org.opendaylight.controller.cluster.datastore.messages.CommitTransaction; import org.opendaylight.controller.cluster.datastore.messages.CommitTransactionReply; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; -import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; @@ -34,30 +32,15 @@ import scala.runtime.AbstractFunction1; /** * ThreePhaseCommitCohortProxy represents a set of remote cohort proxies */ -public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCohort{ +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) { @@ -81,7 +64,7 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho } return null; } - }, TransactionProxy.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); + }, TransactionReadyReplyMapper.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); } @Override @@ -128,6 +111,11 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho 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(); @@ -140,9 +128,14 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho 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 = @@ -192,7 +185,7 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho 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 @@ -209,8 +202,8 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho @Override public ListenableFuture commit() { - OperationCallback operationCallback = (cohortFutures.size() == 0) ? 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); @@ -218,7 +211,8 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho 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, @@ -267,7 +261,7 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho LOG.debug("Tx {} finish {}", transactionId, operationName); } - callback.run(); + callback.resume(); Future> combinedFuture = invokeCohorts(message); @@ -322,7 +316,7 @@ public class ThreePhaseCommitCohortProxy implements DOMStoreThreePhaseCommitCoho }, actorContext.getClientDispatcher()); } - @VisibleForTesting + @Override List> getCohortFutures() { return Collections.unmodifiableList(cohortFutures); }