diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-10-05 12:47:25 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-10-05 12:47:25 +0200 |
commit | 58c30ceab2b3722213c34fef094467bdf872a448 (patch) | |
tree | dec7bae38f2371ce48b763ecc1ee5c30ca783af8 /node-repository | |
parent | 95b9da2a7b4b5b18fa2d41cfffb6de5067605024 (diff) |
Take both application locks during transition
Diffstat (limited to 'node-repository')
2 files changed, 26 insertions, 16 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); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClientTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClientTest.java index 36625f3559e..b60364d903e 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClientTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClientTest.java @@ -8,7 +8,6 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.curator.Curator; -import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; @@ -41,22 +40,14 @@ public class CuratorDatabaseClientTest { @Test public void locks_can_be_acquired_and_released() { ApplicationId app = ApplicationId.from(TenantName.from("testTenant"), ApplicationName.from("testApp"), InstanceName.from("testInstance")); - - try (Lock mutex1 = zkClient.lock(app)) { - mutex1.toString(); // reference to avoid warning + try (var ignored = zkClient.lock(app)) { throw new RuntimeException(); + } catch (RuntimeException expected) { } - catch (RuntimeException expected) { + try (var ignored = zkClient.lock(app)) { } - - try (Lock mutex2 = zkClient.lock(app)) { - mutex2.toString(); // reference to avoid warning + try (var ignored = zkClient.lock(app)) { } - - try (Lock mutex3 = zkClient.lock(app)) { - mutex3.toString(); // reference to avoid warning - } - } } |