summaryrefslogtreecommitdiffstats
path: root/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java43
1 files changed, 28 insertions, 15 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java
index 8b0371e2c1a..99ab6d420cb 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgrader.java
@@ -8,7 +8,9 @@ import com.yahoo.text.Text;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.application.SystemApplication;
+import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
+import com.yahoo.vespa.hosted.controller.versions.VespaVersionTarget;
import java.time.Duration;
import java.util.Optional;
@@ -20,7 +22,7 @@ import java.util.logging.Logger;
*
* @author mpolden
*/
-public class SystemUpgrader extends InfrastructureUpgrader<Version> {
+public class SystemUpgrader extends InfrastructureUpgrader<VespaVersionTarget> {
private static final Logger log = Logger.getLogger(SystemUpgrader.class.getName());
@@ -31,19 +33,19 @@ public class SystemUpgrader extends InfrastructureUpgrader<Version> {
}
@Override
- protected void upgrade(Version target, SystemApplication application, ZoneApi zone) {
+ protected void upgrade(VespaVersionTarget target, SystemApplication application, ZoneApi zone) {
log.info(Text.format("Deploying %s version %s in %s", application.id(), target, zone.getId()));
- controller().applications().deploy(application, zone.getId(), target);
+ controller().applications().deploy(application, zone.getId(), target.version(), target.downgrade());
}
@Override
- protected boolean convergedOn(Version target, SystemApplication application, ZoneApi zone) {
+ protected boolean convergedOn(VespaVersionTarget target, SystemApplication application, ZoneApi zone) {
Optional<Version> minVersion = minVersion(zone, application, Node::currentVersion);
// Skip application convergence check if there are no nodes belonging to the application in the zone
if (minVersion.isEmpty()) return true;
- return minVersion.get().equals(target) &&
- application.configConvergedIn(zone.getId(), controller(), Optional.of(target));
+ return minVersion.get().equals(target.version()) &&
+ application.configConvergedIn(zone.getId(), controller(), Optional.of(target.version()));
}
@Override
@@ -52,30 +54,41 @@ public class SystemUpgrader extends InfrastructureUpgrader<Version> {
}
@Override
- protected Optional<Version> targetVersion() {
- return controller().readVersionStatus().controllerVersion()
- .filter(vespaVersion -> !vespaVersion.isSystemVersion())
- .filter(vespaVersion -> vespaVersion.confidence() != VespaVersion.Confidence.broken)
- .map(VespaVersion::versionNumber);
+ protected Optional<VespaVersionTarget> target() {
+ VersionStatus status = controller().readVersionStatus();
+ Optional<VespaVersion> target = status.controllerVersion()
+ .filter(version -> {
+ Version systemVersion = status.systemVersion()
+ .map(VespaVersion::versionNumber)
+ .orElse(Version.emptyVersion);
+ return version.versionNumber().isAfter(systemVersion);
+ })
+ .filter(version -> version.confidence() != VespaVersion.Confidence.broken);
+ boolean downgrade = target.isPresent() && target.get().confidence() == VespaVersion.Confidence.aborted;
+ if (downgrade) {
+ target = status.systemVersion();
+ }
+ return target.map(VespaVersion::versionNumber)
+ .map(version -> new VespaVersionTarget(version, downgrade));
}
@Override
- protected boolean changeTargetTo(Version target, SystemApplication application, ZoneApi zone) {
+ protected boolean changeTargetTo(VespaVersionTarget target, SystemApplication application, ZoneApi zone) {
if (application.hasApplicationPackage()) {
// For applications with package we do not have a zone-wide version target. This means that we must check
// the wanted version of each node.
boolean zoneHasSharedRouting = controller().zoneRegistry().routingMethods(zone.getId()).stream()
.anyMatch(RoutingMethod::isShared);
return minVersion(zone, application, Node::wantedVersion)
- .map(target::isAfter) // Upgrade if target is after any wanted version
+ .map(wantedVersion -> !wantedVersion.equals(target.version()))
.orElse(zoneHasSharedRouting); // Always upgrade if zone uses shared routing, but has no nodes allocated yet
}
return controller().serviceRegistry().configServer().nodeRepository()
.targetVersionsOf(zone.getId())
.vespaVersion(application.nodeType())
- .map(target::isAfter) // Upgrade if target is after current
- .orElse(true); // Upgrade if target is unset
+ .map(wantedVersion -> !wantedVersion.equals(target.version()))
+ .orElse(true); // Always set target if there are no nodes
}
/** Returns whether node in application should be upgraded by this */