aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-10-06 15:05:20 +0200
committerMartin Polden <mpolden@mpolden.no>2020-10-06 15:23:41 +0200
commit3aedbdfc275fd16081c78b1fee0b95ff8fd0990b (patch)
treef7f64547329637dc9572cd08470f8e2cd6fff231 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
parent32583c92499e91586a39f5744cc65b72bdea0702 (diff)
Stop taking config lock exclusively in node-repository
We believe we've identified how locking should behave, at least in the short-term: 1) Migrate existing use of `/config/v2/locks/<application-id>` inside node-repository to only use `/provision/v1/locks/<application-id>`. This ensures that prepare only acquires `/provision/v1/locks/<application-id>` on the node-repository side. Locks and node repo writes always happen together, i.e. we're not building a list of transaction that are committed at some later point. 2) Ensure that transactional operations such as `active` and `deactivate` holds both `/config/v2/locks/<application-id>` and `/provision/v1/locks/<application-id>` until the transaction is committed.
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java11
1 files changed, 7 insertions, 4 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
index 90cf3ba8f54..55d17f3e080 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java
@@ -124,10 +124,13 @@ public class LoadBalancerExpirer extends NodeRepositoryMaintainer {
private void withLoadBalancersIn(LoadBalancer.State state, Consumer<LoadBalancer> operation) {
for (var id : db.readLoadBalancerIds()) {
try (var lock = db.lock(id.application())) {
- var loadBalancer = db.readLoadBalancer(id);
- if (loadBalancer.isEmpty()) continue; // Load balancer was removed during loop
- if (loadBalancer.get().state() != state) continue; // Wrong state
- operation.accept(loadBalancer.get());
+ // TODO(mpolden): Remove inner lock
+ try (var innerLock = db.configLock(id.application())) {
+ var loadBalancer = db.readLoadBalancer(id);
+ if (loadBalancer.isEmpty()) continue; // Load balancer was removed during loop
+ if (loadBalancer.get().state() != state) continue; // Wrong state
+ operation.accept(loadBalancer.get());
+ }
}
}
}