aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorTorbjørn Smørgrav <smorgrav@users.noreply.github.com>2021-04-21 20:08:37 +0200
committerGitHub <noreply@github.com>2021-04-21 20:08:37 +0200
commit972c1f6f1131d1eb9af3f8f072131a97d1436cd5 (patch)
treefaad11b081e833cca0bfa7892fd6bc50019b7bfd /controller-server
parent0968ae88d17f8de814d805400d3ef23b559c830a (diff)
parent5a4a4bac3e630029a3e2f66f8699889183bffd7e (diff)
Merge pull request #17527 from vespa-engine/olaa/recycle-when-vcmr-is-postponed
Recycle nodes if vcmr is postponed
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java13
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java28
2 files changed, 41 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java
index 958c4f95be4..036331a7454 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java
@@ -38,6 +38,7 @@ public class VCMRMaintainer extends ControllerMaintainer {
private final Logger logger = Logger.getLogger(VCMRMaintainer.class.getName());
private final Duration ALLOWED_RETIREMENT_TIME = Duration.ofHours(60);
+ private final Duration ALLOWED_POSTPONEMENT_TIME = Duration.ofDays(7);
private final CuratorDb curator;
private final NodeRepository nodeRepository;
@@ -131,6 +132,11 @@ public class VCMRMaintainer extends ControllerMaintainer {
return hostAction.withState(State.COMPLETE);
}
+ if (isPostponed(changeRequest, hostAction)) {
+ recycleNode(changeRequest.getZoneId(), node, hostAction);
+ return hostAction.withState(State.PENDING_RETIREMENT);
+ }
+
if (node.type() != NodeType.host || !spareCapacity) {
return hostAction.withState(State.REQUIRES_OPERATOR_ACTION);
}
@@ -177,6 +183,13 @@ public class VCMRMaintainer extends ControllerMaintainer {
}
}
+ private boolean isPostponed(VespaChangeRequest changeRequest, HostAction action) {
+ return List.of(State.RETIRED, State.RETIRING).contains(action.getState()) &&
+ changeRequest.getChangeRequestSource().getPlannedStartTime()
+ .minus(ALLOWED_POSTPONEMENT_TIME)
+ .isAfter(ZonedDateTime.now());
+ }
+
private boolean shouldRetire(VespaChangeRequest changeRequest, HostAction action) {
return action.getState() == State.PENDING_RETIREMENT &&
changeRequest.getChangeRequestSource().getPlannedStartTime()
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java
index 0983b7869bb..d5c35f806f4 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java
@@ -139,6 +139,30 @@ public class VCMRMaintainerTest {
assertEquals(Status.PENDING_ACTION, writtenChangeRequest.getStatus());
}
+ @Test
+ public void recycles_nodes_if_vcmr_is_postponed() {
+ var parkedNode = createNode(host1, NodeType.host, Node.State.parked, false);
+ var retiringNode = createNode(host2, NodeType.host, Node.State.active, true);
+ nodeRepo.putNodes(zoneId, List.of(parkedNode, retiringNode));
+ nodeRepo.allowPatching(true).hasSpareCapacity(true);
+
+ tester.curator().writeChangeRequest(postponedChangeRequest());
+ maintainer.maintain();
+
+ var writtenChangeRequest = tester.curator().readChangeRequest(changeRequestId).get();
+ var hostAction = writtenChangeRequest.getHostActionPlan().get(0);
+ assertEquals(State.PENDING_RETIREMENT, hostAction.getState());
+
+ parkedNode = nodeRepo.list(zoneId, List.of(parkedNode.hostname())).get(0);
+ assertEquals(Node.State.dirty, parkedNode.state());
+ assertFalse(parkedNode.wantToRetire());
+
+ retiringNode = nodeRepo.list(zoneId, List.of(retiringNode.hostname())).get(0);
+ assertEquals(Node.State.active, retiringNode.state());
+ assertFalse(retiringNode.wantToRetire());
+ }
+
+
private VespaChangeRequest canceledChangeRequest() {
return newChangeRequest(ChangeRequestSource.Status.CANCELED, State.RETIRED, State.RETIRING, ZonedDateTime.now());
}
@@ -155,6 +179,10 @@ public class VCMRMaintainerTest {
return newChangeRequest(ChangeRequestSource.Status.STARTED, State.RETIRING, State.RETIRING, ZonedDateTime.now());
}
+ private VespaChangeRequest postponedChangeRequest() {
+ return newChangeRequest(ChangeRequestSource.Status.STARTED, State.RETIRED, State.RETIRING, ZonedDateTime.now().plus(Duration.ofDays(8)));
+ }
+
private VespaChangeRequest newChangeRequest(ChangeRequestSource.Status sourceStatus, State state1, State state2, ZonedDateTime startTime) {
var source = new ChangeRequestSource("aws", changeRequestId, "url", sourceStatus , startTime, ZonedDateTime.now());