diff options
Diffstat (limited to 'node-repository/src/main/java')
8 files changed, 28 insertions, 25 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index f5c5db45f4a..ff0fc9f66ea 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -110,6 +110,7 @@ public class NodeRepository extends AbstractComponent { private final DockerImages dockerImages; private final JobControl jobControl; private final Applications applications; + private final boolean canProvisionHosts; private final int spareCount; /** @@ -124,7 +125,7 @@ public class NodeRepository extends AbstractComponent { Zone zone, FlagSource flagSource) { this(flavors, - provisionServiceProvider, + provisionServiceProvider.getHostResourcesCalculator(), curator, Clock.systemUTC(), zone, @@ -132,7 +133,8 @@ public class NodeRepository extends AbstractComponent { DockerImage.fromString(config.dockerImage()), flagSource, config.useCuratorClientCache(), - zone.environment().isProduction() && !zone.getCloud().dynamicProvisioning() ? 1 : 0, + provisionServiceProvider.getHostProvisioner().isPresent(), + zone.environment().isProduction() && provisionServiceProvider.getHostProvisioner().isEmpty() ? 1 : 0, config.nodeCacheSize()); } @@ -141,7 +143,7 @@ public class NodeRepository extends AbstractComponent { * which will be used for time-sensitive decisions. */ public NodeRepository(NodeFlavors flavors, - ProvisionServiceProvider provisionServiceProvider, + HostResourcesCalculator resourcesCalculator, Curator curator, Clock clock, Zone zone, @@ -149,19 +151,14 @@ public class NodeRepository extends AbstractComponent { DockerImage dockerImage, FlagSource flagSource, boolean useCuratorClientCache, + boolean canProvisionHosts, int spareCount, long nodeCacheSize) { - // TODO (valerijf): Uncomment when exception for prod.cd-aws is removed -// if (provisionServiceProvider.getHostProvisioner().isPresent() != zone.getCloud().dynamicProvisioning()) -// throw new IllegalArgumentException(String.format( -// "dynamicProvisioning property must be 1-to-1 with availability of HostProvisioner, was: dynamicProvisioning=%s, hostProvisioner=%s", -// zone.getCloud().dynamicProvisioning(), provisionServiceProvider.getHostProvisioner().map(__ -> "present").orElse("empty"))); - this.db = new CuratorDatabaseClient(flavors, curator, clock, zone, useCuratorClientCache, nodeCacheSize); this.zone = zone; this.clock = clock; this.flavors = flavors; - this.resourcesCalculator = provisionServiceProvider.getHostResourcesCalculator(); + this.resourcesCalculator = resourcesCalculator; this.nameResolver = nameResolver; this.osVersions = new OsVersions(this); this.infrastructureVersions = new InfrastructureVersions(db); @@ -169,6 +166,7 @@ public class NodeRepository extends AbstractComponent { this.dockerImages = new DockerImages(db, dockerImage); this.jobControl = new JobControl(new JobControlFlags(db, flagSource)); this.applications = new Applications(db); + this.canProvisionHosts = canProvisionHosts; this.spareCount = spareCount; rewriteNodes(); } @@ -839,12 +837,15 @@ public class NodeRepository extends AbstractComponent { if (host.status().wantToRetire()) return false; if (host.allocation().map(alloc -> alloc.membership().retired()).orElse(false)) return false; - if (zone.getCloud().dynamicProvisioning()) + if ( canProvisionHosts()) return EnumSet.of(State.active, State.ready, State.provisioned).contains(host.state()); else return host.state() == State.active; } + /** Returns whether this repository can provision hosts on demand */ + public boolean canProvisionHosts() { return canProvisionHosts; } + /** Returns the time keeper of this system */ public Clock clock() { return clock; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java index ff74655f461..d1d15baa5dc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java @@ -7,6 +7,7 @@ import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeResources; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; +import com.yahoo.vespa.hosted.provision.provisioning.HostResourcesCalculator; import com.yahoo.vespa.hosted.provision.provisioning.NodeResourceLimits; import java.util.List; @@ -137,7 +138,7 @@ public class AllocatableClusterResources { Limits applicationLimits, NodeRepository nodeRepository) { var systemLimits = new NodeResourceLimits(nodeRepository); - if ( !exclusive && !nodeRepository.zone().getCloud().dynamicProvisioning()) { + if ( !exclusive && nodeRepository.zone().getCloud().allowHostSharing()) { // We decide resources: Add overhead to what we'll request (advertised) to make sure real becomes (at least) cappedNodeResources NodeResources advertisedResources = nodeRepository.resourcesCalculator().realToRequest(wantedResources.nodeResources()); advertisedResources = systemLimits.enlargeToLegal(advertisedResources, clusterType); // Attempt to ask for something legal diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java index d6b2ca6d170..192f185f595 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java @@ -35,7 +35,7 @@ public class Rebalancer extends NodeMover<Rebalancer.Move> { @Override protected boolean maintain() { boolean success = true; - if (nodeRepository().zone().getCloud().dynamicProvisioning()) return success; // Rebalancing not necessary + if ( ! nodeRepository().zone().getCloud().allowHostSharing()) return success; // Rebalancing not necessary if (nodeRepository().zone().environment().isTest()) return success; // Short lived deployments; no need to rebalance // Work with an unlocked snapshot as this can take a long time and full consistency is not needed diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java index 475928863ee..c3389a1d98d 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainer.java @@ -68,8 +68,7 @@ public class SpareCapacityMaintainer extends NodeRepositoryMaintainer { @Override protected boolean maintain() { boolean success = true; - // Don't need to maintain spare capacity in dynamically provisioned zones; can provision more on demand. - if (nodeRepository().zone().getCloud().dynamicProvisioning()) return success; + if ( ! nodeRepository().zone().getCloud().allowHostSharing()) return success; NodeList allNodes = nodeRepository().list(); CapacityChecker capacityChecker = new CapacityChecker(allNodes); 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 f1a006b1359..223d88c4dc0 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 @@ -45,7 +45,7 @@ public class CapacityPolicies { if (capacity.isRequired()) return target; // Dev does not cap the cpu of containers since usage is spotty: Allocate just a small amount exclusively - if (zone.environment() == Environment.dev && !zone.getCloud().dynamicProvisioning()) + if (zone.environment() == Environment.dev && zone.getCloud().allowHostSharing()) target = target.withVcpu(0.1); // Allow slow storage in zones which are not performance sensitive @@ -61,14 +61,14 @@ public class CapacityPolicies { // Use small logserver in dev system return new NodeResources(0.1, 1, 10, 0.3); } - return zone.getCloud().dynamicProvisioning() ? - new NodeResources(0.5, 4, 50, 0.3) : - new NodeResources(0.5, 2, 50, 0.3); + return zone.getCloud().allowHostSharing() ? + new NodeResources(0.5, 2, 50, 0.3) : + new NodeResources(0.5, 4, 50, 0.3); } - return zone.getCloud().dynamicProvisioning() ? - new NodeResources(2.0, 8, 50, 0.3) : - new NodeResources(1.5, 8, 50, 0.3); + return zone.getCloud().allowHostSharing() ? + new NodeResources(1.5, 8, 50, 0.3) : + new NodeResources(2.0, 8, 50, 0.3); } /** 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 7f62eb8632c..aee36351495 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 @@ -59,7 +59,7 @@ public class GroupPreparer { // active config model which is changed on activate public List<Node> prepare(ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, List<Node> surplusActiveNodes, MutableInteger highestIndex, int wantedGroups) { - boolean dynamicProvisioningEnabled = nodeRepository.zone().getCloud().dynamicProvisioning(); + boolean dynamicProvisioningEnabled = nodeRepository.canProvisionHosts() && nodeRepository.zone().getCloud().dynamicProvisioning(); boolean allocateFully = dynamicProvisioningEnabled && preprovisionCapacityFlag.value().isEmpty(); // Try preparing in memory without global unallocated lock. Most of the time there should be no changes and we diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java index ad892054836..a11582e1151 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.util.Locale; @@ -61,7 +62,7 @@ public class NodeResourceLimits { } private double minAdvertisedVcpu(ClusterSpec.Type clusterType) { - if (zone().environment() == Environment.dev && !zone().getCloud().dynamicProvisioning()) return 0.1; + if (zone().environment() == Environment.dev && zone().getCloud().allowHostSharing()) return 0.1; return 0.5; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 0509ccc81c1..042b4aa049c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -58,7 +58,7 @@ public class MockNodeRepository extends NodeRepository { */ public MockNodeRepository(MockCurator curator, NodeFlavors flavors) { super(flavors, - new EmptyProvisionServiceProvider(), + new EmptyProvisionServiceProvider().getHostResourcesCalculator(), curator, Clock.fixed(Instant.ofEpochMilli(123), ZoneId.of("Z")), Zone.defaultZone(), @@ -66,6 +66,7 @@ public class MockNodeRepository extends NodeRepository { DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), new InMemoryFlagSource(), true, + false, 0, 1000); this.flavors = flavors; |