1. DatabaseManager activate will attempt to listTables to ensure store is in good shape.
2. lock and tryLock can now throw InterruptedExceptions.
Change-Id: Ifa766ad441f677a4071b68d8f6caa564cf320869
Change-Id: I318ff762a96b261737831f6bd7c200b384c638e9
Change-Id: I0f509703520b3187931fa3669cd8213a91e85c96
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 4998179..f84baaf 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
@@ -12,6 +12,7 @@
import org.joda.time.DateTime;
import org.onlab.onos.cluster.ClusterService;
+import org.onlab.onos.store.service.DatabaseException;
import org.onlab.onos.store.service.DatabaseService;
import org.onlab.onos.store.service.Lock;
import org.slf4j.Logger;
@@ -23,8 +24,6 @@
private final Logger log = getLogger(getClass());
- private static final long MAX_WAIT_TIME_MS = 100000000L;
-
private final DistributedLockManager lockManager;
private final DatabaseService databaseService;
private final String path;
@@ -53,13 +52,17 @@
}
@Override
- public void lock(int leaseDurationMillis) {
+ public void lock(int leaseDurationMillis) throws InterruptedException {
if (isLocked() && lockExpirationTime.isAfter(DateTime.now().plusMillis(leaseDurationMillis))) {
- // Nothing to do.
- // Current expiration time is beyond what is requested.
return;
} else {
- tryLock(MAX_WAIT_TIME_MS, leaseDurationMillis);
+ CompletableFuture<DateTime> future =
+ lockManager.lockIfAvailable(this, leaseDurationMillis);
+ try {
+ lockExpirationTime = future.get();
+ } catch (ExecutionException e) {
+ throw new DatabaseException(e);
+ }
}
}
@@ -79,22 +82,17 @@
@Override
public boolean tryLock(
long waitTimeMillis,
- int leaseDurationMillis) {
+ int leaseDurationMillis) throws InterruptedException {
if (tryLock(leaseDurationMillis)) {
return true;
}
-
CompletableFuture<DateTime> future =
lockManager.lockIfAvailable(this, waitTimeMillis, leaseDurationMillis);
try {
lockExpirationTime = future.get(waitTimeMillis, TimeUnit.MILLISECONDS);
return true;
- } catch (ExecutionException | InterruptedException e) {
- log.error("Encountered an exception trying to acquire lock for " + path, e);
- // TODO: ExecutionException could indicate something
- // wrong with the backing database.
- // Throw an exception?
- return false;
+ } catch (ExecutionException e) {
+ throw new DatabaseException(e);
} catch (TimeoutException e) {
log.debug("Timed out waiting to acquire lock for {}", path);
return false;