summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-10-17 11:13:51 +0200
committerJon Bratseth <bratseth@verizonmedia.com>2019-10-17 11:13:51 +0200
commit15c2736314ff5c94a695124ab271f1e046060029 (patch)
tree7714fc64b73ff7576c544237b16372f84a815fc6 /node-repository
parentec278bedb5a787309d11d356018ad5e2afc0862a (diff)
Refactor: Skew computation independent of node prioritization
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java29
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostResourcesCalculator.java1
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java29
5 files changed, 43 insertions, 27 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
index fa439e50fbd..3d502d2b3da 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
@@ -16,6 +16,7 @@ import com.yahoo.vespa.hosted.provision.node.Reports;
import com.yahoo.vespa.hosted.provision.node.Status;
import java.time.Instant;
+import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -332,6 +333,19 @@ public final class Node {
}
}
+ /** Computes the allocation skew of a host node */
+ public static double skew(NodeResources totalHostCapacity, NodeResources freeHostCapacity) {
+ NodeResources all = totalHostCapacity.anySpeed();
+ NodeResources allocated = all.subtract(freeHostCapacity.anySpeed());
+
+ return new Mean(allocated.vcpu() / all.vcpu(),
+ allocated.memoryGb() / all.memoryGb(),
+ allocated.diskGb() / all.diskGb())
+ .deviation();
+ }
+
+
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -389,4 +403,19 @@ public final class Node {
}
}
+ /** The mean and mean deviation (squared difference) of a bunch of numbers */
+ private static class Mean {
+
+ private final double mean;
+ private final double deviation;
+
+ private Mean(double ... numbers) {
+ mean = Arrays.stream(numbers).sum() / numbers.length;
+ deviation = Arrays.stream(numbers).map(n -> Math.pow(mean - n, 2)).sum() / numbers.length;
+ }
+
+ public double deviation() { return deviation; }
+
+ }
+
}
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
new file mode 100644
index 00000000000..d2158dd08db
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/Rebalancer.java
@@ -0,0 +1,5 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision.maintenance;
+
+public class Rebalancer {
+}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java
index 4eea36c342a..112f118705b 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java
@@ -26,6 +26,12 @@ public class DockerHostCapacity {
this.hostResourcesCalculator = Objects.requireNonNull(hostResourcesCalculator, "hostResourcesCalculator must be non-null");
}
+ /** Returns the allocation skew of this host */
+ public double skew(Node host) {
+ NodeResources free = freeCapacityOf(host, false);
+ return Node.skew(host.flavor().resources(), free);
+ }
+
int compareWithoutInactive(Node hostA, Node hostB) {
int result = compare(freeCapacityOf(hostB, true), freeCapacityOf(hostA, true));
if (result != 0) return result;
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 50aeb464e9f..c5808a53837 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
@@ -10,4 +10,5 @@ public interface HostResourcesCalculator {
/** Calculates the resources that are reserved for host level processes and returns the remainder. */
NodeResources availableCapacityOf(NodeResources hostResources);
+
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java
index d53e36b7501..d6ac5eb2c57 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/PrioritizableNode.java
@@ -117,18 +117,8 @@ class PrioritizableNode implements Comparable<PrioritizableNode> {
private double skewWith(NodeResources resources) {
if (parent.isEmpty()) return 0;
- NodeResources all = anySpeed(parent.get().flavor().resources());
- NodeResources allocated = all.subtract(anySpeed(freeParentCapacity)).add(anySpeed(resources));
-
- return new Mean(allocated.vcpu() / all.vcpu(),
- allocated.memoryGb() / all.memoryGb(),
- allocated.diskGb() / all.diskGb())
- .deviation();
- }
-
- /** We don't care about disk speed in calculations here */
- private NodeResources anySpeed(NodeResources resources) {
- return resources.withDiskSpeed(NodeResources.DiskSpeed.any);
+ NodeResources free = freeParentCapacity.anySpeed().subtract(resources.anySpeed());
+ return Node.skew(parent.get().flavor().resources(), free);
}
private boolean isInNodeRepoAndReserved() {
@@ -186,19 +176,4 @@ class PrioritizableNode implements Comparable<PrioritizableNode> {
}
}
- /** The mean and mean deviation (squared difference) of a bunch of numbers */
- private static class Mean {
-
- private final double mean;
- private final double deviation;
-
- private Mean(double ... numbers) {
- mean = Arrays.stream(numbers).sum() / numbers.length;
- deviation = Arrays.stream(numbers).map(n -> Math.pow(mean - n, 2)).sum() / numbers.length;
- }
-
- public double deviation() { return deviation; }
-
- }
-
}