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%2FOperationLimiter.java;h=c035790a94596b77dad9fc0ce83ca338f36c686a;hp=b42230971b2fe276ea5bc8d39f25a3d2f455de83;hb=28e9832cc97a345d5ceb69262784e5c8fef77e37;hpb=c7e1ddeaf842ebb696c8dd38c0ca14c925ee31a1 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OperationLimiter.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OperationLimiter.java index b42230971b..c035790a94 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OperationLimiter.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/OperationLimiter.java @@ -12,7 +12,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; -import org.opendaylight.controller.cluster.datastore.identifiers.TransactionIdentifier; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.datastore.messages.BatchedModificationsReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,14 +26,16 @@ public class OperationLimiter extends OnComplete { private final TransactionIdentifier identifier; private final long acquireTimeout; private final Semaphore semaphore; + private final int maxPermits; - OperationLimiter(final TransactionIdentifier identifier, final int maxPermits, final int acquireTimeoutSeconds) { + OperationLimiter(final TransactionIdentifier identifier, final int maxPermits, final long acquireTimeoutSeconds) { this.identifier = Preconditions.checkNotNull(identifier); Preconditions.checkArgument(acquireTimeoutSeconds >= 0); this.acquireTimeout = TimeUnit.SECONDS.toNanos(acquireTimeoutSeconds); Preconditions.checkArgument(maxPermits >= 0); + this.maxPermits = maxPermits; this.semaphore = new Semaphore(maxPermits); } @@ -41,7 +43,7 @@ public class OperationLimiter extends OnComplete { acquire(1); } - private void acquire(final int acquirePermits) { + void acquire(final int acquirePermits) { try { if (!semaphore.tryAcquire(acquirePermits, acquireTimeout, TimeUnit.NANOSECONDS)) { LOG.warn("Failed to acquire operation permit for transaction {}", identifier); @@ -55,10 +57,6 @@ public class OperationLimiter extends OnComplete { } } - void release() { - this.semaphore.release(); - } - @Override public void onComplete(final Throwable throwable, final Object message) { if (message instanceof BatchedModificationsReply) { @@ -73,7 +71,14 @@ public class OperationLimiter extends OnComplete { } @VisibleForTesting - Semaphore getSemaphore() { - return semaphore; + int availablePermits() { + return semaphore.availablePermits(); + } + + /** + * Release all the permits. + */ + public void releaseAll() { + this.semaphore.release(maxPermits - availablePermits()); } }