summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-09-19 12:47:22 +0200
committerGitHub <noreply@github.com>2019-09-19 12:47:22 +0200
commit08269384610a5ae71c41cc8efbf80842d11e53b7 (patch)
tree1eae085c274897668a938f3ebed55cf769a172bf /node-repository/src/main
parent60bc14e29885c1e36deb5eef6ead17163c6757c9 (diff)
Revert "Pause OS upgrade when coinciding with Vespa upgrade"
Diffstat (limited to 'node-repository/src/main')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java9
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java7
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivator.java37
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersion.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java39
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/OsVersionsSerializer.java21
6 files changed, 21 insertions, 97 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
index 445d056b8e3..f21231236d4 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
@@ -1,4 +1,4 @@
-// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision;
import com.google.common.collect.ImmutableList;
@@ -67,13 +67,6 @@ public class NodeList implements Iterable<Node> {
return filter(node -> node.allocation().isPresent() && node.allocation().get().membership().cluster().type().equals(type));
}
- /** Returns the subset of nodes that are currently changing their Vespa version */
- public NodeList changingVersion() {
- return filter(node -> node.status().vespaVersion().isPresent() &&
- node.allocation().isPresent() &&
- !node.status().vespaVersion().get().equals(node.allocation().get().membership().cluster().vespaVersion()));
- }
-
/** Returns the subset of nodes assigned to the given cluster */
public NodeList cluster(ClusterSpec.Id cluster) {
return filter(node -> node.allocation().isPresent() && node.allocation().get().membership().cluster().id().equals(cluster));
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
index 02161caead6..39b0422901e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java
@@ -1,4 +1,4 @@
-// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.maintenance;
import com.google.inject.Inject;
@@ -46,7 +46,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
private final Optional<LoadBalancerExpirer> loadBalancerExpirer;
private final Optional<DynamicProvisioningMaintainer> dynamicProvisioningMaintainer;
private final CapacityReportMaintainer capacityReportMaintainer;
- private final OsUpgradeActivator osUpgradeActivator;
@Inject
public NodeRepositoryMaintenance(NodeRepository nodeRepository, Deployer deployer, InfraDeployer infraDeployer,
@@ -81,7 +80,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
dynamicProvisioningMaintainer = provisionServiceProvider.getHostProvisioner().map(hostProvisioner ->
new DynamicProvisioningMaintainer(nodeRepository, durationFromEnv("host_provisioner_interval").orElse(defaults.dynamicProvisionerInterval), hostProvisioner, flagSource));
capacityReportMaintainer = new CapacityReportMaintainer(nodeRepository, metric, durationFromEnv("capacity_report_interval").orElse(defaults.capacityReportInterval));
- osUpgradeActivator = new OsUpgradeActivator(nodeRepository, defaults.osUpgradeActivatorInterval);
// The DuperModel is filled with infrastructure applications by the infrastructure provisioner, so explicitly run that now
infrastructureProvisioner.maintain();
@@ -104,7 +102,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
infrastructureProvisioner.deconstruct();
loadBalancerExpirer.ifPresent(Maintainer::deconstruct);
dynamicProvisioningMaintainer.ifPresent(Maintainer::deconstruct);
- osUpgradeActivator.deconstruct();
}
private static Optional<Duration> durationFromEnv(String envVariable) {
@@ -148,7 +145,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
private final Duration infrastructureProvisionInterval;
private final Duration loadBalancerExpirerInterval;
private final Duration dynamicProvisionerInterval;
- private final Duration osUpgradeActivatorInterval;
private final NodeFailer.ThrottlePolicy throttlePolicy;
@@ -168,7 +164,6 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
loadBalancerExpirerInterval = Duration.ofMinutes(10);
reservationExpiry = Duration.ofMinutes(20); // Need to be long enough for deployment to be finished for all config model versions
dynamicProvisionerInterval = Duration.ofMinutes(5);
- osUpgradeActivatorInterval = Duration.ofMinutes(5);
if (zone.environment().equals(Environment.prod) && ! zone.system().isCd()) {
inactiveExpiry = Duration.ofHours(4); // enough time for the application owner to discover and redeploy
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivator.java
deleted file mode 100644
index e197689eda2..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.maintenance;
-
-import com.yahoo.config.provision.NodeType;
-import com.yahoo.vespa.hosted.provision.NodeRepository;
-
-import java.time.Duration;
-
-/**
- * This maintainer (de)activates OS upgrades according to Vespa upgrade status of nodes in this repository.
- *
- * If a node is upgrading to a new Vespa version, any ongoing OS upgrade will be paused for all nodes of that type. OS
- * upgrades will resume once all nodes of that type have completed their Vespa upgrade.
- *
- * @author mpolden
- */
-public class OsUpgradeActivator extends Maintainer {
-
- public OsUpgradeActivator(NodeRepository nodeRepository, Duration interval) {
- super(nodeRepository, interval);
- }
-
- @Override
- protected void maintain() {
- for (var nodeType : NodeType.values()) {
- if (!nodeType.isDockerHost()) continue;
- var active = canUpgradeOsOf(nodeType);
- nodeRepository().osVersions().setActive(nodeType, active);
- }
- }
-
- /** Returns whether to allow OS upgrade of nodes of given type */
- private boolean canUpgradeOsOf(NodeType type) {
- return nodeRepository().list().nodeType(type).changingVersion().asList().isEmpty();
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersion.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersion.java
index 99945ce46e8..571356b0a34 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersion.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersion.java
@@ -44,9 +44,4 @@ public class OsVersion {
return Objects.hash(version, active);
}
- @Override
- public String toString() {
- return "OS version " + version + " [active: " + active + "]";
- }
-
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java
index a2d84bc7379..bc738400c45 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java
@@ -1,4 +1,4 @@
-// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.os;
import com.google.common.base.Supplier;
@@ -18,9 +18,6 @@ import java.util.logging.Logger;
/**
* Thread-safe class that manages target OS versions for nodes in this repository.
*
- * A version target is initially inactive. Activation decision is taken by
- * {@link com.yahoo.vespa.hosted.provision.maintenance.OsUpgradeActivator}.
- *
* The target OS version for each node type is set through the /nodes/v2/upgrade REST API.
*
* @author mpolden
@@ -48,11 +45,6 @@ public class OsVersions {
this.db = db;
this.cacheTtl = cacheTtl;
createCache();
-
- // Read and write all versions to make sure they are stored in the latest version of the serialized format
- try (var lock = db.lockOsVersions()) {
- db.writeOsVersions(db.readOsVersions());
- }
}
private void createCache() {
@@ -73,7 +65,6 @@ public class OsVersions {
/** Remove OS target for given node type. Nodes of this type will stop receiving wanted OS version in their
* node object */
public void removeTarget(NodeType nodeType) {
- require(nodeType);
try (Lock lock = db.lockOsVersions()) {
Map<NodeType, OsVersion> osVersions = db.readOsVersions();
osVersions.remove(nodeType);
@@ -85,7 +76,9 @@ public class OsVersions {
/** Set the target OS version for nodes of given type */
public void setTarget(NodeType nodeType, Version newTarget, boolean force) {
- require(nodeType);
+ if (!nodeType.isDockerHost()) {
+ throw new IllegalArgumentException("Setting target OS version for " + nodeType + " nodes is unsupported");
+ }
if (newTarget.isEmpty()) {
throw new IllegalArgumentException("Invalid target version: " + newTarget.toFullString());
}
@@ -103,33 +96,11 @@ public class OsVersions {
+ oldTarget.get().version());
}
- osVersions.put(nodeType, new OsVersion(newTarget, false));
+ osVersions.put(nodeType, new OsVersion(newTarget, true));
db.writeOsVersions(osVersions);
createCache(); // Throw away current cache
log.info("Set OS target version for " + nodeType + " nodes to " + newTarget.toFullString());
}
}
- /** Activate or deactivate target for given node type. This is used for resuming or pausing an OS upgrade. */
- public void setActive(NodeType nodeType, boolean active) {
- require(nodeType);
- try (Lock lock = db.lockOsVersions()) {
- var osVersions = db.readOsVersions();
- var currentVersion = osVersions.get(nodeType);
- if (currentVersion == null) return; // No target version set for this type
- if (currentVersion.active() == active) return; // No change
-
- osVersions.put(nodeType, new OsVersion(currentVersion.version(), active));
- db.writeOsVersions(osVersions);
- createCache(); // Throw away current cache
- log.info((active ? "Activated" : "Deactivated") + " OS target version for " + nodeType + " nodes");
- }
- }
-
- private static void require(NodeType nodeType) {
- if (!nodeType.isDockerHost()) {
- throw new IllegalArgumentException("Node type '" + nodeType + "' does not support OS upgrades");
- }
- }
-
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/OsVersionsSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/OsVersionsSerializer.java
index 91f619ffa91..4104a31886a 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/OsVersionsSerializer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/OsVersionsSerializer.java
@@ -5,6 +5,7 @@ import com.yahoo.component.Version;
import com.yahoo.config.provision.NodeType;
import com.yahoo.slime.ObjectTraverser;
import com.yahoo.slime.Slime;
+import com.yahoo.slime.Type;
import com.yahoo.vespa.config.SlimeUtils;
import com.yahoo.vespa.hosted.provision.os.OsVersion;
@@ -28,11 +29,9 @@ public class OsVersionsSerializer {
public static byte[] toJson(Map<NodeType, OsVersion> versions) {
var slime = new Slime();
var object = slime.setObject();
- versions.forEach((nodeType, osVersion) -> {
- var versionObject = object.setObject(NodeSerializer.toString(nodeType));
- versionObject.setString(VERSION_FIELD, osVersion.version().toFullString());
- versionObject.setBool(ACTIVE_FIELD, osVersion.active());
- });
+ // TODO(mpolden): Write active status here once all readers can handle it
+ versions.forEach((nodeType, osVersion) -> object.setString(NodeSerializer.toString(nodeType),
+ osVersion.version().toFullString()));
try {
return SlimeUtils.toJsonBytes(slime);
} catch (IOException e) {
@@ -44,8 +43,16 @@ public class OsVersionsSerializer {
var versions = new TreeMap<NodeType, OsVersion>(); // Use TreeMap to sort by node type
var inspector = SlimeUtils.jsonToSlime(data).get();
inspector.traverse((ObjectTraverser) (key, value) -> {
- var version = Version.fromString(value.field(VERSION_FIELD).asString());
- var active = value.field(ACTIVE_FIELD).asBool();
+ Version version;
+ boolean active;
+ // TODO(mpolden): Remove fallback after next version
+ if (value.type() == Type.OBJECT) {
+ version = Version.fromString(value.field(VERSION_FIELD).asString());
+ active = value.field(ACTIVE_FIELD).asBool();
+ } else {
+ version = Version.fromString(value.asString());
+ active = true;
+ }
versions.put(NodeSerializer.nodeTypeFromString(key), new OsVersion(version, active));
});
return versions;