summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2022-03-14 20:00:30 +0100
committerJon Marius Venstad <venstad@gmail.com>2022-03-14 20:00:30 +0100
commit25d2642c9e04ab7e3d17d9f536b55dfd66ca08c3 (patch)
tree706b562cd4a1190d78615d50294c1829a9edaa6a /controller-server
parent72e6cb8d0ad1cafa093c77aab8e35c1d3495d2b9 (diff)
Avoid incompatible upgrades
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java12
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java8
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());