diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2020-01-17 10:28:03 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2020-01-17 10:28:03 +0100 |
commit | dbb7ea856e9cea9dce34ad5113a3261205252952 (patch) | |
tree | ee1bc32eb016cc4e2c5256eadf529d8dcded8b19 /node-repository | |
parent | 0d7939b7036d2b0f8960f43edcafe6eff5051f7a (diff) |
Add in-place resize feature flag
Diffstat (limited to 'node-repository')
3 files changed, 30 insertions, 4 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java index 001beabdb07..eab8bb68863 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java @@ -31,6 +31,7 @@ public class GroupPreparer { private final Optional<HostProvisioner> hostProvisioner; private final HostResourcesCalculator hostResourcesCalculator; private final BooleanFlag dynamicProvisioningEnabledFlag; + private final BooleanFlag enableInPlaceResize; private final ListFlag<PreprovisionCapacity> preprovisionCapacityFlag; public GroupPreparer(NodeRepository nodeRepository, Optional<HostProvisioner> hostProvisioner, @@ -39,6 +40,7 @@ public class GroupPreparer { this.hostProvisioner = hostProvisioner; this.hostResourcesCalculator = hostResourcesCalculator; this.dynamicProvisioningEnabledFlag = Flags.ENABLE_DYNAMIC_PROVISIONING.bindTo(flagSource); + this.enableInPlaceResize = Flags.ENABLE_IN_PLACE_RESIZE.bindTo(flagSource); this.preprovisionCapacityFlag = Flags.PREPROVISION_CAPACITY.bindTo(flagSource); } @@ -63,6 +65,9 @@ public class GroupPreparer { boolean dynamicProvisioningEnabled = hostProvisioner.isPresent() && dynamicProvisioningEnabledFlag .with(FetchVector.Dimension.APPLICATION_ID, application.serializedForm()) .value(); + boolean inPlaceResizeEnabled = enableInPlaceResize + .with(FetchVector.Dimension.APPLICATION_ID, application.serializedForm()) + .value(); try (Mutex lock = nodeRepository.lock(application)) { @@ -73,7 +78,7 @@ public class GroupPreparer { LockedNodeList nodeList = nodeRepository.list(allocationLock); NodePrioritizer prioritizer = new NodePrioritizer(nodeList, application, cluster, requestedNodes, spareCount, wantedGroups, nodeRepository.nameResolver(), - hostResourcesCalculator); + hostResourcesCalculator, inPlaceResizeEnabled); prioritizer.addApplicationNodes(); prioritizer.addSurplusNodes(surplusActiveNodes); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java index c7182571f31..b8d7ff04efa 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java @@ -46,11 +46,13 @@ public class NodePrioritizer { private final boolean isDocker; private final boolean isAllocatingForReplacement; private final boolean isTopologyChange; + private final boolean inPlaceResizeEnabled; private final int currentClusterSize; private final Set<Node> spareHosts; NodePrioritizer(LockedNodeList allNodes, ApplicationId appId, ClusterSpec clusterSpec, NodeSpec nodeSpec, - int spares, int wantedGroups, NameResolver nameResolver, HostResourcesCalculator hostResourcesCalculator) { + int spares, int wantedGroups, NameResolver nameResolver, HostResourcesCalculator hostResourcesCalculator, + boolean inPlaceResizeEnabled) { this.allNodes = allNodes; this.capacity = new DockerHostCapacity(allNodes, hostResourcesCalculator); this.requestedNodes = nodeSpec; @@ -58,6 +60,7 @@ public class NodePrioritizer { this.appId = appId; this.nameResolver = nameResolver; this.spareHosts = findSpareHosts(allNodes, capacity, spares); + this.inPlaceResizeEnabled = inPlaceResizeEnabled; NodeList nodesInCluster = allNodes.owner(appId).type(clusterSpec.type()).cluster(clusterSpec.id()); long currentGroups = nodesInCluster.state(Node.State.active).stream() @@ -213,7 +216,7 @@ public class NodePrioritizer { builder.parent(parent).freeParentCapacity(parentCapacity); if (!isNewNode) - builder.resizable(requestedNodes.canResize( + builder.resizable(inPlaceResizeEnabled && requestedNodes.canResize( node.flavor().resources(), parentCapacity, isTopologyChange, currentClusterSize)); if (spareHosts.contains(parent)) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java index b0aa0ed514e..c0e06ef3dff 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java @@ -11,6 +11,8 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.OutOfCapacityException; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.flags.Flags; +import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import org.junit.Test; @@ -53,7 +55,11 @@ public class InPlaceResizeProvisionTest { private static final ClusterSpec container2 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("container2"), Version.fromString("7.157.9"), false); private static final ClusterSpec content1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("content1"), Version.fromString("7.157.9"), false); - private final ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); + private final InMemoryFlagSource flagSource = new InMemoryFlagSource() + .withBooleanFlag(Flags.ENABLE_IN_PLACE_RESIZE.id(), true); + private final ProvisioningTester tester = new ProvisioningTester.Builder() + .flagSource(flagSource) + .zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); private final ApplicationId infraApp = tester.makeApplicationId(); private final ApplicationId app = tester.makeApplicationId(); @@ -153,6 +159,18 @@ public class InPlaceResizeProvisionTest { } @Test(expected = OutOfCapacityException.class) + public void no_in_place_resize_if_flag_not_set() { + flagSource.withBooleanFlag(Flags.ENABLE_IN_PLACE_RESIZE.id(), false); + addParentHosts(4, mediumResources.with(fast).with(local)); + + new PrepareHelper(tester, app).prepare(container1, 4, 1, mediumResources).activate(); + assertClusterSizeAndResources(container1, 4, new NodeResources(4, 8, 16, 1, fast, local)); + + new PrepareHelper(tester, app).prepare(container1, 4, 1, smallResources); + } + + + @Test(expected = OutOfCapacityException.class) public void cannot_inplace_decrease_resources_while_increasing_cluster_size() { addParentHosts(6, mediumResources.with(fast).with(local)); |