diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-11-06 09:25:01 +0100 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2020-11-06 09:25:01 +0100 |
commit | afafb10b310001a46a9ae7a0d7c95530ea3ba71f (patch) | |
tree | 9b8561314430fc909e8e71774304d5cbed9cff60 /node-repository/src/main/java | |
parent | a65780d57302eaf5a5791068e233f781e35d4401 (diff) |
Use exclusive parameter in HostResourcesCalculator
Diffstat (limited to 'node-repository/src/main/java')
7 files changed, 29 insertions, 29 deletions
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 7a505d398fb..b1213b2da41 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 @@ -43,10 +43,10 @@ public class AllocatableClusterResources { this.fulfilment = 1; } - public AllocatableClusterResources(List<Node> nodes, NodeRepository nodeRepository) { + public AllocatableClusterResources(List<Node> nodes, NodeRepository nodeRepository, boolean exclusive) { this.nodes = nodes.size(); this.groups = (int)nodes.stream().map(node -> node.allocation().get().membership().cluster().group()).distinct().count(); - this.realResources = averageRealResourcesOf(nodes, nodeRepository); // Average since we average metrics over nodes + this.realResources = averageRealResourcesOf(nodes, nodeRepository, exclusive); // Average since we average metrics over nodes this.advertisedResources = nodes.get(0).resources(); this.clusterType = nodes.get(0).allocation().get().membership().cluster().type(); this.fulfilment = 1; @@ -121,10 +121,10 @@ public class AllocatableClusterResources { (fulfilment < 1.0 ? " (fulfilment " + fulfilment + ")" : ""); } - private static NodeResources averageRealResourcesOf(List<Node> nodes, NodeRepository nodeRepository) { + private static NodeResources averageRealResourcesOf(List<Node> nodes, NodeRepository nodeRepository, boolean exclusive) { NodeResources sum = new NodeResources(0, 0, 0, 0); for (Node node : nodes) - sum = sum.add(nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository).justNumbers()); + sum = sum.add(nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository, exclusive).justNumbers()); return nodes.get(0).resources().justNonNumbers() .withVcpu(sum.vcpu() / nodes.size()) .withMemoryGb(sum.memoryGb() / nodes.size()) @@ -140,8 +140,8 @@ public class AllocatableClusterResources { var systemLimits = new NodeResourceLimits(nodeRepository); if ( !exclusive && !nodeRepository.zone().getCloud().dynamicProvisioning()) { // 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 + NodeResources advertisedResources = nodeRepository.resourcesCalculator().realToRequest(wantedResources.nodeResources(), exclusive); + advertisedResources = systemLimits.enlargeToLegal(advertisedResources, clusterType, exclusive); // Attempt to ask for something legal advertisedResources = applicationLimits.cap(advertisedResources); // Overrides other conditions, even if it will then fail NodeResources realResources = nodeRepository.resourcesCalculator().requestToReal(advertisedResources, exclusive); // ... thus, what we really get may change if ( ! systemLimits.isWithinRealLimits(realResources, clusterType)) return Optional.empty(); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index e87109200df..0db4c37b154 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -59,7 +59,7 @@ public class Autoscaler { private Advice autoscale(Cluster cluster, List<Node> clusterNodes, Limits limits, boolean exclusive) { if (unstable(clusterNodes, nodeRepository)) return Advice.none(); - AllocatableClusterResources currentAllocation = new AllocatableClusterResources(clusterNodes, nodeRepository); + AllocatableClusterResources currentAllocation = new AllocatableClusterResources(clusterNodes, nodeRepository, cluster.exclusive()); ClusterTimeseries clusterTimeseries = new ClusterTimeseries(cluster, clusterNodes, metricsDb, nodeRepository); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java index 67758dc13b2..f7e2283dd95 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainer.java @@ -73,7 +73,7 @@ public class AutoscalingMaintainer extends NodeRepositoryMaintainer { if ( ! cluster.get().targetResources().equals(advice.target())) { applications().put(application.with(cluster.get().withTarget(advice.target())), deployment.applicationLock().get()); if (advice.target().isPresent()) { - logAutoscaling(advice.target().get(), applicationId, clusterId, clusterNodes); + logAutoscaling(advice.target().get(), applicationId, cluster.get(), clusterNodes); deployment.activate(); } } @@ -85,11 +85,11 @@ public class AutoscalingMaintainer extends NodeRepositoryMaintainer { private void logAutoscaling(ClusterResources target, ApplicationId application, - ClusterSpec.Id clusterId, + Cluster cluster, List<Node> clusterNodes) { - ClusterResources current = new AllocatableClusterResources(clusterNodes, nodeRepository()).toAdvertisedClusterResources(); + ClusterResources current = new AllocatableClusterResources(clusterNodes, nodeRepository(), cluster.exclusive()).toAdvertisedClusterResources(); ClusterSpec.Type clusterType = clusterNodes.get(0).allocation().get().membership().cluster().type(); - log.info("Autoscaling " + application + " " + clusterType + " " + clusterId + ":" + + log.info("Autoscaling " + application + " " + clusterType + " " + cluster.id() + ":" + "\nfrom " + toString(current) + "\nto " + toString(target)); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/EmptyProvisionServiceProvider.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/EmptyProvisionServiceProvider.java index 9b2a67da1c1..49e1dfa8c8f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/EmptyProvisionServiceProvider.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/EmptyProvisionServiceProvider.java @@ -35,7 +35,7 @@ public class EmptyProvisionServiceProvider implements ProvisionServiceProvider { private static class IdentityHostResourcesCalculator implements HostResourcesCalculator { @Override - public NodeResources realResourcesOf(Nodelike node, NodeRepository repository) { return node.resources(); } + public NodeResources realResourcesOf(Nodelike node, NodeRepository repository, boolean exclusive) { return node.resources(); } @Override public NodeResources advertisedResourcesOf(Flavor flavor) { return flavor.resources(); } @@ -44,10 +44,10 @@ public class EmptyProvisionServiceProvider implements ProvisionServiceProvider { public NodeResources requestToReal(NodeResources resources, boolean exclusive) { return resources; } @Override - public NodeResources realToRequest(NodeResources resources) { return resources; } + public NodeResources realToRequest(NodeResources resources, boolean exclusive) { return resources; } @Override - public long thinPoolSizeInBase2Gb(NodeType nodeType) { return 0; } + public long thinPoolSizeInBase2Gb(NodeType nodeType, boolean sharedHost) { return 0; } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java index d62960f5426..70c4170f0f4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java @@ -18,7 +18,7 @@ import com.yahoo.vespa.hosted.provision.Nodelike; public interface HostResourcesCalculator { /** Returns the real resources available on a node */ - NodeResources realResourcesOf(Nodelike node, NodeRepository nodeRepository); + NodeResources realResourcesOf(Nodelike node, NodeRepository nodeRepository, boolean exclusive); /** Returns the advertised resources of a flavor */ NodeResources advertisedResourcesOf(Flavor flavor); @@ -33,11 +33,11 @@ public interface HostResourcesCalculator { * Used with shared hosts: * Returns the advertised resources we need to request to be sure to get at least the given real resources. */ - NodeResources realToRequest(NodeResources realResources); + NodeResources realToRequest(NodeResources realResources, boolean exclusive); /** * Returns the needed thin pool size in base2 Gb. */ - long thinPoolSizeInBase2Gb(NodeType nodeType); + long thinPoolSizeInBase2Gb(NodeType nodeType, boolean sharedHost); } 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 731090b9cc7..edf151ff2d8 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 @@ -102,7 +102,7 @@ public class NodeRepositoryProvisioner implements Provisioner { int groups; NodeResources resources; NodeSpec nodeSpec; - if ( requested.type() == NodeType.tenant) { + if (requested.type() == NodeType.tenant) { ClusterResources target = decideTargetResources(application, cluster, requested); int nodeCount = capacityPolicies.decideSize(target.nodes(), requested, cluster, application); groups = Math.min(target.groups(), nodeCount); // cannot have more groups than nodes @@ -168,7 +168,7 @@ public class NodeRepositoryProvisioner implements Provisioner { AllocatableClusterResources currentResources = firstDeployment // start at min, preserve current resources otherwise ? new AllocatableClusterResources(requested.minResources(), clusterSpec.type(), clusterSpec.isExclusive(), nodeRepository) - : new AllocatableClusterResources(nodes, nodeRepository); + : new AllocatableClusterResources(nodes, nodeRepository, clusterSpec.isExclusive()); return within(Limits.of(requested), clusterSpec.isExclusive(), currentResources, firstDeployment); } @@ -211,7 +211,7 @@ public class NodeRepositoryProvisioner implements Provisioner { log.log(Level.FINE, () -> "Prepared node " + node.hostname() + " - " + node.flavor()); Allocation nodeAllocation = node.allocation().orElseThrow(IllegalStateException::new); hosts.add(new HostSpec(node.hostname(), - nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository), + nodeRepository.resourcesCalculator().realResourcesOf(node, nodeRepository, node.allocation().get().membership().cluster().isExclusive()), node.flavor().resources(), requestedResources, nodeAllocation.membership(), 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 0a758ee585b..e60929a34dd 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 @@ -33,13 +33,13 @@ public class NodeResourceLimits { illegal(type, "vcpu", "", cluster, requested.vcpu(), minAdvertisedVcpu()); if (requested.memoryGb() < minAdvertisedMemoryGb(cluster.type())) illegal(type, "memoryGb", "Gb", cluster, requested.memoryGb(), minAdvertisedMemoryGb(cluster.type())); - if (requested.diskGb() < minAdvertisedDiskGb(requested)) - illegal(type, "diskGb", "Gb", cluster, requested.diskGb(), minAdvertisedDiskGb(requested)); + if (requested.diskGb() < minAdvertisedDiskGb(requested, cluster.isExclusive())) + illegal(type, "diskGb", "Gb", cluster, requested.diskGb(), minAdvertisedDiskGb(requested, cluster.isExclusive())); } /** Returns whether the real resources we'll end up with on a given tenant node are within limits */ public boolean isWithinRealLimits(NodeCandidate candidateNode, ClusterSpec cluster) { - return isWithinRealLimits(nodeRepository.resourcesCalculator().realResourcesOf(candidateNode, nodeRepository), + return isWithinRealLimits(nodeRepository.resourcesCalculator().realResourcesOf(candidateNode, nodeRepository, cluster.isExclusive()), cluster.type()); } @@ -53,12 +53,12 @@ public class NodeResourceLimits { return true; } - public NodeResources enlargeToLegal(NodeResources requested, ClusterSpec.Type clusterType) { + public NodeResources enlargeToLegal(NodeResources requested, ClusterSpec.Type clusterType, boolean exclusive) { if (requested.isUnspecified()) return requested; return requested.withVcpu(Math.max(minAdvertisedVcpu(), requested.vcpu())) .withMemoryGb(Math.max(minAdvertisedMemoryGb(clusterType), requested.memoryGb())) - .withDiskGb(Math.max(minAdvertisedDiskGb(requested), requested.diskGb())); + .withDiskGb(Math.max(minAdvertisedDiskGb(requested, exclusive), requested.diskGb())); } private double minAdvertisedVcpu() { @@ -72,14 +72,14 @@ public class NodeResourceLimits { return 4; } - private double minAdvertisedDiskGb(NodeResources requested) { - return minRealDiskGb() + getThinPoolSize(requested.storageType()); + private double minAdvertisedDiskGb(NodeResources requested, boolean exclusive) { + return minRealDiskGb() + getThinPoolSize(requested.storageType(), exclusive); } // Note: Assumes node type 'host' - private long getThinPoolSize(NodeResources.StorageType storageType) { + private long getThinPoolSize(NodeResources.StorageType storageType, boolean exclusive) { if (storageType == NodeResources.StorageType.local && zone().getCloud().dynamicProvisioning()) - return nodeRepository.resourcesCalculator().thinPoolSizeInBase2Gb(NodeType.host); + return nodeRepository.resourcesCalculator().thinPoolSizeInBase2Gb(NodeType.host, ! exclusive); else return 4; } |