diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-03-03 12:22:41 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-03-03 12:29:42 +0100 |
commit | 81780979c0017b6de3f2b5652640ab002f1cc6a5 (patch) | |
tree | 86844298de6845c4d6f3041fb4ed5aa73cf58894 /controller-server | |
parent | be75fa67a640d2c3a71536dca1253637d8dce708 (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.java | 13 |
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()); |