diff options
author | Jon Bratseth <bratseth@gmail.com> | 2023-02-15 19:31:32 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2023-02-15 19:31:32 +0100 |
commit | 288af4201cdd7e00d6a0f0242c1295b333bd44ab (patch) | |
tree | 64ec820cde183f4f9da13a5119e20dac706a91e9 /controller-server/src/main/java/com/yahoo | |
parent | 4c9206d8119d1131e248419c7e1ba669c396b89b (diff) |
Maintain deploymentInfo
Diffstat (limited to 'controller-server/src/main/java/com/yahoo')
7 files changed, 75 insertions, 7 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index d053106fcee..a4bded314d9 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -93,6 +93,7 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.Set; import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Predicate; @@ -144,6 +145,7 @@ public class ApplicationController { private final ListFlag<String> incompatibleVersions; private final BillingController billingController; private final ListFlag<String> cloudAccountsFlag; + private final Map<DeploymentId, com.yahoo.vespa.hosted.controller.api.integration.configserver.Application> deploymentInfo = new ConcurrentHashMap<>(); ApplicationController(Controller controller, CuratorDb curator, AccessControl accessControl, Clock clock, FlagSource flagSource, BillingController billingController) { @@ -206,6 +208,15 @@ public class ApplicationController { } /** + * Returns in-memory info for the given deployment pulled from the node repo. + * Info on any existing deployment can be missing if it has not yet been fetched since this instance was started. + * This is kept up to date by DeploymentInfoMaintainer. + * Accessing this is thread safe. + */ + // TODO: Replace the wire level Application by a DeploymentInfo class in the model + public Map<DeploymentId, com.yahoo.vespa.hosted.controller.api.integration.configserver.Application> deploymentInfo() { return deploymentInfo; } + + /** * Triggers reindexing for the given document types in the given clusters, for the given application. * <p> * If no clusters are given, reindexing is triggered for the entire application; otherwise diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/BcpGroupUpdater.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/BcpGroupUpdater.java index 1ef94ce527c..dc04a81fe4a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/BcpGroupUpdater.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/BcpGroupUpdater.java @@ -81,7 +81,7 @@ public class BcpGroupUpdater extends ControllerMaintainer { if ( successFactor == 0 ) log.log(Level.WARNING, "Could not update traffic share on any applications", lastException); else if ( successFactor < 0.9 ) - log.log(Level.FINE, "Could not update traffic share on any applications", lastException); + log.log(Level.FINE, "Could not update traffic share on all applications", lastException); return successFactor; } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java index fa44b1480e3..5be20f9a994 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java @@ -30,7 +30,6 @@ public class ChangeManagementAssessor { } Assessment assessmentInner(List<String> impactedHostnames, List<Node> allNodes, ZoneId zone) { - List<String> impactedParentHosts = toParentHosts(impactedHostnames, allNodes); // Group impacted application nodes by parent host Map<Node, List<Node>> prParentHost = allNodes.stream() @@ -53,10 +52,7 @@ public class ChangeManagementAssessor { .map(node -> node.hostname()) .toList(); - boolean allHostsReplacable = tenantHosts.isEmpty() || nodeRepository.isReplaceable( - zone, - tenantHosts - ); + boolean allHostsReplacable = tenantHosts.isEmpty() || nodeRepository.isReplaceable(zone, tenantHosts); // Report assessment pr cluster var clusterAssessments = prCluster.entrySet().stream().map((entry) -> { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java index b64de5d5af4..bcc8296da2a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java @@ -46,6 +46,7 @@ public class ControllerMaintenance extends AbstractComponent { maintainers.add(osUpgradeScheduler); maintainers.addAll(osUpgraders(controller, intervals.osUpgrader)); maintainers.add(new DeploymentExpirer(controller, intervals.defaultInterval)); + maintainers.add(new DeploymentInfoMaintainer(controller, intervals.deploymentInfoMaintainer)); maintainers.add(new DeploymentUpgrader(controller, intervals.defaultInterval)); maintainers.add(new DeploymentIssueReporter(controller, controller.serviceRegistry().deploymentIssues(), intervals.defaultInterval)); maintainers.add(new MetricsReporter(controller, metric, athenzClientFactory.createZmsClient())); @@ -109,6 +110,7 @@ public class ControllerMaintenance extends AbstractComponent { private final SystemName system; private final Duration defaultInterval; + private final Duration deploymentInfoMaintainer; private final Duration outstandingChangeDeployer; private final Duration versionStatusUpdater; private final Duration readyJobsTrigger; @@ -143,6 +145,7 @@ public class ControllerMaintenance extends AbstractComponent { public Intervals(SystemName system) { this.system = Objects.requireNonNull(system); this.defaultInterval = duration(system.isCd() ? 1 : 5, MINUTES); + this.deploymentInfoMaintainer = duration(system.isCd() ? 1 : 10, MINUTES); this.outstandingChangeDeployer = duration(3, MINUTES); this.versionStatusUpdater = duration(3, MINUTES); this.readyJobsTrigger = duration(1, MINUTES); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentInfoMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentInfoMaintainer.java new file mode 100644 index 00000000000..cf9db1517a0 --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentInfoMaintainer.java @@ -0,0 +1,57 @@ +package com.yahoo.vespa.hosted.controller.maintenance; + +import com.yahoo.vespa.hosted.controller.Application; +import com.yahoo.vespa.hosted.controller.Controller; +import com.yahoo.vespa.hosted.controller.Instance; +import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; +import com.yahoo.yolean.Exceptions; + +import java.time.Duration; +import java.util.stream.Stream; + +/** + * This pulls application deployment information from the node repo on all config servers, + * and stores it in memory in controller.applications().deploymentInfo(). + * + * @author bratseth + */ +public class DeploymentInfoMaintainer extends ControllerMaintainer { + + private final NodeRepository nodeRepository; + + public DeploymentInfoMaintainer(Controller controller, Duration duration) { + super(controller, duration); + this.nodeRepository = controller.serviceRegistry().configServer().nodeRepository(); + } + + @Override + protected double maintain() { + controller().applications().asList().stream() + .flatMap(this::mapApplicationToInstances) + .flatMap(this::mapInstanceToDeployments) + .forEach(this::updateDeploymentInfo); + return 1.0; + } + + private Stream<Instance> mapApplicationToInstances(Application application) { + return application.instances().values().stream(); + } + + private Stream<DeploymentId> mapInstanceToDeployments(Instance instance) { + return instance.deployments().keySet().stream() + .filter(zoneId -> !zoneId.environment().isTest()) + .map(zoneId -> new DeploymentId(instance.id(), zoneId)); + } + + private void updateDeploymentInfo(DeploymentId id) { + try { + controller().applications().deploymentInfo().put(id, nodeRepository.getApplication(id.zoneId(), id.applicationId())); + } + catch (ConfigServerException e) { + log.info("Could not retrieve deployment info for " + id + ": " + Exceptions.toMessageString(e)); + } + } + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java index 44081081f73..d47b82a231f 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java @@ -168,6 +168,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { private Stream<Map.Entry<ClusterId, List<Cluster.ScalingEvent>>> mapDeploymentToClusterScalingEvent(DeploymentId deploymentId) { try { + // TODO: get Application from controller.applications().deploymentInfo() return nodeRepository.getApplication(deploymentId.zoneId(), deploymentId.applicationId()) .clusters().entrySet().stream() .map(cluster -> Map.entry(new ClusterId(deploymentId, cluster.getKey()), cluster.getValue().scalingEvents())); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java index 9211580abf1..45b3e4ef5dd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java @@ -38,7 +38,7 @@ import java.util.stream.Stream; * * Maintains status and execution of Vespa CMRs. * - * Currently this retires all affected tenant hosts if zone capacity allows it. + * Currently, this retires all affected tenant hosts if zone capacity allows it. * * @author olaa */ |