You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2017/11/08 02:45:06 UTC

aurora git commit: Use a pair of fields for caching offer resources rather than a Cache

Repository: aurora
Updated Branches:
  refs/heads/master b4825a37c -> 0e3e0dd71


Use a pair of fields for caching offer resources rather than a Cache

Reviewed at https://reviews.apache.org/r/63454/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/0e3e0dd7
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/0e3e0dd7
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/0e3e0dd7

Branch: refs/heads/master
Commit: 0e3e0dd713d25ff5648a0542a278c66eae53bbf3
Parents: b4825a3
Author: Bill Farner <wf...@apache.org>
Authored: Tue Nov 7 18:45:05 2017 -0800
Committer: Bill Farner <wf...@apache.org>
Committed: Tue Nov 7 18:45:05 2017 -0800

----------------------------------------------------------------------
 .../aurora/benchmark/SchedulingBenchmarks.java  |  2 +
 .../org/apache/aurora/scheduler/HostOffer.java  | 23 +++---
 .../scheduler/mesos/MesosTaskFactory.java       | 17 ++--
 .../scheduler/resources/AcceptedOffer.java      |  7 +-
 .../scheduler/resources/ResourceManager.java    | 15 ++--
 .../aurora/scheduler/state/TaskAssigner.java    | 23 +++---
 .../mesos/MesosTaskFactoryImplTest.java         | 83 +++++++-------------
 .../scheduler/resources/AcceptedOfferTest.java  |  9 +--
 .../resources/ResourceManagerTest.java          |  5 +-
 .../state/FirstFitTaskAssignerTest.java         | 12 +--
 10 files changed, 80 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java
----------------------------------------------------------------------
diff --git a/src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java b/src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java
index 456e780..292bb29 100644
--- a/src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java
+++ b/src/jmh/java/org/apache/aurora/benchmark/SchedulingBenchmarks.java
@@ -49,6 +49,7 @@ import org.apache.aurora.scheduler.async.AsyncModule;
 import org.apache.aurora.scheduler.async.DelayExecutor;
 import org.apache.aurora.scheduler.base.TaskTestUtil;
 import org.apache.aurora.scheduler.config.CliOptions;
+import org.apache.aurora.scheduler.config.CommandLine;
 import org.apache.aurora.scheduler.config.types.TimeAmount;
 import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
 import org.apache.aurora.scheduler.events.EventSink;
