From 5f2fc94dedfb3469c8421ec423d5baf73e57cf17 Mon Sep 17 00:00:00 2001 From: jonmv Date: Mon, 15 May 2023 11:44:41 +0200 Subject: Make "current major version" sticky --- .../persistence/VersionStatusSerializer.java | 5 ++++- .../hosted/controller/versions/VersionStatus.java | 19 +++++++++---------- .../maintenance/VersionStatusUpdaterTest.java | 5 ++--- .../persistence/VersionStatusSerializerTest.java | 3 ++- .../restapi/deployment/DeploymentApiTest.java | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java index cb779d847c3..9643de52c29 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java @@ -32,6 +32,7 @@ public class VersionStatusSerializer { // VersionStatus fields private static final String versionsField = "versions"; + private static final String currentMajorField = "currentMajor"; // VespaVersion fields private static final String releaseCommitField = "releaseCommit"; @@ -61,12 +62,14 @@ public class VersionStatusSerializer { Slime slime = new Slime(); Cursor root = slime.setObject(); versionsToSlime(status.versions(), root.setArray(versionsField)); + root.setLong(currentMajorField, status.currentMajor()); return slime; } public VersionStatus fromSlime(Slime slime) { Inspector root = slime.get(); - return new VersionStatus(vespaVersionsFromSlime(root.field(versionsField))); + return new VersionStatus(vespaVersionsFromSlime(root.field(versionsField)), + (int) root.field(currentMajorField).asLong()); } private void versionsToSlime(List versions, Cursor array) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java index ed7bd924ccc..732327e25f6 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java @@ -35,13 +35,14 @@ import java.util.stream.Collectors; * @author bratseth * @author mpolden */ -public record VersionStatus(List versions) { +public record VersionStatus(List versions, int currentMajor) { private static final Logger log = Logger.getLogger(VersionStatus.class.getName()); /** Create a version status. DO NOT USE: Public for testing and serialization only */ - public VersionStatus(List versions) { + public VersionStatus(List versions, int currentMajor) { this.versions = List.copyOf(versions); + this.currentMajor = currentMajor; } /** Returns the current version of controllers in this system */ @@ -98,11 +99,12 @@ public record VersionStatus(List versions) { } /** Create the empty version status */ - public static VersionStatus empty() { return new VersionStatus(List.of()); } + public static VersionStatus empty() { return new VersionStatus(List.of(), -1); } /** Create a full, updated version status. This is expensive and should be done infrequently */ public static VersionStatus compute(Controller controller) { VersionStatus versionStatus = controller.readVersionStatus(); + int currentMajor = versionStatus.currentMajor(); List systemApplicationVersions = findSystemApplicationVersions(controller, versionStatus); Map> controllerVersions = findControllerVersions(controller); @@ -164,6 +166,8 @@ public record VersionStatus(List versions) { controller, versionStatus); versions.add(vespaVersion); + if (vespaVersion.confidence().equalOrHigherThan(Confidence.high)) + currentMajor = Math.max(currentMajor, vespaVersion.versionNumber().getMajor()); } catch (IllegalArgumentException e) { log.log(Level.WARNING, "Unable to create VespaVersion for version " + statistics.version().toFullString(), e); @@ -172,7 +176,7 @@ public record VersionStatus(List versions) { Collections.sort(versions); - return new VersionStatus(versions); + return new VersionStatus(versions, currentMajor); } private static List findSystemApplicationVersions(Controller controller, VersionStatus versionStatus) { @@ -275,12 +279,7 @@ public record VersionStatus(List versions) { /** Whether no version on a newer major, with high confidence, can be deployed. */ public boolean isOnCurrentMajor(Version version) { - for (VespaVersion available : deployableVersions()) - if ( available.confidence().equalOrHigherThan(Confidence.high) - && available.versionNumber().getMajor() > version.getMajor()) - return false; - - return true; + return version.getMajor() >= currentMajor; } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VersionStatusUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VersionStatusUpdaterTest.java index e6f46e0630d..962288f9073 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VersionStatusUpdaterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VersionStatusUpdaterTest.java @@ -25,11 +25,10 @@ public class VersionStatusUpdaterTest { @Test void testVersionUpdating() { ControllerTester tester = new ControllerTester(); - tester.controller().updateVersionStatus(new VersionStatus(Collections.emptyList())); + tester.controller().updateVersionStatus(VersionStatus.empty()); assertFalse(tester.controller().readVersionStatus().systemVersion().isPresent()); - VersionStatusUpdater updater = new VersionStatusUpdater(tester.controller(), Duration.ofDays(1) - ); + VersionStatusUpdater updater = new VersionStatusUpdater(tester.controller(), Duration.ofDays(1)); updater.maintain(); assertTrue(tester.controller().readVersionStatus().systemVersion().isPresent()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java index 618c33835bd..7c3ba5aeadf 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java @@ -32,7 +32,7 @@ public class VersionStatusSerializerTest { vespaVersions.add(new VespaVersion(version, "cafe", Instant.now(), true, true, false, nodeVersions(Version.fromString("5.0"), Version.fromString("5.1"), "cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal)); - VersionStatus status = new VersionStatus(vespaVersions); + VersionStatus status = new VersionStatus(vespaVersions, 5); VersionStatusSerializer serializer = new VersionStatusSerializer(new NodeVersionSerializer()); VersionStatus deserialized = serializer.fromSlime(serializer.toSlime(status)); @@ -49,6 +49,7 @@ public class VersionStatusSerializerTest { assertEquals(a.nodeVersions(), b.nodeVersions()); assertEquals(a.confidence(), b.confidence()); } + assertEquals(status.currentMajor(), deserialized.currentMajor()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java index c942a7ad63d..bcc1f27c89f 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java @@ -105,7 +105,7 @@ public class DeploymentApiTest extends ControllerContainerTest { } censored.add(version); } - return new VersionStatus(censored); + return new VersionStatus(censored, versionStatus.currentMajor()); } } -- cgit v1.2.3