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

aurora git commit: Allow custom OfferManager ordering to be injected via Guice modules

Repository: aurora
Updated Branches:
  refs/heads/master accd46aef -> 8a4140de5


Allow custom OfferManager ordering to be injected via Guice modules

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


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

Branch: refs/heads/master
Commit: 8a4140de53dbc220d5e9e5f9cb3e90755af50cc1
Parents: accd46a
Author: David McLaughlin <da...@dmclaughlin.com>
Authored: Fri Jun 2 13:43:43 2017 -0700
Committer: David McLaughlin <da...@dmclaughlin.com>
Committed: Fri Jun 2 13:43:43 2017 -0700

----------------------------------------------------------------------
 .../aurora/scheduler/offers/OfferManager.java   |  6 +--
 .../aurora/scheduler/offers/OfferSettings.java  | 14 +++++-
 .../aurora/scheduler/offers/OffersModule.java   | 45 ++++++++++++++++----
 3 files changed, 51 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/8a4140de/src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java b/src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java
index 96acaf9..17e577b 100644
--- a/src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java
+++ b/src/main/java/org/apache/aurora/scheduler/offers/OfferManager.java
@@ -13,7 +13,6 @@
  */
 package org.apache.aurora.scheduler.offers;
 
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentSkipListSet;
@@ -30,6 +29,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.Ordering;
 import com.google.common.eventbus.Subscribe;
 
 import org.apache.aurora.common.inject.TimedInterceptor.Timed;
