aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2023-06-15 08:21:51 +0200
committerHarald Musum <musum@yahooinc.com>2023-06-15 08:21:51 +0200
commit88256ac09acee16def8b7d53a5dd92685bd7e181 (patch)
treec0958aa8a3975f357e76c8ad109af0b7c1944655
parentccc9f2829e918846a444daea4434cab01e93241d (diff)
SKip upgrade checks if VESPA_SKIP_UPGRADE_CHECK is true
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/version/VersionState.java41
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java67
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/version/VersionStateTest.java2
3 files changed, 77 insertions, 33 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/version/VersionState.java b/configserver/src/main/java/com/yahoo/vespa/config/server/version/VersionState.java
index 61c55641d23..19dae614f56 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/version/VersionState.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/version/VersionState.java
@@ -37,30 +37,30 @@ public class VersionState {
private final File versionFile;
private final Curator curator;
private final Version currentVersion;
- private final boolean throwIfUpgradeBetweenVersionsTooFarApart;
+ private final boolean skipUpgradeCheck;
@Inject
public VersionState(ConfigserverConfig config, Curator curator) {
this(new File(Defaults.getDefaults().underVespaHome(config.configServerDBDir()), "vespa_version"),
curator,
- config.hostedVespa());
+ Boolean.parseBoolean(Optional.ofNullable(System.getenv("VESPA_SKIP_UPGRADE_CHECK")).orElse("false")));
}
- public VersionState(File versionFile, Curator curator, boolean throwIfUpgradeBetweenVersionsTooFarApart) {
+ public VersionState(File versionFile, Curator curator, boolean skipUpgradeCheck) {
this(versionFile,
curator,
new Version(VespaVersion.major, VespaVersion.minor, VespaVersion.micro),
- throwIfUpgradeBetweenVersionsTooFarApart);
+ skipUpgradeCheck);
}
public VersionState(File versionFile,
Curator curator,
Version currentVersion,
- boolean throwIfUpgradeBetweenVersionsTooFarApart) {
+ boolean skipUpgradeCheck) {
this.versionFile = versionFile;
this.curator = curator;
this.currentVersion = currentVersion;
- this.throwIfUpgradeBetweenVersionsTooFarApart = throwIfUpgradeBetweenVersionsTooFarApart;
+ this.skipUpgradeCheck = skipUpgradeCheck;
}
public boolean isUpgraded() {
@@ -123,27 +123,34 @@ public class VersionState {
int storedVersionMinor = storedVersion.getMinor();
int currentVersionMajor = currentVersion.getMajor();
int currentVersionMinor = currentVersion.getMinor();
-
boolean sameMajor = storedVersionMajor == currentVersionMajor;
boolean differentMajor = !sameMajor;
+
+ String message = "Cannot upgrade from " + storedVersion + " to " + currentVersion();
if (storedVersionMajor < latestVersionOnPreviousMajor.getMajor())
- logOrThrow("Cannot upgrade from " + storedVersion + " to " + currentVersion() +
- " (upgrade across 2 major versions not supported). Please upgrade to " + latestVersionOnPreviousMajor.toFullString() + " first.");
+ logOrThrow(message + " (upgrade across 2 major versions not supported). Please upgrade to " +
+ latestVersionOnPreviousMajor.toFullString() + " first." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
else if (sameMajor && (currentVersionMinor - storedVersionMinor > allowedMinorVersionInterval))
- logOrThrow("Cannot upgrade from " + storedVersion + " to " + currentVersion() +
- ". Please upgrade to an intermediate version first, the interval between the two versions is too large.");
+ logOrThrow(message + ". Please upgrade to an older version first, the interval between the two versions is too large (> " + allowedMinorVersionInterval + " releases)." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
else if (differentMajor && storedVersionMinor < latestVersionOnPreviousMajor.getMinor())
- logOrThrow("Cannot upgrade directly from " + storedVersion + " to " + currentVersion() + " (new major version). Please upgrade to " + latestVersionOnPreviousMajor.toFullString() + " first.");
+ logOrThrow(message + " (new major version). Please upgrade to " + latestVersionOnPreviousMajor.toFullString() + " first." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
else if (differentMajor && currentVersionMinor > allowedMinorVersionInterval)
- logOrThrow("Cannot upgrade from " + storedVersion + " to " + currentVersion() +
- ". Please upgrade to an intermediate version first, the interval between the two versions is too large.");
+ logOrThrow(message + ". Please upgrade to an older version first, the interval between the two versions is too large (> " + allowedMinorVersionInterval + " releases)." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
}
private void logOrThrow(String message) {
- if (throwIfUpgradeBetweenVersionsTooFarApart)
- throw new RuntimeException(message);
- else
+ if (skipUpgradeCheck)
log.log(WARNING, message);
+ else
+ throw new RuntimeException(message);
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
index df0682b5156..a60b7babe35 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
@@ -191,25 +191,54 @@ public class ConfigServerBootstrapTest {
.build();
RpcServer rpcServer = createRpcServer(configserverConfig);
- // Upgrade between two versions not too far apart, should work
- Version versionToUpgradeTo = Version.fromString("8.110.1");
- Bootstrapper bootstrap = createBootstrapper(tester, rpcServer, VIP_STATUS_PROGRAMMATICALLY, versionToUpgradeTo);
- bootstrap.versionState().storeVersion("8.100.1");
- bootstrap.doStart();
+ assertUpgradeWorks("7,.594.36", "8.110.1", tester, rpcServer);
+ assertUpgradeWorks("8.100.1", "8.110.1", tester, rpcServer);
assertUpgradeFails("8.100.1", "8.131.1", tester, rpcServer,
- "Cannot upgrade from 8.100.1 to 8.131.1. Please upgrade to an intermediate version first, the interval between the two versions is too large.");
+ "Cannot upgrade from 8.100.1 to 8.131.1. Please upgrade to an older version first, " +
+ "the interval between the two versions is too large (> 30 releases)." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
assertUpgradeFails("7.99.1", "8.100.1", tester, rpcServer,
- "Cannot upgrade directly from 7.99.1 to 8.100.1 (new major version). Please upgrade to 7.594.36 first.");
+ "Cannot upgrade from 7.99.1 to 8.100.1 (new major version). Please upgrade to 7.594.36 first." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
assertUpgradeFails("7.594.36", "8.121.1", tester, rpcServer,
- "Cannot upgrade from 7.594.36 to 8.121.1. Please upgrade to an intermediate version first, the interval between the two versions is too large.");
+ "Cannot upgrade from 7.594.36 to 8.121.1. Please upgrade to an older version first," +
+ " the interval between the two versions is too large (> 30 releases)." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
assertUpgradeFails("6.11.11", "8.121.1", tester, rpcServer,
- "Cannot upgrade from 6.11.11 to 8.121.1 (upgrade across 2 major versions not supported). Please upgrade to 7.594.36 first.");
+ "Cannot upgrade from 6.11.11 to 8.121.1 (upgrade across 2 major versions not supported)." +
+ " Please upgrade to 7.594.36 first." +
+ " Setting VESPA_SKIP_UPGRADE_CHECK=true will skip this check at your own risk," +
+ " see https://vespa.ai/releases.html#versions");
+
+ Version versionToUpgradeTo = Version.fromString("8.131.1");
+ boolean skipUpgradeCheck = true;
+ VersionState versionState = createVersionState(tester.curator(), versionToUpgradeTo, skipUpgradeCheck);
+ assertUpgradeWorks("7.594.36", tester, rpcServer, versionState);
+ assertUpgradeWorks("8.100.1", tester, rpcServer, versionState);
+ }
+
+ private void assertUpgradeWorks(String from, String to, DeployTester tester, RpcServer rpcServer) throws IOException {
+ Version versionToUpgradeTo = Version.fromString(to);
+ VersionState versionState = createVersionState(tester.curator(), versionToUpgradeTo);
+ Bootstrapper bootstrap = createBootstrapper(tester, rpcServer, VIP_STATUS_PROGRAMMATICALLY, versionState);
+ bootstrap.versionState().storeVersion(from);
+ bootstrap.doStart();
+ }
+
+ private void assertUpgradeWorks(String from, DeployTester tester, RpcServer rpcServer, VersionState versionState) {
+ Bootstrapper bootstrap = createBootstrapper(tester, rpcServer, VIP_STATUS_PROGRAMMATICALLY, versionState);
+ bootstrap.versionState().storeVersion(from);
+ bootstrap.doStart();
}
private void assertUpgradeFails(String from, String to, DeployTester tester, RpcServer rpcServer, String expected) throws IOException {
Version versionToUpgradeTo = Version.fromString(to);
- Bootstrapper bootstrap = createBootstrapper(tester, rpcServer, VIP_STATUS_PROGRAMMATICALLY, versionToUpgradeTo);
+ VersionState versionState = createVersionState(tester.curator(), versionToUpgradeTo);
+ Bootstrapper bootstrap = createBootstrapper(tester, rpcServer, VIP_STATUS_PROGRAMMATICALLY, versionState);
bootstrap.versionState().storeVersion(from);
try {
bootstrap.doStart();
@@ -220,12 +249,14 @@ public class ConfigServerBootstrapTest {
}
private Bootstrapper createBootstrapper(DeployTester tester, RpcServer rpcServer, VipStatusMode vipStatusMode) throws IOException {
- return createBootstrapper(tester, rpcServer, vipStatusMode, new Version(VespaVersion.major, VespaVersion.minor, VespaVersion.micro));
+ Version versionToUpgradeTo = new Version(VespaVersion.major, VespaVersion.minor, VespaVersion.micro);
+ return createBootstrapper(tester,rpcServer, vipStatusMode, createVersionState(tester.curator(), versionToUpgradeTo));
}
- private Bootstrapper createBootstrapper(DeployTester tester, RpcServer rpcServer, VipStatusMode vipStatusMode, Version version) throws IOException {
- VersionState versionState = createVersionState(tester.curator(), version);
-
+ private Bootstrapper createBootstrapper(DeployTester tester,
+ RpcServer rpcServer,
+ VipStatusMode vipStatusMode,
+ VersionState versionState) {
StateMonitor stateMonitor = StateMonitor.createForTesting();
VipStatus vipStatus = createVipStatus(stateMonitor);
return new Bootstrapper(tester.applicationRepository(),
@@ -292,7 +323,13 @@ public class ConfigServerBootstrapTest {
}
private VersionState createVersionState(Curator curator, Version vespaVersion) throws IOException {
- return new VersionState(temporaryFolder.newFile(), curator, vespaVersion, true);
+ return new VersionState(temporaryFolder.newFile(), curator, vespaVersion, false);
+ }
+
+ private VersionState createVersionState(Curator curator,
+ Version vespaVersion,
+ boolean throwIfUpgradeBetweenVersionsTooFarApart) throws IOException {
+ return new VersionState(temporaryFolder.newFile(), curator, vespaVersion, throwIfUpgradeBetweenVersionsTooFarApart);
}
public static class MockRpcServer extends com.yahoo.vespa.config.server.rpc.MockRpcServer {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/version/VersionStateTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/version/VersionStateTest.java
index 092243bac6d..917c05ad79b 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/version/VersionStateTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/version/VersionStateTest.java
@@ -72,7 +72,7 @@ public class VersionStateTest {
}
private VersionState createVersionState() throws IOException {
- return new VersionState(tempDir.newFile(), curator, false);
+ return new VersionState(tempDir.newFile(), curator, true);
}
}