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);