aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@vespa.ai>2024-05-12 18:12:02 +0200
committerJon Bratseth <bratseth@vespa.ai>2024-05-12 18:12:02 +0200
commit7783175c9a82f175f589610e0cdf61ccc3c993db (patch)
tree64123bb7f336254f14069d34f81586ad158768eb /node-repository/src/main/java/com
parent2721b3e11d361a01e36cc4030792d3daea01c740 (diff)
Move exclusivity decisions to config-provisioning
Diffstat (limited to 'node-repository/src/main/java/com')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java36
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableResources.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainer.java8
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java2
11 files changed, 29 insertions, 47 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 539f3128091..06528ef557e 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
@@ -5,24 +5,20 @@ import com.yahoo.component.AbstractComponent;
import com.yahoo.component.annotation.Inject;
import com.yahoo.concurrent.maintenance.JobControl;
import com.yahoo.config.provision.ApplicationTransaction;
-import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.EndpointsChecker.HealthChecker;
import com.yahoo.config.provision.EndpointsChecker.HealthCheckerProvider;
+import com.yahoo.config.provision.Exclusivity;
import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.Zone;
import com.yahoo.config.provisioning.NodeRepositoryConfig;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.flags.FlagSource;
-import com.yahoo.vespa.flags.JacksonFlag;
-import com.yahoo.vespa.flags.PermanentFlags;
-import com.yahoo.vespa.flags.custom.SharedHost;
import com.yahoo.vespa.hosted.provision.Node.State;
import com.yahoo.vespa.hosted.provision.applications.Applications;
import com.yahoo.vespa.hosted.provision.archive.ArchiveUriManager;
import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancer;
-import com.yahoo.vespa.hosted.provision.lb.LoadBalancerInstance;
import com.yahoo.vespa.hosted.provision.lb.LoadBalancers;
import com.yahoo.vespa.hosted.provision.maintenance.InfrastructureVersions;
import com.yahoo.vespa.hosted.provision.node.Agent;
@@ -55,6 +51,7 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
private final CuratorDb db;
private final Clock clock;
private final Zone zone;
+ private final Exclusivity exclusivity;
private final Nodes nodes;
private final NodeFlavors flavors;
private final HostResourcesCalculator resourcesCalculator;
@@ -73,7 +70,6 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
private final Orchestrator orchestrator;
private final int spareCount;
private final ProtoHealthChecker healthChecker;
- private final JacksonFlag<SharedHost> sharedHosts;
/**
* Creates a node repository from a zookeeper provider.
@@ -85,6 +81,7 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
ProvisionServiceProvider provisionServiceProvider,
Curator curator,
Zone zone,
+ Exclusivity exclusivity,
FlagSource flagSource,
MetricsDb metricsDb,
Orchestrator orchestrator) {
@@ -93,6 +90,7 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
curator,
Clock.systemUTC(),
zone,
+ exclusivity,
new DnsNameResolver(),
DockerImage.fromString(config.containerImage()),
optionalImage(config.tenantContainerImage()),
@@ -113,6 +111,7 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
Curator curator,
Clock clock,
Zone zone,
+ Exclusivity exclusivity,
NameResolver nameResolver,
DockerImage containerImage,
Optional<DockerImage> tenantContainerImage,
@@ -129,8 +128,9 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
this.flagSource = flagSource;
this.db = new CuratorDb(flavors, curator, clock, useCuratorClientCache);
- this.zone = zone;
this.clock = clock;
+ this.zone = zone;
+ this.exclusivity = exclusivity;
this.applications = new Applications(db);
this.nodes = new Nodes(db, zone, clock, orchestrator, applications);
this.flavors = flavors;
@@ -147,7 +147,6 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
this.metricsDb = metricsDb;
this.orchestrator = orchestrator;
this.spareCount = spareCount;
- this.sharedHosts = PermanentFlags.SHARED_HOST.bindTo(flagSource());
this.healthChecker = provisionServiceProvider.getHealthChecker();
nodes.rewrite();
}
@@ -208,26 +207,7 @@ public class NodeRepository extends AbstractComponent implements HealthCheckerPr
/** The number of nodes we should ensure has free capacity for node failures whenever possible */
public int spareCount() { return spareCount; }
- /** Returns whether nodes must be allocated to hosts that are exclusive to the cluster type. */
- public boolean exclusiveClusterType(ClusterSpec cluster) {
- return sharedHosts.value().hasClusterType(cluster.type().name());
- }
-
- /**
- * Returns whether nodes are allocated exclusively in this instance given this cluster spec.
- * Exclusive allocation requires that the wanted node resources matches the advertised resources of the node
- * perfectly.
- */
- public boolean exclusiveAllocation(ClusterSpec clusterSpec) {
- return clusterSpec.isExclusive() ||
- ( clusterSpec.type().isContainer() && zone.system().isPublic() && !zone.environment().isTest() ) ||
- ( !zone().cloud().allowHostSharing() && !sharedHosts.value().supportsClusterType(clusterSpec.type().name()));
- }
-
- /** Whether the nodes of this cluster must be running on hosts that are specifically provisioned for the application. */
- public boolean exclusiveProvisioning(ClusterSpec clusterSpec) {
- return !zone.cloud().allowHostSharing() && clusterSpec.isExclusive();
- }
+ public Exclusivity exclusiveAllocation() { return exclusivity; }
/**
* Returns ACLs for the children of the given host.
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableResources.java
index 75a00fa951e..9ac9ffcf29a 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableResources.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableResources.java
@@ -41,7 +41,7 @@ public class AllocatableResources {
this.nodes = requested.nodes();
this.groups = requested.groups();
this.realResources = nodeRepository.resourcesCalculator().requestToReal(requested.nodeResources(), cloudAccount,
- nodeRepository.exclusiveAllocation(clusterSpec), false);
+ nodeRepository.exclusiveAllocation().allocation(clusterSpec), false);
this.advertisedResources = requested.nodeResources();
this.clusterSpec = clusterSpec;
this.fulfilment = 1;
@@ -178,7 +178,7 @@ public class AllocatableResources {
ClusterModel model,
NodeRepository nodeRepository) {
var systemLimits = nodeRepository.nodeResourceLimits();
- boolean exclusive = nodeRepository.exclusiveAllocation(clusterSpec);
+ boolean exclusive = nodeRepository.exclusiveAllocation().allocation(clusterSpec);
if (! exclusive) {
// We decide resources: Add overhead to what we'll request (advertised) to make sure real becomes (at least) cappedNodeResources
var allocatableResources = calculateAllocatableResources(wantedResources,
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java
index 61d4ced1367..da5c99a7f68 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocationOptimizer.java
@@ -95,7 +95,7 @@ public class AllocationOptimizer {
/** Returns the max resources of a host one node may allocate. */
private NodeResources maxResourcesOf(NodeResources hostResources, ClusterModel model) {
- if (nodeRepository.exclusiveAllocation(model.clusterSpec())) return hostResources;
+ if (nodeRepository.exclusiveAllocation().allocation(model.clusterSpec())) return hostResources;
// static, shared hosts: Allocate at most half of the host cpu to simplify management
return hostResources.withVcpu(hostResources.vcpu() / 2);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java
index 74907feee41..5132597a373 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/ClusterModel.java
@@ -171,7 +171,7 @@ public class ClusterModel {
}
public boolean isExclusive() {
- return nodeRepository.exclusiveAllocation(clusterSpec);
+ return nodeRepository.exclusiveAllocation().allocation(clusterSpec);
}
/** Returns the relative load adjustment that should be made to this cluster given available measurements. */
@@ -441,7 +441,7 @@ public class ClusterModel {
application.id());
return nodeRepository.resourcesCalculator().requestToReal(initialResources,
cloudAccount(),
- nodeRepository.exclusiveAllocation(clusterSpec),
+ nodeRepository.exclusiveAllocation().allocation(clusterSpec),
false).memoryGb();
}
else {
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainer.java
index 98f0dfebc4a..5628c341bbe 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainer.java
@@ -223,7 +223,7 @@ public class HostCapacityMaintainer extends NodeRepositoryMaintainer {
}
Version osVersion = nodeRepository().osVersions().targetFor(NodeType.host).orElse(Version.emptyVersion);
List<Integer> provisionIndices = nodeRepository().database().readProvisionIndices(count);
- HostSharing sharingMode = nodeRepository().exclusiveAllocation(asSpec(clusterType, 0)) ? HostSharing.exclusive : HostSharing.shared;
+ HostSharing sharingMode = nodeRepository().exclusiveAllocation().allocation(asSpec(clusterType, 0)) ? HostSharing.exclusive : HostSharing.shared;
HostProvisionRequest request = new HostProvisionRequest(provisionIndices, NodeType.host, nodeResources,
ApplicationId.defaultId(), osVersion,
sharingMode, clusterType.map(ClusterSpec.Type::valueOf), Optional.empty(),
@@ -290,13 +290,13 @@ public class HostCapacityMaintainer extends NodeRepositoryMaintainer {
NodePrioritizer prioritizer = new NodePrioritizer(allNodes, application, cluster, nodeSpec,
true, false, allocationContext, nodeRepository().nodes(),
nodeRepository().resourcesCalculator(), nodeRepository().spareCount(),
- nodeRepository().exclusiveAllocation(cluster));
+ nodeRepository().exclusiveAllocation().allocation(cluster));
List<NodeCandidate> nodeCandidates = prioritizer.collect()
.stream()
.filter(node -> node.violatesExclusivity(cluster,
application,
- nodeRepository().exclusiveClusterType(cluster),
- nodeRepository().exclusiveAllocation(cluster),
+ nodeRepository().exclusiveAllocation().clusterType(cluster),
+ nodeRepository().exclusiveAllocation().allocation(cluster),
false,
nodeRepository().zone().cloud().allowHostSharing(),
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 46dfb51a433..de38ae0d861 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
@@ -106,7 +106,7 @@ public class CapacityPolicies {
if (clusterSpec.type() == ClusterSpec.Type.admin) {
Architecture architecture = adminClusterArchitecture(applicationId);
- if (nodeRepository.exclusiveAllocation(clusterSpec)) {
+ if (nodeRepository.exclusiveAllocation().allocation(clusterSpec)) {
return smallestExclusiveResources().with(architecture);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
index b149a9af2c2..52a8bbfcf2c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
@@ -206,9 +206,9 @@ class NodeAllocation {
private NodeCandidate.ExclusivityViolation violatesExclusivity(NodeCandidate candidate) {
return candidate.violatesExclusivity(cluster, application,
- nodeRepository.exclusiveClusterType(cluster),
- nodeRepository.exclusiveAllocation(cluster),
- nodeRepository.exclusiveProvisioning(cluster),
+ nodeRepository.exclusiveAllocation().clusterType(cluster),
+ nodeRepository.exclusiveAllocation().allocation(cluster),
+ nodeRepository.exclusiveAllocation().provisioning(cluster),
nodeRepository.zone().cloud().allowHostSharing(), allNodes);
}
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 7ac80dfbdb3..44d667954f0 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
@@ -278,7 +278,7 @@ public class NodeRepositoryProvisioner implements Provisioner {
private IllegalArgumentException newNoAllocationPossible(ClusterSpec spec, Limits limits) {
StringBuilder message = new StringBuilder("No allocation possible within ").append(limits);
- if (nodeRepository.exclusiveAllocation(spec) && findNearestNodeResources(limits).isPresent())
+ if (nodeRepository.exclusiveAllocation().allocation(spec) && findNearestNodeResources(limits).isPresent())
message.append(". Nearest allowed node resources: ").append(findNearestNodeResources(limits).get());
return new IllegalArgumentException(message.toString());
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 194207ca69d..a085d0a2e68 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
@@ -27,7 +27,7 @@ public class NodeResourceLimits {
/** Validates the resources applications ask for (which are in "advertised" resource space) */
public void ensureWithinAdvertisedLimits(String type, NodeResources requested, ClusterSpec cluster) {
- boolean exclusive = nodeRepository.exclusiveAllocation(cluster);
+ boolean exclusive = nodeRepository.exclusiveAllocation().allocation(cluster);
if (! requested.vcpuIsUnspecified() && requested.vcpu() < minAdvertisedVcpu(cluster, exclusive))
illegal(type, "vcpu", "", cluster, requested.vcpu(), minAdvertisedVcpu(cluster, exclusive));
if (! requested.memoryGbIsUnspecified() && requested.memoryGb() < minAdvertisedMemoryGb(cluster, exclusive))
@@ -104,7 +104,7 @@ public class NodeResourceLimits {
}
private double minRealVcpu(ClusterSpec cluster) {
- return minAdvertisedVcpu(cluster, nodeRepository.exclusiveAllocation(cluster));
+ return minAdvertisedVcpu(cluster, nodeRepository.exclusiveAllocation().allocation(cluster));
}
private static double minRealMemoryGb(ClusterSpec cluster) {
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java
index 0206c3a4a26..dedd023b0e6 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Preparer.java
@@ -202,7 +202,7 @@ public class Preparer {
nodeRepository.nodes(),
nodeRepository.resourcesCalculator(),
nodeRepository.spareCount(),
- nodeRepository.exclusiveAllocation(cluster));
+ nodeRepository.exclusiveAllocation().allocation(cluster));
allocation.offer(prioritizer.collect());
if (requested.type() == NodeType.tenant && !requested.canFail() && allocation.changes()) {
// This should not happen and indicates a bug in the allocation code because boostrap redeployment
@@ -237,8 +237,8 @@ public class Preparer {
private HostSharing hostSharing(ClusterSpec cluster, NodeType hostType) {
if ( hostType.isSharable())
- return nodeRepository.exclusiveProvisioning(cluster) ? HostSharing.provision :
- nodeRepository.exclusiveAllocation(cluster) ? HostSharing.exclusive :
+ return nodeRepository.exclusiveAllocation().provisioning(cluster) ? HostSharing.provision :
+ nodeRepository.exclusiveAllocation().allocation(cluster) ? HostSharing.exclusive :
HostSharing.any;
else
return HostSharing.any;
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 9d9771b3b0f..17b7dd6c307 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
@@ -12,6 +12,7 @@ import com.yahoo.config.provision.ClusterInfo;
import com.yahoo.config.provision.ClusterResources;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.DockerImage;
+import com.yahoo.config.provision.Exclusivity;
import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.HostSpec;
import com.yahoo.config.provision.InstanceName;
@@ -90,6 +91,7 @@ public class MockNodeRepository extends NodeRepository {
curator,
Clock.fixed(Instant.ofEpochMilli(123), ZoneId.of("Z")),
zone,
+ new Exclusivity(zone, new InMemoryFlagSource()),
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"),
Optional.empty(),