diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-10-06 15:05:20 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-10-06 15:23:41 +0200 |
commit | 3aedbdfc275fd16081c78b1fee0b95ff8fd0990b (patch) | |
tree | f7f64547329637dc9572cd08470f8e2cd6fff231 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirer.java | |
parent | 32583c92499e91586a39f5744cc65b72bdea0702 (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.java | 11 |
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()); + } } } } |