diff options
Diffstat (limited to 'node-repository')
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"); } |