diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2022-03-14 20:00:30 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2022-03-14 20:00:30 +0100 |
commit | 25d2642c9e04ab7e3d17d9f536b55dfd66ca08c3 (patch) | |
tree | 706b562cd4a1190d78615d50294c1829a9edaa6a /controller-server | |
parent | 72e6cb8d0ad1cafa093c77aab8e35c1d3495d2b9 (diff) |
Avoid incompatible upgrades
Diffstat (limited to 'controller-server')
2 files changed, 18 insertions, 2 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java index 0b4c3e9dff8..ce3cae08d36 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.application; import com.yahoo.collections.AbstractFilteringList; import com.yahoo.component.Version; +import com.yahoo.component.VersionCompatibility; import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.InstanceName; @@ -34,6 +35,17 @@ public class InstanceList extends AbstractFilteringList<ApplicationId, InstanceL } /** + * Returns the subset of instances where all production deployments are compatible with the given version. + * + * @param platform the version which applications returned are compatible with + */ + public InstanceList compatibleWithPlatform(Version platform, VersionCompatibility compatibility) { + return matching(id -> instance(id).productionDeployments().values().stream() + .flatMap(deployment -> deployment.applicationVersion().compileVersion().stream()) + .noneMatch(version -> compatibility.refuse(platform, version))); + } + + /** * Returns the subset of instances that aren't pinned to an earlier major version than the given one. * * @param targetMajorVersion the target major version which applications returned allows upgrading to diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java index faa7cdce53d..f723d8b5134 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.component.Version; +import com.yahoo.component.VersionCompatibility; import com.yahoo.config.application.api.DeploymentSpec.UpgradePolicy; import com.yahoo.config.provision.ApplicationId; import com.yahoo.vespa.curator.Lock; @@ -91,10 +92,11 @@ public class Upgrader extends ControllerMaintainer { : i -> i.failing() .not().upgradingTo(targetAndNewer); + VersionCompatibility compatibility = controller().applications().versionCompatibility(); Map<ApplicationId, Version> targets = new LinkedHashMap<>(); for (Version version : controller().applications().deploymentTrigger().targetsForPolicy(versionStatus, policy)) { targetAndNewer.add(version); - InstanceList eligible = eligibleForVersion(remaining, version, targetMajorVersion); + InstanceList eligible = eligibleForVersion(remaining, version, targetMajorVersion, compatibility); InstanceList outdated = cancellationCriterion.apply(eligible); cancelUpgradesOf(outdated.upgrading(), "Upgrading to outdated versions"); @@ -111,10 +113,12 @@ public class Upgrader extends ControllerMaintainer { } } - private InstanceList eligibleForVersion(InstanceList instances, Version version, Optional<Integer> targetMajorVersion) { + private InstanceList eligibleForVersion(InstanceList instances, Version version, + Optional<Integer> targetMajorVersion, VersionCompatibility compatibility) { Change change = Change.of(version); return instances.not().failingOn(version) .allowingMajorVersion(version.getMajor(), targetMajorVersion.orElse(version.getMajor())) + .compatibleWithPlatform(version, compatibility) .not().hasCompleted(change) // Avoid rescheduling change for instances without production steps. .onLowerVersionThan(version) .canUpgradeAt(version, controller().clock().instant()); |