diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-11-20 14:17:48 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-11-20 14:17:48 +0100 |
commit | 28ed9c13e8c26e17c0970b6d64f698c351887171 (patch) | |
tree | 7115dfc88ede35ece43acfe471e9b765a51dcc9f /configserver | |
parent | 0713e24de6a12c3584112c9af60dc4105d2056d8 (diff) |
Always load earlier major versions
Since we have extended the semantics of major-version to also mean
"upgrade this application also if you generally don't upgrade",
we need to make sure specifying this doesn't cause config models
on *earlier* versions to not load.
Diffstat (limited to 'configserver')
2 files changed, 39 insertions, 9 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java index 24309569c9d..92d4471c41c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java @@ -78,10 +78,14 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { Instant now) { Set<Version> versions = modelFactoryRegistry.allVersions(); - // If the application specifies a major, load models only for that + // If the application specifies a major, skip models on a newer major Optional<Integer> requestedMajorVersion = applicationPackage.getMajorVersion(); - if (requestedMajorVersion.isPresent()) - versions = filterByMajorVersion(requestedMajorVersion.get(), versions); + if (requestedMajorVersion.isPresent()) { + versions = keepUpToMajorVersion(requestedMajorVersion.get(), versions); + if (versions.isEmpty()) + throw new UnknownVespaVersionException("No Vespa versions on or before major version " + + requestedMajorVersion.get() + " are present"); + } // Load models by one major version at the time as new major versions are allowed to be non-loadable // in the case where an existing application is incompatible with a new major version @@ -95,7 +99,7 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { List<MODELRESULT> allApplicationModels = new ArrayList<>(); for (int i = 0; i < majorVersions.size(); i++) { try { - allApplicationModels.addAll(buildModelVersions(filterByMajorVersion(majorVersions.get(i), versions), + allApplicationModels.addAll(buildModelVersions(keepMajorVersion(majorVersions.get(i), versions), applicationId, wantedNodeVespaVersion, applicationPackage, allocatedHosts, now)); @@ -181,11 +185,12 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { return versions; } - private Set<Version> filterByMajorVersion(int majorVersion, Set<Version> versions) { - Set<Version> filteredVersions = versions.stream().filter(v -> v.getMajor() == majorVersion).collect(Collectors.toSet()); - if (filteredVersions.isEmpty()) - throw new UnknownVespaVersionException("No Vespa versions matching major version " + majorVersion + " are present"); - return filteredVersions; + private Set<Version> keepMajorVersion(int majorVersion, Set<Version> versions) { + return versions.stream().filter(v -> v.getMajor() == majorVersion).collect(Collectors.toSet()); + } + + private Set<Version> keepUpToMajorVersion(int majorVersion, Set<Version> versions) { + return versions.stream().filter(v -> v.getMajor() <= majorVersion).collect(Collectors.toSet()); } private Version findLatest(Set<Version> versionSet) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java index ea0b187dee2..7a70e7958f8 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/RemoteSessionTest.java @@ -42,6 +42,7 @@ import static org.junit.Assert.assertTrue; /** * @author Ulf Lilleengen + * @author bratseth */ public class RemoteSessionTest { @@ -188,6 +189,30 @@ public class RemoteSessionTest { } @Test + public void require_that_an_application_package_can_limit_to_one_higher_major_version() { + ApplicationPackage application = + new MockApplicationPackage.Builder().withServices("<services version='1.0'/>") + .withDeploymentSpec("<deployment version='1.0' major-version='3'/>") + .build(); + assertTrue(application.getMajorVersion().isPresent()); + assertEquals(3, (int)application.getMajorVersion().get()); + + MockModelFactory failingFactory = new MockModelFactory(); + failingFactory.vespaVersion = Version.fromIntValues(4, 0, 0); + failingFactory.throwErrorOnLoad = true; + + MockModelFactory okFactory = new MockModelFactory(); + okFactory.vespaVersion = Version.fromIntValues(2, 0, 0); + okFactory.throwErrorOnLoad = false; + + SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, 3, application); + RemoteSession session = createSession(4, zkc, Arrays.asList(okFactory, failingFactory), failingFactory.clock()); + session.loadPrepared(); + + // Does not cause an error because model version 4 is skipped + } + + @Test public void require_that_session_status_is_updated() { SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenantName, 3); RemoteSession session = createSession(3, zkc, Clock.systemUTC()); |