diff options
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java | 25 |
1 files changed, 22 insertions, 3 deletions
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 3441a4822ad..7a3267604fb 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 @@ -11,6 +11,7 @@ import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; import com.yahoo.path.Path; +import com.yahoo.transaction.Mutex; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; import com.yahoo.vespa.curator.Curator; @@ -390,15 +391,33 @@ public class CuratorDatabaseClient { * transaction. The config server then commits (writes) the transaction which may include operations that modify * data in paths owned by this class. */ - public Lock lock(ApplicationId application, Duration timeout) { + // TODO(mpolden): Simplify once we are down to one application lock + public Mutex lock(ApplicationId application, Duration timeout) { + Mutex legacyLock; + Mutex lock; + // Take the application lock (same as config server). This is likely held at this point, but is re-entrant. try { - return db.lock(lockPath(application), timeout); + lock = db.lock(lockPath(application), timeout); } catch (UncheckedTimeoutException e) { throw new ApplicationLockException(e); } + // Take the legacy node-repository lock + try { + legacyLock = db.lock(legacyLockPath(application), timeout); + } catch (UncheckedTimeoutException e) { + lock.close(); + throw new ApplicationLockException(e); + } + return () -> { + try { + legacyLock.close(); + } finally { + lock.close(); + } + }; } - public Lock lock(ApplicationId application) { + public Mutex lock(ApplicationId application) { return lock(application, defaultLockTimeout); } |