diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-09-19 12:47:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-19 12:47:22 +0200 |
commit | 08269384610a5ae71c41cc8efbf80842d11e53b7 (patch) | |
tree | 1eae085c274897668a938f3ebed55cf769a172bf /node-repository/src/main | |
parent | 60bc14e29885c1e36deb5eef6ead17163c6757c9 (diff) |
Revert "Pause OS upgrade when coinciding with Vespa upgrade"
Diffstat (limited to 'node-repository/src/main')
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; |