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%2FTransactionRateLimitingCallback.java;h=f35e30a06ccb1c8a95b4ff843ac22abedc21d168;hp=678891446ab9b3da8c87315497bb1f044b681897;hb=b00bee7547dbba0677347e991a8674f90752f6a2;hpb=3b0499cd187bcdeda057465350d381c8bc28847c diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionRateLimitingCallback.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionRateLimitingCallback.java index 678891446a..f35e30a06c 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionRateLimitingCallback.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/TransactionRateLimitingCallback.java @@ -9,30 +9,62 @@ package org.opendaylight.controller.cluster.datastore; import com.codahale.metrics.Timer; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import com.google.common.base.Ticker; +import java.util.concurrent.TimeUnit; import org.opendaylight.controller.cluster.datastore.utils.ActorContext; /** * TransactionRateLimitingCallback computes the new transaction rate limit on the successful completion of a - * transaction + * transaction. */ -public class TransactionRateLimitingCallback implements OperationCallback{ +public class TransactionRateLimitingCallback implements OperationCallback { + private static Ticker TICKER = Ticker.systemTicker(); + + private enum State { + STOPPED, + RUNNING, + PAUSED + } + private final Timer commitTimer; - private Timer.Context timerContext; + private long startTime; + private long elapsedTime; + private volatile State state = State.STOPPED; - TransactionRateLimitingCallback(ActorContext actorContext){ + TransactionRateLimitingCallback(ActorContext actorContext) { commitTimer = actorContext.getOperationTimer(ActorContext.COMMIT); } @Override public void run() { - timerContext = commitTimer.time(); + Preconditions.checkState(state == State.STOPPED, "state is not STOPPED"); + resume(); + } + + @Override + public void pause() { + if (state == State.RUNNING) { + elapsedTime += TICKER.read() - startTime; + state = State.PAUSED; + } + } + + @Override + public void resume() { + if (state != State.RUNNING) { + startTime = TICKER.read(); + state = State.RUNNING; + } } @Override public void success() { - Preconditions.checkState(timerContext != null, "Call run before success"); - timerContext.stop(); + Preconditions.checkState(state != State.STOPPED, "state is STOPPED"); + pause(); + commitTimer.update(elapsedTime, TimeUnit.NANOSECONDS); + state = State.STOPPED; } @Override @@ -42,4 +74,8 @@ public class TransactionRateLimitingCallback implements OperationCallback{ // not going to be useful - so we leave it as it is } -} \ No newline at end of file + @VisibleForTesting + static void setTicker(Ticker ticker) { + TICKER = ticker; + } +}