You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2016/04/12 20:28:12 UTC
aurora git commit: Removing ResourceVector enum in favor of
ResourceType
Repository: aurora
Updated Branches:
refs/heads/master a4853a43f -> 3cb599e1c
Removing ResourceVector enum in favor of ResourceType
Reviewed at https://reviews.apache.org/r/46064/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/3cb599e1
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/3cb599e1
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/3cb599e1
Branch: refs/heads/master
Commit: 3cb599e1ce6bfcfe9120f5965e2499778bad459a
Parents: a4853a4
Author: Maxim Khutornenko <ma...@apache.org>
Authored: Tue Apr 12 11:27:57 2016 -0700
Committer: Maxim Khutornenko <ma...@apache.org>
Committed: Tue Apr 12 11:27:57 2016 -0700
----------------------------------------------------------------------
.../scheduler/filter/SchedulingFilterImpl.java | 74 +++++---------------
.../scheduler/resources/ResourceType.java | 71 ++++++++++++++++---
.../filter/SchedulingFilterImplTest.java | 35 +++++----
3 files changed, 103 insertions(+), 77 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/3cb599e1/src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java b/src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java
index f8c57f9..6b5b12b 100644
--- a/src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java
+++ b/src/main/java/org/apache/aurora/scheduler/filter/SchedulingFilterImpl.java
@@ -25,13 +25,13 @@ import com.google.common.collect.Ordering;
import com.google.inject.Inject;
import org.apache.aurora.common.inject.TimedInterceptor.Timed;
-import org.apache.aurora.common.quantity.Amount;
import org.apache.aurora.common.quantity.Data;
import org.apache.aurora.gen.MaintenanceMode;
import org.apache.aurora.gen.TaskConstraint;
import org.apache.aurora.scheduler.configuration.ConfigurationManager;
import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
import org.apache.aurora.scheduler.resources.ResourceSlot;
+import org.apache.aurora.scheduler.resources.ResourceType;
import org.apache.aurora.scheduler.storage.entities.IAttribute;
import org.apache.aurora.scheduler.storage.entities.IConstraint;
import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
@@ -41,80 +41,44 @@ import static java.util.Objects.requireNonNull;
import static org.apache.aurora.gen.MaintenanceMode.DRAINED;
import static org.apache.aurora.gen.MaintenanceMode.DRAINING;
import static org.apache.aurora.scheduler.configuration.ConfigurationManager.DEDICATED_ATTRIBUTE;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.CPU;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.DISK;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.PORTS;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.RAM;
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
+import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
/**
* Implementation of the scheduling filter that ensures resource requirements of tasks are
* fulfilled, and that tasks are allowed to run on the given machine.
*/
public class SchedulingFilterImpl implements SchedulingFilter {
- private static final Optional<Veto> NO_VETO = Optional.absent();
-
private static final Set<MaintenanceMode> VETO_MODES = EnumSet.of(DRAINING, DRAINED);
- // Scaling ranges to use for comparison of vetos. This has no real bearing besides trying to
- // determine if a veto along one resource vector is a 'stronger' veto than that of another vector.
- // The values below represent the maximum resources on a typical slave machine.
@VisibleForTesting
- enum ResourceVector {
- CPU("CPU", 16),
- RAM("RAM", Amount.of(24, Data.GB).as(Data.MB)),
- DISK("disk", Amount.of(450, Data.GB).as(Data.MB)),
- PORTS("ports", 1000);
-
- private final String name;
- private final int range;
- @VisibleForTesting
- int getRange() {
- return range;
- }
-
- ResourceVector(String name, int range) {
- this.name = name;
- this.range = range;
- }
-
- Optional<Veto> maybeVeto(double available, double requested) {
- double tooLarge = requested - available;
- if (tooLarge <= 0) {
- return NO_VETO;
- } else {
- return Optional.of(veto(tooLarge));
- }
- }
-
- private static int scale(double value, int range) {
- return Math.min(
- VetoType.INSUFFICIENT_RESOURCES.getScore(),
- (int) (VetoType.INSUFFICIENT_RESOURCES.getScore() * value) / range);
- }
-
- @VisibleForTesting
- Veto veto(double excess) {
- return Veto.insufficientResources(name, scale(excess, range));
- }
+ static int scale(double value, int range) {
+ return Math.min(
+ VetoType.INSUFFICIENT_RESOURCES.getScore(),
+ (int) (VetoType.INSUFFICIENT_RESOURCES.getScore() * value) / range);
}
private static void maybeAddVeto(
ImmutableSet.Builder<Veto> vetoes,
- ResourceVector vector,
+ ResourceType resourceType,
double available,
double requested) {
- Optional<Veto> veto = vector.maybeVeto(available, requested);
- if (veto.isPresent()) {
- vetoes.add(veto.get());
+ double tooLarge = requested - available;
+ if (tooLarge > 0) {
+ vetoes.add(Veto.insufficientResources(
+ resourceType.getAuroraName(),
+ scale(tooLarge, resourceType.getScalingRange())));
}
}
private static Set<Veto> getResourceVetoes(ResourceSlot available, ResourceSlot required) {
ImmutableSet.Builder<Veto> vetoes = ImmutableSet.builder();
- maybeAddVeto(vetoes, CPU, available.getNumCpus(), required.getNumCpus());
- maybeAddVeto(vetoes, RAM, available.getRam().as(Data.MB), required.getRam().as(Data.MB));
- maybeAddVeto(vetoes, DISK, available.getDisk().as(Data.MB), required.getDisk().as(Data.MB));
+ maybeAddVeto(vetoes, CPUS, available.getNumCpus(), required.getNumCpus());
+ maybeAddVeto(vetoes, RAM_MB, available.getRam().as(Data.MB), required.getRam().as(Data.MB));
+ maybeAddVeto(vetoes, DISK_MB, available.getDisk().as(Data.MB), required.getDisk().as(Data.MB));
maybeAddVeto(vetoes, PORTS, available.getNumPorts(), required.getNumPorts());
return vetoes.build();
}
@@ -161,7 +125,7 @@ public class SchedulingFilterImpl implements SchedulingFilter {
private Optional<Veto> getMaintenanceVeto(MaintenanceMode mode) {
return VETO_MODES.contains(mode)
? Optional.of(Veto.maintenance(mode.toString().toLowerCase()))
- : NO_VETO;
+ : Optional.absent();
}
private boolean isDedicated(IHostAttributes attributes) {
http://git-wip-us.apache.org/repos/asf/aurora/blob/3cb599e1/src/main/java/org/apache/aurora/scheduler/resources/ResourceType.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/ResourceType.java b/src/main/java/org/apache/aurora/scheduler/resources/ResourceType.java
index fc9b10b..b6fc949 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/ResourceType.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/ResourceType.java
@@ -15,40 +15,93 @@ package org.apache.aurora.scheduler.resources;
import com.google.common.annotations.VisibleForTesting;
+import org.apache.aurora.common.quantity.Amount;
+import org.apache.aurora.common.quantity.Data;
+
import static java.util.Objects.requireNonNull;
/**
- * Describes Mesos resource types.
+ * Describes Mesos resource types and their Aurora traits.
*/
@VisibleForTesting
public enum ResourceType {
/**
* CPU resource.
*/
- CPUS("cpus"),
+ CPUS("cpus", "CPU", 16),
/**
* RAM resource.
*/
- RAM_MB("mem"),
+ RAM_MB("mem", "RAM", Amount.of(24, Data.GB).as(Data.MB)),
/**
* DISK resource.
*/
- DISK_MB("disk"),
+ DISK_MB("disk", "disk", Amount.of(450, Data.GB).as(Data.MB)),
/**
* Port resource.
*/
- PORTS("ports");
+ PORTS("ports", "ports", 1000);
+
+ /**
+ * Mesos resource name.
+ */
+ private final String mesosName;
- private final String resourceName;
+ /**
+ * Aurora resource name.
+ */
+ private final String auroraName;
- ResourceType(String resourceName) {
- this.resourceName = requireNonNull(resourceName);
+ /**
+ * Scaling range to use for comparison of scheduling vetoes. This has no real bearing besides
+ * trying to determine if a veto along one resource vector is a 'stronger' veto than that of
+ * another vector. The value represents the typical slave machine resources.
+ */
+ private final int scalingRange;
+
+ /**
+ * Describes a Resource type.
+ *
+ * @param mesosName See {@link #getMesosName()} for more details.
+ * @param auroraName See {@link #getAuroraName()} for more details.
+ * @param scalingRange See {@link #getScalingRange()} for more details.
+ */
+ ResourceType(String mesosName, String auroraName, int scalingRange) {
+ this.mesosName = requireNonNull(mesosName);
+ this.auroraName = requireNonNull(auroraName);
+ this.scalingRange = scalingRange;
}
+ /**
+ * Gets Mesos resource name.
+ * <p>
+ * @see <a href="https://github.com/apache/mesos/blob/master/include/mesos/mesos.proto/">Mesos
+ * protobuf for more details</a>
+ *
+ * @return Mesos resource name.
+ */
public String getMesosName() {
- return resourceName;
+ return mesosName;
+ }
+
+ /**
+ * Gets resource name for internal Aurora representation (e.g. in the UI).
+ *
+ * @return Aurora resource name.
+ */
+ public String getAuroraName() {
+ return auroraName;
+ }
+
+ /**
+ * Returns scaling range for comparing scheduling vetoes.
+ *
+ * @return Resource scaling range.
+ */
+ public int getScalingRange() {
+ return scalingRange;
}
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/3cb599e1/src/test/java/org/apache/aurora/scheduler/filter/SchedulingFilterImplTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/filter/SchedulingFilterImplTest.java b/src/test/java/org/apache/aurora/scheduler/filter/SchedulingFilterImplTest.java
index 1d9d5fc..6370a12 100644
--- a/src/test/java/org/apache/aurora/scheduler/filter/SchedulingFilterImplTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/filter/SchedulingFilterImplTest.java
@@ -41,6 +41,7 @@ import org.apache.aurora.scheduler.filter.SchedulingFilter.VetoType;
import org.apache.aurora.scheduler.mesos.Offers;
import org.apache.aurora.scheduler.mesos.TaskExecutors;
import org.apache.aurora.scheduler.resources.ResourceSlot;
+import org.apache.aurora.scheduler.resources.ResourceType;
import org.apache.aurora.scheduler.resources.Resources;
import org.apache.aurora.scheduler.storage.entities.IAttribute;
import org.apache.aurora.scheduler.storage.entities.IHostAttributes;
@@ -51,10 +52,10 @@ import org.junit.Test;
import static org.apache.aurora.scheduler.configuration.ConfigurationManager.DEDICATED_ATTRIBUTE;
import static org.apache.aurora.scheduler.filter.AttributeAggregate.EMPTY;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.CPU;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.DISK;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.PORTS;
-import static org.apache.aurora.scheduler.filter.SchedulingFilterImpl.ResourceVector.RAM;
+import static org.apache.aurora.scheduler.resources.ResourceType.CPUS;
+import static org.apache.aurora.scheduler.resources.ResourceType.DISK_MB;
+import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
+import static org.apache.aurora.scheduler.resources.ResourceType.RAM_MB;
import static org.junit.Assert.assertEquals;
public class SchedulingFilterImplTest extends EasyMockTest {
@@ -133,7 +134,7 @@ public class SchedulingFilterImplTest extends EasyMockTest {
new UnusedResource(twoPorts, hostA),
new ResourceRequest(twoPortTask, EMPTY)));
assertEquals(
- ImmutableSet.of(PORTS.veto(1)),
+ ImmutableSet.of(veto(PORTS, 1)),
defaultFilter.filter(
new UnusedResource(twoPorts, hostA),
new ResourceRequest(threePortTask, EMPTY)));
@@ -147,10 +148,10 @@ public class SchedulingFilterImplTest extends EasyMockTest {
assertVetoes(
makeTask(DEFAULT_CPUS + 1, DEFAULT_RAM + 1, DEFAULT_DISK + 1),
hostA,
- CPU.veto(1), DISK.veto(1), RAM.veto(1));
- assertVetoes(makeTask(DEFAULT_CPUS + 1, DEFAULT_RAM, DEFAULT_DISK), hostA, CPU.veto(1));
- assertVetoes(makeTask(DEFAULT_CPUS, DEFAULT_RAM + 1, DEFAULT_DISK), hostA, RAM.veto(1));
- assertVetoes(makeTask(DEFAULT_CPUS, DEFAULT_RAM, DEFAULT_DISK + 1), hostA, DISK.veto(1));
+ veto(CPUS, 1), veto(DISK_MB, 1), veto(RAM_MB, 1));
+ assertVetoes(makeTask(DEFAULT_CPUS + 1, DEFAULT_RAM, DEFAULT_DISK), hostA, veto(CPUS, 1));
+ assertVetoes(makeTask(DEFAULT_CPUS, DEFAULT_RAM + 1, DEFAULT_DISK), hostA, veto(RAM_MB, 1));
+ assertVetoes(makeTask(DEFAULT_CPUS, DEFAULT_RAM, DEFAULT_DISK + 1), hostA, veto(DISK_MB, 1));
}
@Test
@@ -419,10 +420,12 @@ public class SchedulingFilterImplTest extends EasyMockTest {
control.replay();
int maxScore = VetoType.INSUFFICIENT_RESOURCES.getScore();
- assertEquals((int) (maxScore * 1.0 / CPU.getRange()), CPU.veto(1).getScore());
- assertEquals(maxScore, CPU.veto(CPU.getRange() * 10).getScore());
- assertEquals((int) (maxScore * 2.0 / RAM.getRange()), RAM.veto(2).getScore());
- assertEquals((int) (maxScore * 200.0 / DISK.getRange()), DISK.veto(200).getScore());
+ assertEquals((int) (maxScore * 1.0 / CPUS.getScalingRange()), veto(CPUS, 1).getScore());
+ assertEquals(maxScore, veto(CPUS, CPUS.getScalingRange() * 10).getScore());
+ assertEquals((int) (maxScore * 2.0 / RAM_MB.getScalingRange()), veto(RAM_MB, 2).getScore());
+ assertEquals(
+ (int) (maxScore * 200.0 / DISK_MB.getScalingRange()),
+ veto(DISK_MB, 200).getScore());
}
@Test
@@ -464,6 +467,12 @@ public class SchedulingFilterImplTest extends EasyMockTest {
Veto.unsatisfiedLimit("denied"))));
}
+ private static Veto veto(ResourceType resourceType, int excess) {
+ return Veto.insufficientResources(
+ resourceType.getAuroraName(),
+ SchedulingFilterImpl.scale(excess, resourceType.getScalingRange()));
+ }
+
private ITaskConfig checkConstraint(
IHostAttributes hostAttributes,
String constraintName,