summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorvalerijf <valerijf@yahoo-inc.com>2017-06-08 15:36:49 +0200
committervalerijf <valerijf@yahoo-inc.com>2017-06-08 15:36:49 +0200
commita27d02964c7452b673b9ee63f61c714a5db3a3ea (patch)
tree8d02ecceb0177764008b2449ab7f6ee65265cb09 /node-repository
parent4c05f765f772674fc248e8337558616da3cf7326 (diff)
Let NodeRetirer redeploy applications where it retires a node
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRepositoryMaintenance.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java21
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTest.java2
3 files changed, 18 insertions, 7 deletions
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 da3431b3d3a..74a6dfaeecb 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
@@ -78,7 +78,7 @@ public class NodeRepositoryMaintenance extends AbstractComponent {
FlavorSpareChecker flavorSpareChecker = new FlavorSpareChecker(
NodeRetirer.SPARE_NODES_POLICY, FlavorSpareCount.constructFlavorSpareCountGraph(zone.nodeFlavors().get().getFlavors()));
- nodeRetirer = new NodeRetirer(nodeRepository, zone, flavorSpareChecker, durationFromEnv("retire_interval").orElse(defaults.nodeRetirerInterval), jobControl,
+ nodeRetirer = new NodeRetirer(nodeRepository, zone, flavorSpareChecker, durationFromEnv("retire_interval").orElse(defaults.nodeRetirerInterval), deployer, jobControl,
new RetireIPv4OnlyNodes(),
new Zone(SystemName.cd, Environment.dev, RegionName.from("cd-us-central-1")),
new Zone(SystemName.cd, Environment.prod, RegionName.from("cd-us-central-1")),
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java
index c320fbcaff8..541addb247d 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirer.java
@@ -1,6 +1,8 @@
package com.yahoo.vespa.hosted.provision.maintenance;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Deployer;
+import com.yahoo.config.provision.Deployment;
import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.Zone;
@@ -16,6 +18,7 @@ import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -30,11 +33,12 @@ public class NodeRetirer extends Maintainer {
private static final long MAX_SIMULTANEOUS_RETIRES_PER_APPLICATION = 1;
private static final Logger log = Logger.getLogger(NodeRetirer.class.getName());
+ private final Deployer deployer;
private final FlavorSpareChecker flavorSpareChecker;
private final RetirementPolicy retirementPolicy;
public NodeRetirer(NodeRepository nodeRepository, Zone zone, FlavorSpareChecker flavorSpareChecker, Duration interval,
- JobControl jobControl, RetirementPolicy retirementPolicy, Zone... applies) {
+ Deployer deployer, JobControl jobControl, RetirementPolicy retirementPolicy, Zone... applies) {
super(nodeRepository, interval, jobControl);
if (! Arrays.asList(applies).contains(zone)) {
String targetZones = Arrays.stream(applies).map(Zone::toString).collect(Collectors.joining(", "));
@@ -42,6 +46,7 @@ public class NodeRetirer extends Maintainer {
deconstruct();
}
+ this.deployer = deployer;
this.retirementPolicy = retirementPolicy;
this.flavorSpareChecker = flavorSpareChecker;
}
@@ -60,8 +65,8 @@ public class NodeRetirer extends Maintainer {
boolean retireUnallocated() {
try (Mutex lock = nodeRepository().lockUnallocated()) {
List<Node> allNodes = nodeRepository().getNodes(NodeType.tenant);
- Map<Flavor, Map<Node.State, Long>> numNodesByFlavorByState = getNumberOfNodesByFlavorByNodeState(allNodes);
- flavorSpareChecker.updateReadyAndActiveCountsByFlavor(numNodesByFlavorByState);
+ Map<Flavor, Map<Node.State, Long>> numSpareNodesByFlavorByState = getNumberOfNodesByFlavorByNodeState(allNodes);
+ flavorSpareChecker.updateReadyAndActiveCountsByFlavor(numSpareNodesByFlavorByState);
long numFlavorsWithUnsuccessfullyRetiredNodes = allNodes.stream()
.filter(node -> node.state() == Node.State.ready)
@@ -102,15 +107,18 @@ public class NodeRetirer extends Maintainer {
flavorSpareChecker.updateReadyAndActiveCountsByFlavor(numSpareNodesByFlavorByState);
for (ApplicationId applicationId : activeApplications) {
+ Optional<Deployment> deployment = deployer.deployFromLocalActive(applicationId, Duration.ofMinutes(30));
+ if ( ! deployment.isPresent()) continue; // this will be done at another config server
+
try (Mutex lock = nodeRepository().lock(applicationId)) {
// Get nodes for current application under lock
List<Node> applicationNodes = nodeRepository().getNodes(applicationId);
Set<Node> retireableNodes = getRetireableNodesForApplication(applicationNodes);
long numNodesAllowedToRetire = getNumberNodesAllowToRetireForApplication(applicationNodes, MAX_SIMULTANEOUS_RETIRES_PER_APPLICATION);
+ long numNodesWantedToRetire = 0;
- for (Iterator<Node> iterator = retireableNodes.iterator(); iterator.hasNext() && numNodesAllowedToRetire > 0; ) {
+ for (Iterator<Node> iterator = retireableNodes.iterator(); iterator.hasNext() && numNodesAllowedToRetire > numNodesWantedToRetire; ) {
Node retireableNode = iterator.next();
- System.out.println(retireableNode);
if (flavorSpareChecker.canRetireAllocatedNodeWithFlavor(retireableNode.flavor())) {
log.info("Setting wantToRetire for host " + retireableNode.hostname() +
@@ -121,8 +129,11 @@ public class NodeRetirer extends Maintainer {
.withWantToRetire(true)
.withWantToDeprovision(true));
nodeRepository().write(updatedNode);
+ numNodesWantedToRetire++;
}
}
+
+ if (numNodesWantedToRetire > 0) deployment.get().activate();
}
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTest.java
index 5038b0f950b..f71d9b75f78 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTest.java
@@ -64,7 +64,7 @@ public class NodeRetirerTest {
.forEach(node -> tester.nodeRepository.write(node.withIpAddresses(Collections.singleton("::2"))));
tester.assertCountsForStateByFlavor(Node.State.active, 9, -1, 2, 11, -1);
- System.out.println("start");
+
tester.setNumberAllowedAllocatedRetirementsPerFlavor(3, 2, 3, 2);
retirer.retireAllocated();
tester.assertParkedCountsByApplication(-1, -1, -1, -1, -1); // Nodes should be in retired, but not yet parked