diff options
author | Harald Musum <musum@yahoo-inc.com> | 2017-02-17 13:01:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-17 13:01:17 +0100 |
commit | 49dfc8303ad27f9a513051d76644c1b1042d171d (patch) | |
tree | fb868cf43a95f3a08d509f65033c5695b5449f91 /node-repository | |
parent | 5ea55a54ecea21b1c0f7f832606f091e089753f9 (diff) | |
parent | 97d7847c45a845c57845dc9b371e2c2c31670da6 (diff) |
Merge pull request #1795 from yahoo/hmusum/add-error-code-for-application-lock-failure
Use specific error-code in response when unable to acquire applicatio…
Diffstat (limited to 'node-repository')
3 files changed, 15 insertions, 8 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java index b2ffe05b2d4..65dd8a67898 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabase.java @@ -62,7 +62,6 @@ public class CuratorDatabase { CuratorMutex lock = locks.computeIfAbsent(path, (pathArg) -> new CuratorMutex(pathArg.getAbsolute(), curator.framework())); lock.acquire(timeout); return lock; - } // --------- Write operations ------------------------------------------------------------------------------ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java index dc6bda01619..54292247115 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java @@ -3,7 +3,9 @@ package com.yahoo.vespa.hosted.provision.persistence; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.joda.JodaModule; +import com.google.common.util.concurrent.UncheckedTimeoutException; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.ApplicationLockException; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.Zone; @@ -269,12 +271,17 @@ public class CuratorDatabaseClient { /** Acquires the single cluster-global, reentrant lock for active nodes of this application */ public CuratorMutex lock(ApplicationId application) { - return lock(lockPath(application), defaultLockTimeout); + return lock(application, defaultLockTimeout); } /** Acquires the single cluster-global, reentrant lock with the specified timeout for active nodes of this application */ public CuratorMutex lock(ApplicationId application, Duration timeout) { - return lock(lockPath(application), timeout); + try { + return lock(lockPath(application), timeout); + } + catch (UncheckedTimeoutException e) { + throw new ApplicationLockException(e); + } } private CuratorMutex lock(Path path, Duration timeout) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorMutex.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorMutex.java index 62be5c649db..442dface372 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorMutex.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorMutex.java @@ -1,13 +1,13 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.persistence; +import com.google.common.util.concurrent.UncheckedTimeoutException; import com.yahoo.transaction.Mutex; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.locks.InterProcessMutex; import java.time.Duration; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; /** * A cluster-wide reentrant mutex which is released on (the last symmetric) close @@ -26,15 +26,16 @@ public class CuratorMutex implements Mutex { /** Take the lock with the given timeout. This may be called multiple times from the same thread - each matched by a close */ public void acquire(Duration timeout) { + boolean acquired; try { - boolean acquired = mutex.acquire(timeout.toMillis(), TimeUnit.MILLISECONDS); - if ( ! acquired) { - throw new TimeoutException("Timed out after waiting " + timeout.toString()); - } + acquired = mutex.acquire(timeout.toMillis(), TimeUnit.MILLISECONDS); } catch (Exception e) { throw new RuntimeException("Exception acquiring lock '" + lockPath + "'", e); } + + if (! acquired) throw new UncheckedTimeoutException("Timed out after waiting " + timeout.toString() + + " to acquire lock + '" + lockPath + "'"); } @Override |