@@ -276,8 +276,8 @@ public interface OfferManager extends EventSubscriber {
       // scheduling attempts. See VetoGroup for more details on static ban.
       private final Multimap<OfferID, TaskGroupKey> staticallyBannedOffers = HashMultimap.create();
 
-      HostOffers(StatsProvider statsProvider, List<OfferOrder> offerOrder) {
-        offers = new ConcurrentSkipListSet<>(OfferOrderBuilder.create(offerOrder));
+      HostOffers(StatsProvider statsProvider, Ordering<HostOffer> offerOrder) {
+        offers = new ConcurrentSkipListSet<>(offerOrder);
         // Potential gotcha - since this is a ConcurrentSkipListSet, size() is more expensive.
         // Could track this separately if it turns out to pose problems.
         statsProvider.exportSize(OUTSTANDING_OFFERS, offers);

http://git-wip-us.apache.org/repos/asf/aurora/blob/8a4140de/src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java b/src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java
index ee80176..4c6fd54 100644
--- a/src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java
+++ b/src/main/java/org/apache/aurora/scheduler/offers/OfferSettings.java
@@ -16,9 +16,11 @@ package org.apache.aurora.scheduler.offers;
 import java.util.List;
 
 import com.google.common.base.Supplier;
+import com.google.common.collect.Ordering;
 
 import org.apache.aurora.common.quantity.Amount;
 import org.apache.aurora.common.quantity.Time;
+import org.apache.aurora.scheduler.HostOffer;
 
 import static java.util.Objects.requireNonNull;
 
@@ -29,13 +31,21 @@ public class OfferSettings {
 
   private final Amount<Long, Time> offerFilterDuration;
   private final Supplier<Amount<Long, Time>> returnDelaySupplier;
-  private final List<OfferOrder> offerOrder;
+  private final Ordering<HostOffer> offerOrder;
 
   public OfferSettings(
       Amount<Long, Time> offerFilterDuration,
       Supplier<Amount<Long, Time>> returnDelaySupplier,
       List<OfferOrder> offerOrder) {
 
+    this(offerFilterDuration, returnDelaySupplier, OfferOrderBuilder.create(offerOrder));
+  }
+
+  OfferSettings(
+      Amount<Long, Time> offerFilterDuration,
+      Supplier<Amount<Long, Time>> returnDelaySupplier,
+      Ordering<HostOffer> offerOrder) {
+
     this.offerFilterDuration = requireNonNull(offerFilterDuration);
     this.returnDelaySupplier = requireNonNull(returnDelaySupplier);
     this.offerOrder = requireNonNull(offerOrder);
@@ -59,7 +69,7 @@ public class OfferSettings {
   /**
    * The ordering to use when fetching offers from OfferManager.
    */
-  public List<OfferOrder> getOfferOrder() {
+  public Ordering<HostOffer> getOfferOrder() {
     return offerOrder;
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/8a4140de/src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java b/src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java
index e999ac5..bbccb17 100644
--- a/src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java
+++ b/src/main/java/org/apache/aurora/scheduler/offers/OffersModule.java
@@ -16,12 +16,17 @@ package org.apache.aurora.scheduler.offers;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
 import java.util.List;
+import java.util.Set;
 import javax.inject.Qualifier;
 import javax.inject.Singleton;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Ordering;
 import com.google.inject.AbstractModule;
+import com.google.inject.Module;
 import com.google.inject.PrivateModule;
+import com.google.inject.Provides;
 import com.google.inject.TypeLiteral;
 
 import org.apache.aurora.common.args.Arg;
@@ -30,6 +35,8 @@ import org.apache.aurora.common.args.constraints.NotNegative;
 import org.apache.aurora.common.quantity.Amount;
 import org.apache.aurora.common.quantity.Time;
 import org.apache.aurora.common.util.Random;
+import org.apache.aurora.scheduler.HostOffer;
+import org.apache.aurora.scheduler.app.MoreModules;
 import org.apache.aurora.scheduler.events.PubsubEventModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,6 +85,19 @@ public class OffersModule extends AbstractModule {
   private static final Arg<List<OfferOrder>> OFFER_ORDER =
       Arg.create(ImmutableList.of(OfferOrder.RANDOM));
 
+  @CmdLine(name = "offer_order_modules",
+      help = "Custom Guice module to provide an offer ordering.")
+  private static final Arg<Set<Module>> OFFER_ORDER_MODULES = Arg.create(
+      ImmutableSet.of(MoreModules.lazilyInstantiated(OfferOrderModule.class)));
+
+  public static class OfferOrderModule extends AbstractModule {
+    @Override
+    protected void configure() {
+      bind(new TypeLiteral<Ordering<HostOffer>>() { })
+          .toInstance(OfferOrderBuilder.create(OFFER_ORDER.get()));
+    }
+  }
+
   /**
    * Binding annotation for the threshold to veto tasks with unavailability.
    */
@@ -98,6 +118,10 @@ public class OffersModule extends AbstractModule {
           OFFER_HOLD_JITTER_WINDOW.get());
     }
 
+    for (Module module: OFFER_ORDER_MODULES.get()) {
+      install(module);
+    }
+
     bind(new TypeLiteral<Amount<Long, Time>>() { })
         .annotatedWith(UnavailabilityThreshold.class)
         .toInstance(UNAVAILABILITY_THRESHOLD.get());
@@ -105,20 +129,23 @@ public class OffersModule extends AbstractModule {
     install(new PrivateModule() {
       @Override
       protected void configure() {
-        bind(OfferSettings.class).toInstance(
-            new OfferSettings(
-                OFFER_FILTER_DURATION.get(),
-                new RandomJitterReturnDelay(
-                    MIN_OFFER_HOLD_TIME.get().as(Time.MILLISECONDS),
-                    OFFER_HOLD_JITTER_WINDOW.get().as(Time.MILLISECONDS),
-                    Random.Util.newDefaultRandom()),
-                OFFER_ORDER.get()));
         bind(OfferManager.class).to(OfferManager.OfferManagerImpl.class);
         bind(OfferManager.OfferManagerImpl.class).in(Singleton.class);
         expose(OfferManager.class);
-        expose(OfferSettings.class);
       }
     });
     PubsubEventModule.bindSubscriber(binder(), OfferManager.class);
   }
+
+  @Provides
+  @Singleton
+  OfferSettings provideOfferSettings(Ordering<HostOffer> offerOrdering) {
+    return new OfferSettings(
+        OFFER_FILTER_DURATION.get(),
+        new RandomJitterReturnDelay(
+            MIN_OFFER_HOLD_TIME.get().as(Time.MILLISECONDS),
+            OFFER_HOLD_JITTER_WINDOW.get().as(Time.MILLISECONDS),
+            Random.Util.newDefaultRandom()),
+        offerOrdering);
+  }
 }