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=87c8362c7501408b281f5ddc9b78ed7440280fa1;hp=57749a1a736bc935da74222ca984d834083d6206;hpb=559c2b6afa7714572e01b52029acaa4d5a7315e2;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 57749a1a73..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 @@ -40,6 +40,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< private final List> cohortFutures; private volatile List cohorts; private final String transactionId; + private volatile OperationCallback commitOperationCallback; public ThreePhaseCommitCohortProxy(ActorContext actorContext, List> cohortFutures, String transactionId) { @@ -63,7 +64,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< } return null; } - }, TransactionProxy.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); + }, TransactionReadyReplyMapper.SAME_FAILURE_TRANSFORMER, actorContext.getClientDispatcher()); } @Override @@ -110,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(); @@ -122,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 = @@ -191,8 +202,8 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< @Override public ListenableFuture commit() { - OperationCallback operationCallback = cohortFutures.isEmpty() ? OperationCallback.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); @@ -250,7 +261,7 @@ public class ThreePhaseCommitCohortProxy extends AbstractThreePhaseCommitCohort< LOG.debug("Tx {} finish {}", transactionId, operationName); } - callback.run(); + callback.resume(); Future> combinedFuture = invokeCohorts(message);