diff options
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.java | 43 |
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 */ |