@@ -117,6 +118,7 @@ public class SchedulingBenchmarks {
      */
     @Setup(Level.Trial)
     public void setUpBenchmark() {
+      CommandLine.initializeForTest();
       storage = MemStorageModule.newEmptyStorage();
       eventBus = new EventBus();
       final FakeClock clock = new FakeClock();

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/main/java/org/apache/aurora/scheduler/HostOffer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/HostOffer.java b/src/main/java/org/apache/aurora/scheduler/HostOffer.java
index acc637a..d7d9773 100644
--- a/src/main/java/org/apache/aurora/scheduler/HostOffer.java
+++ b/src/main/java/org/apache/aurora/scheduler/HostOffer.java
@@ -15,12 +15,11 @@ package org.apache.aurora.scheduler;
 
 import java.time.Instant;
 import java.util.Objects;
+import java.util.function.Supplier;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Optional;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
+import com.google.common.base.Suppliers;
 
 import org.apache.aurora.scheduler.base.Conversions;
 import org.apache.aurora.scheduler.resources.ResourceBag;
@@ -39,7 +38,8 @@ import static org.apache.mesos.v1.Protos.Offer;
 public class HostOffer {
   private final Offer offer;
   private final IHostAttributes hostAttributes;
-  private final LoadingCache<TierInfo, ResourceBag> resourceBagCache;
+  private final Supplier<ResourceBag> revocableResources;
+  private final Supplier<ResourceBag> nonRevocableResources;
 
   // Offers lacking CPU or mem are flagged so that they may be efficiently ignored during
   // scheduling.  However, they are retained for other purposes such as preemption and cluster
@@ -52,13 +52,10 @@ public class HostOffer {
     this.offer = requireNonNull(offer);
     this.hostAttributes = requireNonNull(hostAttributes);
     this.nonZeroCpuAndMem = offerHasCpuAndMem(offer);
-    this.resourceBagCache = CacheBuilder.newBuilder().build(
-        new CacheLoader<TierInfo, ResourceBag>() {
-          @Override
-          public ResourceBag load(TierInfo tierInfo) {
-            return bagFromMesosResources(getOfferResources(offer, tierInfo));
-          }
-        });
+    this.revocableResources =
+        Suppliers.memoize(() -> bagFromMesosResources(getOfferResources(offer, true)));
+    this.nonRevocableResources =
+        Suppliers.memoize(() -> bagFromMesosResources(getOfferResources(offer, false)));
   }
 
   private static boolean offerHasCpuAndMem(Offer offer) {
@@ -79,8 +76,8 @@ public class HostOffer {
     return nonZeroCpuAndMem;
   }
 
-  public ResourceBag getResourceBag(TierInfo tierInfo) {
-    return resourceBagCache.getUnchecked(tierInfo);
+  public ResourceBag getResourceBag(boolean revocable) {
+    return revocable ? revocableResources.get() : nonRevocableResources.get();
   }
 
   public Optional<Instant> getUnavailabilityStart() {

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
index 34ed820..727be58 100644
--- a/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
+++ b/src/main/java/org/apache/aurora/scheduler/mesos/MesosTaskFactory.java
@@ -27,7 +27,6 @@ import com.google.protobuf.ByteString;
 
 import org.apache.aurora.Protobufs;
 import org.apache.aurora.codec.ThriftBinaryCodec;
-import org.apache.aurora.scheduler.TierManager;
 import org.apache.aurora.scheduler.base.JobKeys;
 import org.apache.aurora.scheduler.base.SchedulerException;
 import org.apache.aurora.scheduler.base.Tasks;
@@ -77,7 +76,7 @@ public interface MesosTaskFactory {
    * @return A new task.
    * @throws SchedulerException If the task could not be encoded.
    */
-  TaskInfo createFrom(IAssignedTask task, Offer offer) throws SchedulerException;
+  TaskInfo createFrom(IAssignedTask task, Offer offer, boolean revocable) throws SchedulerException;
 
   // TODO(wfarner): Move this class to its own file to reduce visibility to package private.
   class MesosTaskFactoryImpl implements MesosTaskFactory {
@@ -100,17 +99,11 @@ public interface MesosTaskFactory {
     static final String TIER_LABEL = AURORA_LABEL_PREFIX + ".tier";
 
     private final ExecutorSettings executorSettings;
-    private final TierManager tierManager;
     private final IServerInfo serverInfo;
 
     @Inject
-    MesosTaskFactoryImpl(
-        ExecutorSettings executorSettings,
-        TierManager tierManager,
-        IServerInfo serverInfo) {
-
+    MesosTaskFactoryImpl(ExecutorSettings executorSettings, IServerInfo serverInfo) {
       this.executorSettings = requireNonNull(executorSettings);
-      this.tierManager = requireNonNull(tierManager);
       this.serverInfo = requireNonNull(serverInfo);
     }
 
@@ -151,7 +144,9 @@ public interface MesosTaskFactory {
     }
 
     @Override
-    public TaskInfo createFrom(IAssignedTask task, Offer offer) throws SchedulerException {
+    public TaskInfo createFrom(IAssignedTask task, Offer offer, boolean revocable)
+        throws SchedulerException {
+
       requireNonNull(task);
       requireNonNull(offer);
 
@@ -171,7 +166,7 @@ public interface MesosTaskFactory {
             offer,
             task,
             executorOverhead,
-            tierManager.getTier(task.getTask()));
+            revocable);
       } catch (ResourceManager.InsufficientResourcesException e) {
         throw new SchedulerException(e);
       }

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java b/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
index 291d5c9..e8ea3f2 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/AcceptedOffer.java
@@ -20,7 +20,6 @@ import java.util.stream.StreamSupport;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 
-import org.apache.aurora.scheduler.TierInfo;
 import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
 import org.apache.mesos.v1.Protos.Offer;
 import org.apache.mesos.v1.Protos.Resource;
@@ -63,7 +62,7 @@ public final class AcceptedOffer {
       Offer offer,
       IAssignedTask task,
       ResourceBag executorOverhead,
-      TierInfo tierInfo) throws ResourceManager.InsufficientResourcesException {
+      boolean revocable) throws ResourceManager.InsufficientResourcesException {
 
     ImmutableList.Builder<Resource> taskResources = ImmutableList.builder();
     ImmutableList.Builder<Resource> executorResources = ImmutableList.builder();
@@ -73,13 +72,13 @@ public final class AcceptedOffer {
         .forEach(entry -> {
           ResourceType type = entry.getKey();
           Iterable<Resource.Builder> offerResources = StreamSupport
-              .stream(getOfferResources(offer, tierInfo, entry.getKey()).spliterator(), false)
+              .stream(getOfferResources(offer, revocable, entry.getKey()).spliterator(), false)
               // Note the reverse order of args in .compare(): we want RESERVED resources first.
               .sorted((l, r) -> Boolean.compare(RESERVED.test(r), RESERVED.test(l)))
               .map(Resource::toBuilder)
               .collect(toList());
 
-          boolean isRevocable = type.isMesosRevocable() && tierInfo.isRevocable();
+          boolean isRevocable = type.isMesosRevocable() && revocable;
 
           taskResources.addAll(type.getMesosResourceConverter().toMesosResource(
               offerResources,

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java b/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
index 9aa263a..f9dee22 100644
--- a/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
+++ b/src/main/java/org/apache/aurora/scheduler/resources/ResourceManager.java
@@ -26,7 +26,6 @@ import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
 
 import org.apache.aurora.gen.ResourceAggregate;
-import org.apache.aurora.scheduler.TierInfo;
 import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
 import org.apache.aurora.scheduler.storage.entities.IResource;
 import org.apache.aurora.scheduler.storage.entities.IResourceAggregate;
@@ -118,11 +117,12 @@ public final class ResourceManager {
    * Gets offer resources filtered by the provided {@code tierInfo} instance.
    *
    * @param offer Offer to get resources from.
-   * @param tierInfo Tier info.
+   * @param revocable if {@code true} return only revocable resources,
+   *                  if {@code false} return non-revocable.
    * @return Offer resources filtered by {@code tierInfo}.
    */
-  public static Iterable<Resource> getOfferResources(Offer offer, TierInfo tierInfo) {
-    return tierInfo.isRevocable()
+  public static Iterable<Resource> getOfferResources(Offer offer, boolean revocable) {
+    return revocable
         ? getRevocableOfferResources(offer)
         : getNonRevocableOfferResources(offer);
   }
@@ -131,16 +131,17 @@ public final class ResourceManager {
    * Gets offer resoruces filtered by the {@code tierInfo} and {@code type}.
    *
    * @param offer Offer to get resources from.
-   * @param tierInfo Tier info.
+   * @param revocable if {@code true} return only revocable resources,
+   *                  if {@code false} return non-revocable.
    * @param type Resource type.
    * @return Offer resources filtered by {@code tierInfo} and {@code type}.
    */
   public static Iterable<Resource> getOfferResources(
       Offer offer,
-      TierInfo tierInfo,
+      boolean revocable,
       ResourceType type) {
 
-    return Iterables.filter(getOfferResources(offer, tierInfo), r -> fromResource(r).equals(type));
+    return Iterables.filter(getOfferResources(offer, revocable), r -> fromResource(r).equals(type));
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java b/src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java
index 549fd29..cdd0d15 100644
--- a/src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java
+++ b/src/main/java/org/apache/aurora/scheduler/state/TaskAssigner.java
@@ -28,7 +28,6 @@ import com.google.common.collect.Iterables;
 import org.apache.aurora.common.inject.TimedInterceptor.Timed;
 import org.apache.aurora.common.stats.StatsProvider;
 import org.apache.aurora.scheduler.HostOffer;
-import org.apache.aurora.scheduler.TierInfo;
 import org.apache.aurora.scheduler.TierManager;
 import org.apache.aurora.scheduler.base.InstanceKeys;
 import org.apache.aurora.scheduler.base.TaskGroupKey;
@@ -133,7 +132,8 @@ public interface TaskAssigner {
     private TaskInfo assign(
         MutableStoreProvider storeProvider,
         Offer offer,
-        String taskId) {
+        String taskId,
+        boolean revocable) {
 
       String host = offer.getHostname();
       IAssignedTask assigned = stateManager.assignTask(
@@ -145,12 +145,12 @@ public interface TaskAssigner {
       LOG.info(
           "Offer on agent {} (id {}) is being assigned task for {}.",
           host, offer.getAgentId().getValue(), taskId);
-      return taskFactory.createFrom(assigned, offer);
+      return taskFactory.createFrom(assigned, offer, revocable);
     }
 
     private boolean evaluateOffer(
         MutableStoreProvider storeProvider,
-        TierInfo tierInfo,
+        boolean revocable,
         ResourceRequest resourceRequest,
         TaskGroupKey groupKey,
         IAssignedTask task,
@@ -160,7 +160,7 @@ public interface TaskAssigner {
       String taskId = task.getTaskId();
       Set<Veto> vetoes = filter.filter(
           new UnusedResource(
-              offer.getResourceBag(tierInfo),
+              offer.getResourceBag(revocable),
               offer.getAttributes(),
               offer.getUnavailabilityStart()),
           resourceRequest);
@@ -169,7 +169,8 @@ public interface TaskAssigner {
         TaskInfo taskInfo = assign(
             storeProvider,
             offer.getOffer(),
-            taskId);
+            taskId,
+            revocable);
         resourceRequest.getJobState().updateAttributeAggregate(offer.getAttributes());
 
         try {
@@ -206,7 +207,7 @@ public interface TaskAssigner {
     private Iterable<IAssignedTask> maybeAssignReserved(
         Iterable<IAssignedTask> tasks,
         MutableStoreProvider storeProvider,
-        TierInfo tierInfo,
+        boolean revocable,
         ResourceRequest resourceRequest,
         TaskGroupKey groupKey,
         ImmutableSet.Builder<String> assignmentResult) {
@@ -233,7 +234,7 @@ public interface TaskAssigner {
               // Scheduler hasn't been updated by Mesos yet...
               if (evaluateOffer(
                   storeProvider,
-                  tierInfo,
+                  revocable,
                   resourceRequest,
                   groupKey,
                   task,
@@ -276,13 +277,13 @@ public interface TaskAssigner {
         return ImmutableSet.of();
       }
 
-      TierInfo tierInfo = tierManager.getTier(groupKey.getTask());
+      boolean revocable = tierManager.getTier(groupKey.getTask()).isRevocable();
       ImmutableSet.Builder<String> assignmentResult = ImmutableSet.builder();
 
       Iterable<IAssignedTask> nonReservedTasks = maybeAssignReserved(
           tasks,
           storeProvider,
-          tierInfo,
+          revocable,
           resourceRequest,
           groupKey,
           assignmentResult);
@@ -317,7 +318,7 @@ public interface TaskAssigner {
           evaluatedOffers.incrementAndGet();
           try {
             boolean offerUsed = evaluateOffer(
-                storeProvider, tierInfo, resourceRequest, groupKey, task, offer, assignmentResult);
+                storeProvider, revocable, resourceRequest, groupKey, task, offer, assignmentResult);
             if (offerUsed) {
               if (remainingTasks.hasNext()) {
                 task = remainingTasks.next();

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
index d91b540..c27a662 100644
--- a/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/mesos/MesosTaskFactoryImplTest.java
@@ -33,7 +33,6 @@ import org.apache.aurora.gen.Image;
 import org.apache.aurora.gen.MesosContainer;
 import org.apache.aurora.gen.ServerInfo;
 import org.apache.aurora.gen.TaskConfig;
-import org.apache.aurora.scheduler.TierManager;
 import org.apache.aurora.scheduler.base.TaskTestUtil;
 import org.apache.aurora.scheduler.configuration.executor.ExecutorConfig;
 import org.apache.aurora.scheduler.configuration.executor.ExecutorSettings;
@@ -62,10 +61,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import static org.apache.aurora.gen.apiConstants.TASK_FILESYSTEM_MOUNT_POINT;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.DEV_TIER;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.PREFERRED_TIER;
 import static org.apache.aurora.scheduler.base.TaskTestUtil.PROD_TIER_NAME;
-import static org.apache.aurora.scheduler.base.TaskTestUtil.REVOCABLE_TIER;
 import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.DEFAULT_PORT_PROTOCOL;
 import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.METADATA_LABEL_PREFIX;
 import static org.apache.aurora.scheduler.mesos.MesosTaskFactory.MesosTaskFactoryImpl.SOURCE_LABEL;
@@ -82,7 +78,6 @@ import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosRange;
 import static org.apache.aurora.scheduler.resources.ResourceTestUtil.mesosScalarFromBag;
 import static org.apache.aurora.scheduler.resources.ResourceTestUtil.resetPorts;
 import static org.apache.aurora.scheduler.resources.ResourceType.PORTS;
-import static org.easymock.EasyMock.expect;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -147,14 +142,12 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   private MesosTaskFactory taskFactory;
   private ExecutorSettings config;
-  private TierManager tierManager;
 
   private static final ExecutorInfo DEFAULT_EXECUTOR = THERMOS_CONFIG.getExecutor();
 
   @Before
   public void setUp() {
     config = THERMOS_EXECUTOR;
-    tierManager = createMock(TierManager.class);
 
     ResourceType.initializeEmptyCliArgsForTest();
   }
@@ -205,12 +198,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   @Test
   public void testExecutorInfoUnchanged() {
-    expect(tierManager.getTier(TASK_CONFIG)).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR, false);
 
     assertEquals(populateDynamicFields(DEFAULT_EXECUTOR, TASK), makeComparable(task.getExecutor()));
     checkTaskResources(TASK.getTask(), task);
@@ -219,8 +211,7 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   @Test
   public void testTaskInfoRevocable() {
-    expect(tierManager.getTier(TASK_CONFIG)).andReturn(REVOCABLE_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     List<Resource> revocable = OFFER_THERMOS_EXECUTOR.getResourcesList().stream()
         .map(r -> {
@@ -239,7 +230,7 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(TASK, withRevocable);
+    TaskInfo task = taskFactory.createFrom(TASK, withRevocable, true);
     checkTaskResources(TASK.getTask(), task);
     assertTrue(task.getResourcesList().stream().anyMatch(Resource::hasRevocable));
     checkDiscoveryInfoUnset(task);
@@ -251,13 +242,12 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
     builder.unsetAssignedPorts();
     builder.setTask(
         resetPorts(ITaskConfig.build(builder.getTask()), ImmutableSet.of()).newBuilder());
-    IAssignedTask assignedTask = IAssignedTask.build(builder);
-    expect(tierManager.getTier(assignedTask.getTask())).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(IAssignedTask.build(builder), OFFER_THERMOS_EXECUTOR);
+    TaskInfo task =
+        taskFactory.createFrom(IAssignedTask.build(builder), OFFER_THERMOS_EXECUTOR, false);
     checkTaskResources(ITaskConfig.build(builder.getTask()), task);
     checkDiscoveryInfoUnset(task);
   }
@@ -267,12 +257,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
     // Here the ram required for the executor is greater than the sum of task resources
     // + executor overhead. We need to ensure we allocate a non-zero amount of ram in this case.
     config = NO_OVERHEAD_EXECUTOR;
-    expect(tierManager.getTier(TASK_CONFIG)).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR, false);
     assertEquals(
         purgeZeroResources(populateDynamicFields(
             NO_OVERHEAD_EXECUTOR.getExecutorConfig(TASK.getTask()
@@ -331,13 +320,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   private TaskInfo getDockerTaskInfo(IAssignedTask task) {
     config = SOME_OVERHEAD_EXECUTOR;
-
-    expect(tierManager.getTier(task.getTask())).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    return taskFactory.createFrom(task, OFFER_SOME_OVERHEAD_EXECUTOR);
+    return taskFactory.createFrom(task, OFFER_SOME_OVERHEAD_EXECUTOR, false);
   }
 
   @Test
@@ -358,13 +345,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
   @Test
   public void testGlobalMounts() {
     config = EXECUTOR_SETTINGS_WITH_VOLUMES;
-
-    expect(tierManager.getTier(TASK_WITH_DOCKER.getTask())).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo taskInfo = taskFactory.createFrom(TASK_WITH_DOCKER, OFFER_THERMOS_EXECUTOR);
+    TaskInfo taskInfo = taskFactory.createFrom(TASK_WITH_DOCKER, OFFER_THERMOS_EXECUTOR, false);
     assertEquals(
         config.getExecutorConfig(TASK_WITH_DOCKER.getTask().getExecutorConfig().getName()).get()
             .getVolumeMounts(),
@@ -385,11 +370,10 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
                         .setImage(Image.docker(new DockerImage(imageName, imageTag)))
                         .setVolumes(ImmutableList.of(volume)))))));
 
-    expect(tierManager.getTier(taskWithImageAndVolumes.getTask())).andReturn(DEV_TIER);
     control.replay();
 
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
-    TaskInfo task = taskFactory.createFrom(taskWithImageAndVolumes, OFFER_THERMOS_EXECUTOR);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
+    TaskInfo task = taskFactory.createFrom(taskWithImageAndVolumes, OFFER_THERMOS_EXECUTOR, false);
 
     assertEquals(
         ContainerInfo.newBuilder()
@@ -412,12 +396,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   @Test
   public void testMetadataLabelMapping() {
-    expect(tierManager.getTier(TASK.getTask())).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR, false);
     ImmutableSet<String> labels = task.getLabels().getLabelsList().stream()
         .filter(l -> l.getKey().startsWith(METADATA_LABEL_PREFIX))
         .map(l -> l.getKey() + l.getValue())
@@ -433,12 +416,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
 
   @Test
   public void testTierLabel() {
-    expect(tierManager.getTier(TASK.getTask())).andReturn(PREFERRED_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR, false);
 
     assertTrue(task.getLabels().getLabelsList().stream().anyMatch(
         l -> l.getKey().equals(TIER_LABEL) && l.getValue().equals(PROD_TIER_NAME)));
@@ -476,12 +458,12 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
     builder.setTask(
         resetPorts(ITaskConfig.build(builder.getTask()), ImmutableSet.of()).newBuilder());
     IAssignedTask assignedTask = IAssignedTask.build(builder);
-    expect(tierManager.getTier(assignedTask.getTask())).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
 
-    TaskInfo task = taskFactory.createFrom(IAssignedTask.build(builder), OFFER_THERMOS_EXECUTOR);
+    TaskInfo task =
+        taskFactory.createFrom(IAssignedTask.build(builder), OFFER_THERMOS_EXECUTOR, false);
     checkTaskResources(ITaskConfig.build(builder.getTask()), task);
     checkDiscoveryInfo(task, ImmutableMap.of(), assignedTask.getTask().getJob());
   }
@@ -492,11 +474,10 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
         ImmutableMap.<String, ExecutorConfig>builder().put(THERMOS_CONFIG.getExecutor().getName(),
             THERMOS_CONFIG).build(),
         true /* populate discovery info */);
-    expect(tierManager.getTier(TASK_CONFIG)).andReturn(DEV_TIER);
-    taskFactory = new MesosTaskFactoryImpl(config, tierManager, SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(config, SERVER_INFO);
 
     control.replay();
-    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(TASK, OFFER_THERMOS_EXECUTOR, false);
     checkTaskResources(TASK.getTask(), task);
     checkDiscoveryInfo(task, ImmutableMap.of("http", 80), TASK.getTask().getJob());
   }
@@ -512,14 +493,10 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
                     new MesosContainer().setImage(
                         Image.docker(new DockerImage(imageName, imageTag))))))));
 
-    expect(tierManager.getTier(taskWithDockerImage.getTask())).andReturn(DEV_TIER);
     control.replay();
 
-    taskFactory = new MesosTaskFactoryImpl(
-        EXECUTOR_SETTINGS_WITH_VOLUMES,
-        tierManager,
-        SERVER_INFO);
-    TaskInfo task = taskFactory.createFrom(taskWithDockerImage, OFFER_THERMOS_EXECUTOR);
+    taskFactory = new MesosTaskFactoryImpl(EXECUTOR_SETTINGS_WITH_VOLUMES, SERVER_INFO);
+    TaskInfo task = taskFactory.createFrom(taskWithDockerImage, OFFER_THERMOS_EXECUTOR, false);
     assertEquals(
         ContainerInfo.newBuilder()
             .setType(Type.MESOS)
@@ -548,15 +525,11 @@ public class MesosTaskFactoryImplTest extends EasyMockTest {
                     new MesosContainer().setImage(
                         Image.appc(new AppcImage(imageName, imageId))))))));
 
-    expect(tierManager.getTier(taskWithAppcImage.getTask())).andReturn(DEV_TIER);
     control.replay();
 
-    taskFactory = new MesosTaskFactoryImpl(
-        EXECUTOR_SETTINGS_WITH_VOLUMES,
-        tierManager,
-        SERVER_INFO);
+    taskFactory = new MesosTaskFactoryImpl(EXECUTOR_SETTINGS_WITH_VOLUMES, SERVER_INFO);
 
-    TaskInfo task = taskFactory.createFrom(taskWithAppcImage, OFFER_THERMOS_EXECUTOR);
+    TaskInfo task = taskFactory.createFrom(taskWithAppcImage, OFFER_THERMOS_EXECUTOR, false);
     assertEquals(
         ContainerInfo.newBuilder()
             .setType(Type.MESOS)

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/test/java/org/apache/aurora/scheduler/resources/AcceptedOfferTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/AcceptedOfferTest.java b/src/test/java/org/apache/aurora/scheduler/resources/AcceptedOfferTest.java
index c47f7c9..468dcac 100644
--- a/src/test/java/org/apache/aurora/scheduler/resources/AcceptedOfferTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/resources/AcceptedOfferTest.java
@@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableSet;
 
 import org.apache.aurora.gen.AssignedTask;
 import org.apache.aurora.gen.TaskConfig;
-import org.apache.aurora.scheduler.TierInfo;
 import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
 import org.apache.mesos.v1.Protos;
 import org.apache.mesos.v1.Protos.Resource;
@@ -74,7 +73,7 @@ public class AcceptedOfferTest {
         offer(),
         IAssignedTask.build(new AssignedTask().setTask(new TaskConfig())),
         ResourceBag.EMPTY,
-        DEV_TIER);
+        DEV_TIER.isRevocable());
     assertEquals(Collections.emptyList(), acceptedOffer.getTaskResources());
     assertEquals(Collections.emptyList(), acceptedOffer.getExecutorResources());
   }
@@ -94,8 +93,7 @@ public class AcceptedOfferTest {
         mesosScalar(DISK_MB, TOTAL_BAG.valueOf(DISK_MB), false),
         mesosRange(PORTS, role, TASK_PORTS));
 
-    AcceptedOffer offerAllocation = AcceptedOffer.create(
-        offer, TASK, EXECUTOR_BAG, new TierInfo(false, revocable));
+    AcceptedOffer offerAllocation = AcceptedOffer.create(offer, TASK, EXECUTOR_BAG, revocable);
 
     ResourceBag bag = bagFromResources(TASK.getTask().getResources());
     Set<Resource> taskResources = ImmutableSet.<Resource>builder()
@@ -132,8 +130,7 @@ public class AcceptedOfferTest {
         mesosScalar(DISK_MB, TEST_ROLE, false, TOTAL_BAG.valueOf(DISK_MB)),
         mesosRange(PORTS, TEST_ROLE, TASK_PORTS));
 
-    AcceptedOffer offerAllocation = AcceptedOffer.create(
-        offer, TASK, EXECUTOR_BAG, new TierInfo(false, revocable));
+    AcceptedOffer offerAllocation = AcceptedOffer.create(offer, TASK, EXECUTOR_BAG, revocable);
 
     Set<Resource> taskSet = ImmutableSet.<Resource>builder()
         .add(mesosScalar(CPUS, TEST_ROLE, revocable, EXECUTOR_BAG.valueOf(CPUS)))

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/test/java/org/apache/aurora/scheduler/resources/ResourceManagerTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/resources/ResourceManagerTest.java b/src/test/java/org/apache/aurora/scheduler/resources/ResourceManagerTest.java
index 37dfcbc..a5623ca 100644
--- a/src/test/java/org/apache/aurora/scheduler/resources/ResourceManagerTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/resources/ResourceManagerTest.java
@@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
 import org.apache.aurora.gen.AssignedTask;
-import org.apache.aurora.scheduler.TierInfo;
 import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
 import org.apache.aurora.scheduler.storage.entities.IResource;
 import org.apache.mesos.v1.Protos;
@@ -92,10 +91,10 @@ public class ResourceManagerTest {
         ImmutableSet.copyOf(ResourceManager.getRevocableOfferResources(offer)));
     assertEquals(
         ImmutableSet.of(resource1, resource3),
-        ImmutableSet.copyOf(ResourceManager.getOfferResources(offer, new TierInfo(false, false))));
+        ImmutableSet.copyOf(ResourceManager.getOfferResources(offer, false)));
     assertEquals(
         ImmutableSet.of(resource2, resource3),
-        ImmutableSet.copyOf(ResourceManager.getOfferResources(offer, new TierInfo(false, true))));
+        ImmutableSet.copyOf(ResourceManager.getOfferResources(offer, true)));
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/aurora/blob/0e3e0dd7/src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java b/src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java
index 5837250..58f9de2 100644
--- a/src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/state/FirstFitTaskAssignerTest.java
@@ -172,7 +172,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
     expect(tierManager.getTier(TASK.getAssignedTask().getTask())).andReturn(DEV_TIER);
     expect(filter.filter(UNUSED, resourceRequest)).andReturn(ImmutableSet.of());
     expectAssignTask(MESOS_OFFER);
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER, false))
         .andReturn(TASK_INFO);
 
     control.replay();
@@ -255,7 +255,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
         LOST,
         LAUNCH_FAILED_MSG))
         .andReturn(StateChangeResult.SUCCESS);
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER, false))
         .andReturn(TASK_INFO);
 
     control.replay();
@@ -313,7 +313,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
             OFFER_2.getAttributes()),
         resourceRequest)).andReturn(ImmutableSet.of());
     expectAssignTask(OFFER_2.getOffer());
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), OFFER_2.getOffer()))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), OFFER_2.getOffer(), false))
         .andReturn(TASK_INFO);
     offerManager.launchTask(OFFER_2.getOffer().getId(), TASK_INFO);
 
@@ -363,7 +363,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
         .andReturn(ImmutableSet.of());
 
     expectAssignTask(MESOS_OFFER);
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), OFFER.getOffer()))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), OFFER.getOffer(), false))
         .andReturn(TASK_INFO);
     offerManager.launchTask(OFFER.getOffer().getId(), TASK_INFO);
 
@@ -404,7 +404,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
     offerManager.launchTask(MESOS_OFFER.getId(), TASK_INFO);
     expect(tierManager.getTier(TASK.getAssignedTask().getTask())).andReturn(DEV_TIER);
 
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER, false))
         .andReturn(TASK_INFO);
 
     control.replay();
@@ -465,7 +465,7 @@ public class FirstFitTaskAssignerTest extends EasyMockTest {
     offerManager.launchTask(MESOS_OFFER.getId(), TASK_INFO);
     expect(tierManager.getTier(TASK.getAssignedTask().getTask())).andReturn(DEV_TIER);
 
-    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER))
+    expect(taskFactory.createFrom(TASK.getAssignedTask(), MESOS_OFFER, false))
         .andReturn(TASK_INFO);
 
     // Normal scheduling loop for the remaining task...