diff options
author | Torbjørn Smørgrav <smorgrav@users.noreply.github.com> | 2021-04-21 20:08:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-21 20:08:37 +0200 |
commit | 972c1f6f1131d1eb9af3f8f072131a97d1436cd5 (patch) | |
tree | faad11b081e833cca0bfa7892fd6bc50019b7bfd /controller-server | |
parent | 0968ae88d17f8de814d805400d3ef23b559c830a (diff) | |
parent | 5a4a4bac3e630029a3e2f66f8699889183bffd7e (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')
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()); |