aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-03-03 12:22:41 +0100
committerMartin Polden <mpolden@mpolden.no>2020-03-03 12:29:42 +0100
commit81780979c0017b6de3f2b5652640ab002f1cc6a5 (patch)
tree86844298de6845c4d6f3041fb4ed5aa73cf58894 /controller-server
parentbe75fa67a640d2c3a71536dca1253637d8dce708 (diff)
Write rotation regions to ZK
The existing approach is incorrect as the current deployment spec is not guaranteed to be in sync with the assigned rotation. E.g. if an empty deployment spec is submitted, an instance may still have a rotation assigned, but the regions of that rotation disappear because they are deduced from deployment spec which is now empty. This change writes the rotation regions explicitly. Will start reading the field in a future PR, after this is released. This is necessary because to be able to generate global endpoints in systems where zones can support a mix of `shared`, `exclusive` and `sharedLayer4` the system must always know about the region targets of a rotation, even when removing an application and/or instance.
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java13
1 files changed, 9 insertions, 4 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
index 7f215b70e85..a15bfd07a66 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java
@@ -92,6 +92,7 @@ public class ApplicationSerializer {
private static final String pemDeployKeysField = "pemDeployKeys";
private static final String assignedRotationClusterField = "clusterId";
private static final String assignedRotationRotationField = "rotationId";
+ private static final String assignedRotationRegionsField = "regions";
private static final String versionField = "version";
// Instance fields
@@ -190,7 +191,7 @@ public class ApplicationSerializer {
instanceObject.setString(instanceNameField, instance.name().value());
deploymentsToSlime(instance.deployments().values(), instanceObject.setArray(deploymentsField));
toSlime(instance.jobPauses(), instanceObject.setObject(deploymentJobsField));
- assignedRotationsToSlime(instance.rotations(), instanceObject, assignedRotationsField);
+ assignedRotationsToSlime(instance.rotations(), instanceObject);
toSlime(instance.rotationStatus(), instanceObject.setArray(rotationStatusField));
toSlime(instance.change(), instanceObject, deployingField);
}
@@ -309,13 +310,17 @@ public class ApplicationSerializer {
});
}
- private void assignedRotationsToSlime(List<AssignedRotation> rotations, Cursor parent, String fieldName) {
- var rotationsArray = parent.setArray(fieldName);
+ private void assignedRotationsToSlime(List<AssignedRotation> rotations, Cursor parent) {
+ var rotationsArray = parent.setArray(assignedRotationsField);
for (var rotation : rotations) {
var object = rotationsArray.addObject();
object.setString(assignedRotationEndpointField, rotation.endpointId().id());
object.setString(assignedRotationRotationField, rotation.rotationId().asString());
object.setString(assignedRotationClusterField, rotation.clusterId().value());
+ var regionsArray = object.setArray(assignedRotationRegionsField);
+ for (var region : rotation.regions()) {
+ regionsArray.addString(region.value());
+ }
}
}
@@ -496,11 +501,11 @@ public class ApplicationSerializer {
private List<AssignedRotation> assignedRotationsFromSlime(DeploymentSpec deploymentSpec, InstanceName instance, Inspector root) {
var assignedRotations = new LinkedHashMap<EndpointId, AssignedRotation>();
-
root.field(assignedRotationsField).traverse((ArrayTraverser) (idx, inspector) -> {
var clusterId = new ClusterSpec.Id(inspector.field(assignedRotationClusterField).asString());
var endpointId = EndpointId.of(inspector.field(assignedRotationEndpointField).asString());
var rotationId = new RotationId(inspector.field(assignedRotationRotationField).asString());
+ // TODO(mpolden): Read regions from field instead of deployment spec after next release
var regions = deploymentSpec.instance(instance)
.map(spec -> globalEndpointRegions(spec, endpointId))
.orElse(Set.of());