summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java22
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java45
3 files changed, 51 insertions, 20 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
index d36638a1a66..7c2c061b62f 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
@@ -41,15 +41,23 @@ public class CapacityPolicies {
}
}
- public NodeResources decideNodeResources(Capacity requestedCapacity, ClusterSpec cluster) {
- NodeResources resources = decideNodeResources(requestedCapacity.nodeResources(), cluster);
- if (zone.system() == SystemName.cd)
- return resources.withDiskSpeed(NodeResources.DiskSpeed.any);
- else
- return resources;
+ public NodeResources decideNodeResources(Optional<NodeResources> requestedResources, ClusterSpec cluster) {
+ NodeResources resources = specifiedOrDefaultNodeResources(requestedResources, cluster);
+
+ if (resources.allocateByLegacyName()) return resources; // Modification not possible
+
+ // Allow slow disks in zones which are not performance sensitive
+ if (zone.system() == SystemName.cd || zone.environment() == Environment.dev || zone.environment() == Environment.test)
+ resources = resources.withDiskSpeed(NodeResources.DiskSpeed.any);
+
+ // Dev does not cap the cpu of containers since usage is spotty: Allocate just a small amount exclusively
+ if (zone.environment() == Environment.dev)
+ resources = resources.withVcpu(0.1);
+
+ return resources;
}
- private NodeResources decideNodeResources(Optional<NodeResources> requestedResources, ClusterSpec cluster) {
+ private NodeResources specifiedOrDefaultNodeResources(Optional<NodeResources> requestedResources, ClusterSpec cluster) {
if (requestedResources.isPresent() && ! requestedResources.get().allocateByLegacyName())
return requestedResources.get();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
index 242aeefd340..c3281253b6b 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
@@ -92,12 +92,10 @@ public class NodeRepositoryProvisioner implements Provisioner {
NodeSpec requestedNodes;
if ( requestedCapacity.type() == NodeType.tenant) {
int nodeCount = application.instance().isTester() ? 1 : capacityPolicies.decideSize(requestedCapacity, cluster.type());
-
if (zone.environment().isManuallyDeployed() && nodeCount < requestedCapacity.nodeCount())
logger.log(Level.INFO, "Requested " + requestedCapacity.nodeCount() + " nodes for " + cluster +
", downscaling to " + nodeCount + " nodes in " + zone.environment());
- NodeResources resources = capacityPolicies.decideNodeResources(requestedCapacity, cluster);
- log.log(LogLevel.DEBUG, () -> "Decided node resources for requested tenant nodes: " + resources);
+ NodeResources resources = capacityPolicies.decideNodeResources(requestedCapacity.nodeResources(), cluster);
boolean exclusive = capacityPolicies.decideExclusivity(cluster.isExclusive());
effectiveGroups = wantedGroups > nodeCount ? nodeCount : wantedGroups; // cannot have more groups than nodes
requestedNodes = NodeSpec.from(nodeCount, resources, exclusive, requestedCapacity.canFail());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
index 148d474e080..079574b7206 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
@@ -265,16 +265,6 @@ public class DynamicDockerAllocationTest {
tester.activate(application1, ImmutableSet.copyOf(hosts));
}
- @Test
- public void cd_uses_slow_disk_nodes_for_docker_hosts_with_default_flavor() {
- ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.test, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
- tester.makeReadyNodes(4, new Flavor(new NodeResources(1, 2, 3, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
- deployZoneApp(tester);
- ApplicationId application1 = tester.makeApplicationId();
- List<HostSpec> hosts = tester.prepare(application1, clusterSpec("myContent.t1.a1"), Capacity.fromCount(3, Optional.empty(), false, true), 1);
- tester.activate(application1, ImmutableSet.copyOf(hosts));
- }
-
@Test(expected = OutOfCapacityException.class)
public void allocation_should_fail_when_host_is_not_active() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
@@ -301,6 +291,22 @@ public class DynamicDockerAllocationTest {
}
@Test
+ public void legacy_bare_metal_allocations_are_not_altered() {
+ ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
+ tester.makeReadyNodes(5, "host-large", NodeType.tenant);
+ deployZoneApp(tester);
+
+ ApplicationId application = tester.makeApplicationId();
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test"), Version.fromString("1"), false);
+ NodeResources resources = NodeResources.fromLegacyName("host-large");
+
+ List<HostSpec> hosts = tester.prepare(application, cluster, 2, 1, resources);
+ assertEquals(2, hosts.size());
+ assertEquals("host-large", hosts.get(0).flavor().get().name());
+ tester.activate(application, hosts);
+ }
+
+ @Test
public void provisioning_fast_disk_speed_do_not_get_slow_nodes() {
provisionFastAndSlowThenDeploy(NodeResources.DiskSpeed.fast, true);
}
@@ -354,6 +360,25 @@ public class DynamicDockerAllocationTest {
}
}
+ @Test
+ public void nodeResourcesAreRelaxedInDev() {
+ ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
+ tester.makeReadyNodes(2, new Flavor(new NodeResources(1, 2, 3, NodeResources.DiskSpeed.fast)), NodeType.host, 10, true);
+ tester.makeReadyNodes(2, new Flavor(new NodeResources(1, 2, 3, NodeResources.DiskSpeed.slow)), NodeType.host, 10, true);
+ deployZoneApp(tester);
+
+ ApplicationId application = tester.makeApplicationId();
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test"), Version.fromString("1"), false);
+ NodeResources resources = new NodeResources(1, 1, 1, NodeResources.DiskSpeed.fast);
+
+ List<HostSpec> hosts = tester.prepare(application, cluster, 4, 1, resources);
+ assertEquals(1, hosts.size());
+ tester.activate(application, hosts);
+ assertEquals(0.1, hosts.get(0).flavor().get().resources().vcpu(), 0.000001);
+ assertEquals("Slow nodes are allowed in dev and preferred because they are cheaper",
+ NodeResources.DiskSpeed.slow, hosts.get(0).flavor().get().resources().diskSpeed());
+ }
+
private ApplicationId makeApplicationId(String tenant, String appName) {
return ApplicationId.from(tenant, appName, "default");
}