1. Adds a lockAsync method to LockService for async lock acquisition.
2. Fixes a bug where lock() wasn't attempting a tryLock before registering for lock avalilability.
(Note 1 above is needed for LeadershipService which will come later)
Change-Id: I1deaa445f7cdf86416b335df1d7358e17eff19c3
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DistributedLock.java b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DistributedLock.java
index f84baaf..7575ed9 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DistributedLock.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/service/impl/DistributedLock.java
@@ -6,6 +6,7 @@
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -53,20 +54,22 @@
@Override
public void lock(int leaseDurationMillis) throws InterruptedException {
- if (isLocked() && lockExpirationTime.isAfter(DateTime.now().plusMillis(leaseDurationMillis))) {
- return;
- } else {
- CompletableFuture<DateTime> future =
- lockManager.lockIfAvailable(this, leaseDurationMillis);
- try {
- lockExpirationTime = future.get();
- } catch (ExecutionException e) {
- throw new DatabaseException(e);
- }
+ try {
+ lockAsync(leaseDurationMillis).get();
+ } catch (ExecutionException e) {
+ throw new DatabaseException(e);
}
}
@Override
+ public Future<Void> lockAsync(int leaseDurationMillis) {
+ if (isLocked() || tryLock(leaseDurationMillis)) {
+ return CompletableFuture.<Void>completedFuture(null);
+ }
+ return lockManager.lockIfAvailable(this, leaseDurationMillis);
+ }
+
+ @Override
public boolean tryLock(int leaseDurationMillis) {
if (databaseService.putIfAbsent(
DistributedLockManager.ONOS_LOCK_TABLE_NAME,
@@ -81,15 +84,16 @@
@Override
public boolean tryLock(
- long waitTimeMillis,
+ int waitTimeMillis,
int leaseDurationMillis) throws InterruptedException {
- if (tryLock(leaseDurationMillis)) {
+ if (isLocked() || tryLock(leaseDurationMillis)) {
return true;
}
- CompletableFuture<DateTime> future =
+
+ CompletableFuture<Void> future =
lockManager.lockIfAvailable(this, waitTimeMillis, leaseDurationMillis);
try {
- lockExpirationTime = future.get(waitTimeMillis, TimeUnit.MILLISECONDS);
+ future.get(waitTimeMillis, TimeUnit.MILLISECONDS);
return true;
} catch (ExecutionException e) {
throw new DatabaseException(e);