summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2022-02-23 13:15:53 +0100
committerGitHub <noreply@github.com>2022-02-23 13:15:53 +0100
commitb2da3c9302a3d18975805dcb018fe20feb01ea78 (patch)
tree382737ec1e20babdf5bd65402be4b32c82016723 /controller-server
parent13e5f28849839fc674dbd4b37683e5d7bbff5c57 (diff)
parent5d5788be39bae9c34a703c418201aa913d87f8db (diff)
Merge pull request #21336 from vespa-engine/jonmv/long-deployment-pipelines-2
Jonmv/long deployment pipelines 2
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/InstanceList.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java33
5 files changed, 44 insertions, 6 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 9ef7cbcebf6..91e80eb8a30 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
@@ -72,7 +72,7 @@ public class InstanceList extends AbstractFilteringList<ApplicationId, InstanceL
/** Returns the subset of instances that has completed deployment of given change */
public InstanceList hasCompleted(Change change) {
- return matching(id -> instances.get(id).jobsToRun(Map.of(id.instance(), change)).isEmpty());
+ return matching(id -> instances.get(id).hasCompleted(id.instance(), change));
}
/** Returns the subset of instances which are currently deploying a change */
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
index fb4584d4672..0f9be643cdf 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
@@ -216,7 +216,12 @@ public class DeploymentStatus {
}
/** The set of jobs that need to run for the given changes to be considered complete. */
- public Map<JobId, List<Job>> jobsToRun(Map<InstanceName, Change> changes) {
+ public boolean hasCompleted(InstanceName instance, Change change) {
+ return jobsToRun(Map.of(instance, change), false).isEmpty();
+ }
+
+ /** The set of jobs that need to run for the given changes to be considered complete. */
+ private Map<JobId, List<Job>> jobsToRun(Map<InstanceName, Change> changes) {
return jobsToRun(changes, false);
}
@@ -263,7 +268,7 @@ public class DeploymentStatus {
.noneMatch(deployment -> deployment.applicationVersion().compareTo(version) > 0))
.map(Change::of)
.filter(change -> application.require(instance).change().application().map(change::upgrades).orElse(true))
- .filter(change -> ! jobsToRun(Map.of(instance, change)).isEmpty())
+ .filter(change -> ! hasCompleted(instance, change))
.findFirst())
.orElse(Change.empty());
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
index 41db36b136e..bb8180e9f14 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
@@ -398,9 +398,9 @@ public class DeploymentTrigger {
private Instance withRemainingChange(Instance instance, Change change, DeploymentStatus status) {
Change remaining = change;
- if (status.jobsToRun(Map.of(instance.name(), change.withoutApplication())).isEmpty())
+ if (status.hasCompleted(instance.name(), change.withoutApplication()))
remaining = remaining.withoutPlatform();
- if (status.jobsToRun(Map.of(instance.name(), change.withoutPlatform())).isEmpty()) {
+ if (status.hasCompleted(instance.name(), change.withoutPlatform())) {
remaining = remaining.withoutApplication();
if (change.application().isPresent())
instance = instance.withLatestDeployed(change.application().get());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
index 5f9f0aeb64c..60c41ef520d 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
@@ -114,7 +114,7 @@ public class JobController {
public void updateStorage() {
for (ApplicationId id : instances())
for (JobType type : jobs(id)) {
- locked(id, type, runs -> { // runs is not modified here, and is written as it was.
+ locked(id, type, runs -> { // Runs are not modified here, and are written as they were.
curator.readLastRun(id, type).ifPresent(curator::writeLastRun);
});
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
index 6cd4e3e92c3..d1b76dd96be 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.deployment;
import com.yahoo.component.Version;
+import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.zone.RoutingMethod;
import com.yahoo.config.provision.zone.ZoneId;
@@ -243,6 +244,38 @@ public class DeploymentTriggerTest {
}
@Test
+ public void testOutstandingChangeWithNextRevisionTarget() {
+ ApplicationPackage appPackage = new ApplicationPackageBuilder().revisionTarget("next")
+ .revisionChange("when-failing")
+ .region("us-east-3")
+ .build();
+ DeploymentContext app = tester.newDeploymentContext()
+ .submit(appPackage);
+ Optional<ApplicationVersion> revision0 = app.lastSubmission();
+
+ app.submit(appPackage);
+ Optional<ApplicationVersion> revision1 = app.lastSubmission();
+
+ app.submit(appPackage);
+ Optional<ApplicationVersion> revision2 = app.lastSubmission();
+
+ app.submit(appPackage);
+ Optional<ApplicationVersion> revision3 = app.lastSubmission();
+
+ assertEquals(revision0, app.instance().change().application());
+ assertEquals(revision1, app.deploymentStatus().outstandingChange(InstanceName.defaultName()).application());
+
+ tester.deploymentTrigger().forceChange(app.instanceId(), Change.of(revision1.get()));
+ assertEquals(revision1, app.instance().change().application());
+ assertEquals(revision2, app.deploymentStatus().outstandingChange(InstanceName.defaultName()).application());
+
+ app.deploy();
+ tester.outstandingChangeDeployer().run();
+ assertEquals(revision2, app.instance().change().application());
+ assertEquals(revision3, app.deploymentStatus().outstandingChange(InstanceName.defaultName()).application());
+ }
+
+ @Test
public void deploymentSpecWithDelays() {
ApplicationPackage applicationPackage = new ApplicationPackageBuilder()
.systemTest()