summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-10-05 12:47:25 +0200
committerMartin Polden <mpolden@mpolden.no>2020-10-05 12:47:25 +0200
commit58c30ceab2b3722213c34fef094467bdf872a448 (patch)
treedec7bae38f2371ce48b763ecc1ee5c30ca783af8 /node-repository
parent95b9da2a7b4b5b18fa2d41cfffb6de5067605024 (diff)
Take both application locks during transition
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java25
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClientTest.java17
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
- }
-
}
}