You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2015/09/19 01:16:59 UTC

[1/6] mesos git commit: Added QUIESCE call interface to the scheduler.

Repository: mesos
Updated Branches:
  refs/heads/master 461c521d4 -> 63f1c2ec8


Added QUIESCE call interface to the scheduler.

Review: https://reviews.apache.org/r/37532


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3a1f2d36
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3a1f2d36
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3a1f2d36

Branch: refs/heads/master
Commit: 3a1f2d36f8de0cacc085a828bd9bbc1f2a78f747
Parents: 461c521
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:13:18 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:13:18 2015 -0700

----------------------------------------------------------------------
 include/mesos/scheduler.hpp             |  6 +++++
 include/mesos/scheduler/scheduler.proto |  1 +
 src/master/master.cpp                   | 15 +++++++++++++
 src/master/master.hpp                   |  2 ++
 src/sched/sched.cpp                     | 33 ++++++++++++++++++++++++++++
 5 files changed, 57 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3a1f2d36/include/mesos/scheduler.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/scheduler.hpp b/include/mesos/scheduler.hpp
index ee198b6..071f448 100644
--- a/include/mesos/scheduler.hpp
+++ b/include/mesos/scheduler.hpp
@@ -268,6 +268,10 @@ public:
   // those filtered slaves.
   virtual Status reviveOffers() = 0;
 
+  // Inform Mesos master to stop sending offers to the framework. The
+  // scheduler should call reviveOffers() to resume getting offers.
+  virtual Status quiesceOffers() = 0;
+
   // Acknowledges the status update. This should only be called
   // once the status update is processed durably by the scheduler.
   // Not that explicit acknowledgements must be requested via the
@@ -416,6 +420,8 @@ public:
 
   virtual Status reviveOffers();
 
+  virtual Status quiesceOffers();
+
   virtual Status acknowledgeStatusUpdate(
       const TaskStatus& status);
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3a1f2d36/include/mesos/scheduler/scheduler.proto
----------------------------------------------------------------------
diff --git a/include/mesos/scheduler/scheduler.proto b/include/mesos/scheduler/scheduler.proto
index 19f548d..89ddc10 100644
--- a/include/mesos/scheduler/scheduler.proto
+++ b/include/mesos/scheduler/scheduler.proto
@@ -174,6 +174,7 @@ message Call {
     RECONCILE = 9;   // See 'Reconcile' below.
     MESSAGE = 10;    // See 'Message' below.
     REQUEST = 11;    // See 'Request' below.
+    QUIESCE = 12;    // Inform master to stop sending offers to the framework.
 
     // TODO(benh): Consider adding an 'ACTIVATE' and 'DEACTIVATE' for
     // already subscribed frameworks as a way of stopping offers from

http://git-wip-us.apache.org/repos/asf/mesos/blob/3a1f2d36/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 3b390d7..7ae4ef8 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -1781,6 +1781,10 @@ void Master::receive(
       request(framework, call.request());
       break;
 
+    case scheduler::Call::QUIESCE:
+      quiesce(framework);
+      break;
+
     default:
       // Should be caught during call validation above.
       LOG(FATAL) << "Unexpected " << call.type() << " call"
@@ -2597,6 +2601,17 @@ void Master::request(
 }
 
 
+void Master::quiesce(Framework* framework)
+{
+  CHECK_NOTNULL(framework);
+
+  LOG(INFO) << "Processing QUIESCE call for framework " << *framework;
+
+  //TODO(gyliu513): Add quiesce logic here.
+  LOG(WARNING) << "Not implemented yet, ignoring the QUIESCE call.";
+}
+
+
 void Master::launchTasks(
     const UPID& from,
     const FrameworkID& frameworkId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/3a1f2d36/src/master/master.hpp
----------------------------------------------------------------------
diff --git a/src/master/master.hpp b/src/master/master.hpp
index d48ef7c..6805177 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -829,6 +829,8 @@ private:
       Framework* framework,
       const scheduler::Call::Request& request);
 
+  void quiesce(Framework* framework);
+
   bool elected() const
   {
     return leader.isSome() && leader.get() == info_;

http://git-wip-us.apache.org/repos/asf/mesos/blob/3a1f2d36/src/sched/sched.cpp
----------------------------------------------------------------------
diff --git a/src/sched/sched.cpp b/src/sched/sched.cpp
index a1723f3..84c2edb 100644
--- a/src/sched/sched.cpp
+++ b/src/sched/sched.cpp
@@ -1242,6 +1242,23 @@ protected:
     send(master.get().pid(), call);
   }
 
+  void quiesceOffers()
+  {
+    if (!connected) {
+      VLOG(1) << "Ignoring quiesce offers message as master is disconnected";
+      return;
+    }
+
+    Call call;
+
+    CHECK(framework.has_id());
+    call.mutable_framework_id()->CopyFrom(framework.id());
+    call.set_type(Call::QUIESCE);
+
+    CHECK_SOME(master);
+    send(master.get().pid(), call);
+  }
+
   void acknowledgeStatusUpdate(
       const TaskStatus& status)
   {
@@ -1934,6 +1951,22 @@ Status MesosSchedulerDriver::reviveOffers()
 }
 
 
+Status MesosSchedulerDriver::quiesceOffers()
+{
+  synchronized (mutex) {
+    if (status != DRIVER_RUNNING) {
+      return status;
+    }
+
+    CHECK(process != NULL);
+
+    dispatch(process, &SchedulerProcess::quiesceOffers);
+
+    return status;
+  }
+}
+
+
 Status MesosSchedulerDriver::acknowledgeStatusUpdate(
     const TaskStatus& taskStatus)
 {


[3/6] mesos git commit: Added metrics of messages_quiesce_offers.

Posted by vi...@apache.org.
Added metrics of messages_quiesce_offers.

Review: https://reviews.apache.org/r/38119


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

Branch: refs/heads/master
Commit: c68f6d71327434e50aff72892b9781549ba7616d
Parents: 3de5bf0
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:14:04 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:14:04 2015 -0700

----------------------------------------------------------------------
 src/master/master.cpp       | 2 ++
 src/master/metrics.cpp      | 4 ++++
 src/master/metrics.hpp      | 1 +
 src/tests/master_tests.cpp  | 1 +
 src/tests/metrics_tests.cpp | 1 +
 5 files changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/c68f6d71/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 151ce71..64e5fb9 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2607,6 +2607,8 @@ void Master::quiesce(Framework* framework)
 
   LOG(INFO) << "Processing QUIESCE call for framework " << *framework;
 
+  ++metrics->messages_quiesce_offers;
+
   allocator->quiesceOffers(framework->id());
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/c68f6d71/src/master/metrics.cpp
----------------------------------------------------------------------
diff --git a/src/master/metrics.cpp b/src/master/metrics.cpp
index d79206f..6bce80b 100644
--- a/src/master/metrics.cpp
+++ b/src/master/metrics.cpp
@@ -114,6 +114,8 @@ Metrics::Metrics(const Master& master)
         "master/messages_decline_offers"),
     messages_revive_offers(
         "master/messages_revive_offers"),
+    messages_quiesce_offers(
+        "master/messages_quiesce_offers"),
     messages_reconcile_tasks(
         "master/messages_reconcile_tasks"),
     messages_framework_to_executor(
@@ -218,6 +220,7 @@ Metrics::Metrics(const Master& master)
   process::metrics::add(messages_launch_tasks);
   process::metrics::add(messages_decline_offers);
   process::metrics::add(messages_revive_offers);
+  process::metrics::add(messages_quiesce_offers);
   process::metrics::add(messages_reconcile_tasks);
   process::metrics::add(messages_framework_to_executor);
   process::metrics::add(messages_executor_to_framework);
@@ -353,6 +356,7 @@ Metrics::~Metrics()
   process::metrics::remove(messages_launch_tasks);
   process::metrics::remove(messages_decline_offers);
   process::metrics::remove(messages_revive_offers);
+  process::metrics::remove(messages_quiesce_offers);
   process::metrics::remove(messages_reconcile_tasks);
   process::metrics::remove(messages_framework_to_executor);
   process::metrics::remove(messages_executor_to_framework);

http://git-wip-us.apache.org/repos/asf/mesos/blob/c68f6d71/src/master/metrics.hpp
----------------------------------------------------------------------
diff --git a/src/master/metrics.hpp b/src/master/metrics.hpp
index 2d07a16..a3c0c0c 100644
--- a/src/master/metrics.hpp
+++ b/src/master/metrics.hpp
@@ -130,6 +130,7 @@ struct Metrics
   process::metrics::Counter messages_launch_tasks;
   process::metrics::Counter messages_decline_offers;
   process::metrics::Counter messages_revive_offers;
+  process::metrics::Counter messages_quiesce_offers;
   process::metrics::Counter messages_reconcile_tasks;
   process::metrics::Counter messages_framework_to_executor;
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/c68f6d71/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index 2cb8b3c..a044286 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -1511,6 +1511,7 @@ TEST_F(MasterTest, MetricsInMetricsEndpoint)
   EXPECT_EQ(1u, snapshot.values.count("master/messages_launch_tasks"));
   EXPECT_EQ(1u, snapshot.values.count("master/messages_decline_offers"));
   EXPECT_EQ(1u, snapshot.values.count("master/messages_revive_offers"));
+  EXPECT_EQ(1u, snapshot.values.count("master/messages_quiesce_offers"));
   EXPECT_EQ(1u, snapshot.values.count("master/messages_reconcile_tasks"));
   EXPECT_EQ(1u, snapshot.values.count("master/messages_framework_to_executor"));
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/c68f6d71/src/tests/metrics_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/metrics_tests.cpp b/src/tests/metrics_tests.cpp
index 3e9d7c2..9b7f84a 100644
--- a/src/tests/metrics_tests.cpp
+++ b/src/tests/metrics_tests.cpp
@@ -97,6 +97,7 @@ TEST_F(MetricsTest, Master)
   EXPECT_EQ(1u, stats.values.count("master/messages_launch_tasks"));
   EXPECT_EQ(1u, stats.values.count("master/messages_decline_offers"));
   EXPECT_EQ(1u, stats.values.count("master/messages_revive_offers"));
+  EXPECT_EQ(1u, stats.values.count("master/messages_quiesce_offers"));
   EXPECT_EQ(1u, stats.values.count("master/messages_reconcile_tasks"));
   EXPECT_EQ(1u, stats.values.count("master/messages_framework_to_executor"));
 


[6/6] mesos git commit: Added V1 Support for QuiesceOffers.

Posted by vi...@apache.org.
Added V1 Support for QuiesceOffers.

Review: https://reviews.apache.org/r/38124


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/63f1c2ec
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/63f1c2ec
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/63f1c2ec

Branch: refs/heads/master
Commit: 63f1c2ec861a8fd527c89a37ce0f87b4735aa39f
Parents: dd3fbe8
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:16:19 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:16:19 2015 -0700

----------------------------------------------------------------------
 include/mesos/v1/scheduler/scheduler.proto |   1 +
 src/master/http.cpp                        |   4 +
 src/master/validation.cpp                  |   3 +
 src/tests/scheduler_tests.cpp              | 106 ++++++++++++++++++++++++
 4 files changed, 114 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/63f1c2ec/include/mesos/v1/scheduler/scheduler.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/scheduler/scheduler.proto b/include/mesos/v1/scheduler/scheduler.proto
index 0118b46..bc19b8d 100644
--- a/include/mesos/v1/scheduler/scheduler.proto
+++ b/include/mesos/v1/scheduler/scheduler.proto
@@ -174,6 +174,7 @@ message Call {
     RECONCILE = 9;   // See 'Reconcile' below.
     MESSAGE = 10;    // See 'Message' below.
     REQUEST = 11;    // See 'Request' below.
+    QUIESCE = 12;    // Inform master to stop sending offers to the framework.
 
     // TODO(benh): Consider adding an 'ACTIVATE' and 'DEACTIVATE' for
     // already subscribed frameworks as a way of stopping offers from

http://git-wip-us.apache.org/repos/asf/mesos/blob/63f1c2ec/src/master/http.cpp
----------------------------------------------------------------------
diff --git a/src/master/http.cpp b/src/master/http.cpp
index 8bb5935..7cca8b1 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -482,6 +482,10 @@ Future<Response> Master::Http::scheduler(const Request& request) const
       master->revive(framework);
       return Accepted();
 
+    case scheduler::Call::QUIESCE:
+      master->quiesce(framework);
+      return Accepted();
+
     case scheduler::Call::KILL:
       master->kill(framework, call.kill());
       return Accepted();

http://git-wip-us.apache.org/repos/asf/mesos/blob/63f1c2ec/src/master/validation.cpp
----------------------------------------------------------------------
diff --git a/src/master/validation.cpp b/src/master/validation.cpp
index f97eba6..0f3fc1a 100644
--- a/src/master/validation.cpp
+++ b/src/master/validation.cpp
@@ -97,6 +97,9 @@ Option<Error> validate(const mesos::scheduler::Call& call)
     case mesos::scheduler::Call::REVIVE:
       return None();
 
+    case mesos::scheduler::Call::QUIESCE:
+      return None();
+
     case mesos::scheduler::Call::KILL:
       if (!call.has_kill()) {
         return Error("Expecting 'kill' to be present");

http://git-wip-us.apache.org/repos/asf/mesos/blob/63f1c2ec/src/tests/scheduler_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/scheduler_tests.cpp b/src/tests/scheduler_tests.cpp
index 77c2635..0f892f9 100644
--- a/src/tests/scheduler_tests.cpp
+++ b/src/tests/scheduler_tests.cpp
@@ -941,6 +941,112 @@ TEST_P(SchedulerTest, Revive)
 }
 
 
+TEST_P(SchedulerTest, Quiesce)
+{
+  master::Flags flags = CreateMasterFlags();
+  flags.authenticate_frameworks = false;
+
+  Try<PID<Master>> master = StartMaster(flags);
+  ASSERT_SOME(master);
+
+  Try<PID<Slave>> slave = StartSlave();
+  ASSERT_SOME(slave);
+
+  Callbacks callbacks;
+
+  Future<Nothing> connected;
+  EXPECT_CALL(callbacks, connected())
+    .WillOnce(FutureSatisfy(&connected));
+
+  Mesos mesos(
+      master.get(),
+      GetParam(),
+      lambda::bind(&Callbacks::connected, lambda::ref(callbacks)),
+      lambda::bind(&Callbacks::disconnected, lambda::ref(callbacks)),
+      lambda::bind(&Callbacks::received, lambda::ref(callbacks), lambda::_1));
+
+  AWAIT_READY(connected);
+
+  Queue<Event> events;
+
+  EXPECT_CALL(callbacks, received(_))
+    .WillRepeatedly(Enqueue(&events));
+
+  {
+    Call call;
+    call.set_type(Call::SUBSCRIBE);
+
+    Call::Subscribe* subscribe = call.mutable_subscribe();
+    subscribe->mutable_framework_info()->CopyFrom(DEFAULT_V1_FRAMEWORK_INFO);
+
+    mesos.send(call);
+  }
+
+  Future<Event> event = events.get();
+  AWAIT_READY(event);
+  EXPECT_EQ(Event::SUBSCRIBED, event.get().type());
+
+  v1::FrameworkID id(event.get().subscribed().framework_id());
+
+  event = events.get();
+  AWAIT_READY(event);
+  EXPECT_EQ(Event::OFFERS, event.get().type());
+  EXPECT_NE(0, event.get().offers().offers().size());
+
+  v1::Offer offer = event.get().offers().offers(0);
+  {
+    Call call;
+    call.mutable_framework_id()->CopyFrom(id);
+    call.set_type(Call::DECLINE);
+
+    Call::Decline* decline = call.mutable_decline();
+    decline->add_offer_ids()->CopyFrom(offer.id());
+
+    // Set 1hr filter to not immediately get another offer.
+    v1::Filters filters;
+    filters.set_refuse_seconds(Hours(1).secs());
+    decline->mutable_filters()->CopyFrom(filters);
+
+    mesos.send(call);
+  }
+
+  {
+    Call call;
+    call.mutable_framework_id()->CopyFrom(id);
+    call.set_type(Call::QUIESCE);
+
+    mesos.send(call);
+  }
+
+  // No offers should be sent within 100 mins because the framework
+  // quiesced offers.
+  Clock::pause();
+  Clock::advance(Minutes(100));
+  Clock::settle();
+
+  event = events.get();
+  ASSERT_TRUE(event.isPending());
+
+  // On revival the quiescent should be set as false and the scheduler
+  // should get another offer with same amount of resources. Framework
+  // should receive offers only after calling reviving offers.
+  {
+    Call call;
+    call.mutable_framework_id()->CopyFrom(id);
+    call.set_type(Call::REVIVE);
+
+    mesos.send(call);
+  }
+
+  AWAIT_READY(event);
+  EXPECT_EQ(Event::OFFERS, event.get().type());
+  EXPECT_NE(0, event.get().offers().offers().size());
+  ASSERT_EQ(offer.resources(), event.get().offers().offers(0).resources());
+
+  Shutdown(); // Must shutdown before 'containerizer' gets deallocated.
+}
+
+
 TEST_P(SchedulerTest, Message)
 {
   master::Flags flags = CreateMasterFlags();


[4/6] mesos git commit: Added Java Support for QuiesceOffers.

Posted by vi...@apache.org.
Added Java Support for QuiesceOffers.

Review: https://reviews.apache.org/r/38120


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/9c20b5d4
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/9c20b5d4
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/9c20b5d4

Branch: refs/heads/master
Commit: 9c20b5d46f6c6d99802bf4cb1e461e594c347b64
Parents: c68f6d7
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:15:31 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:15:31 2015 -0700

----------------------------------------------------------------------
 .../org_apache_mesos_MesosSchedulerDriver.cpp   | 20 ++++++++++++++++++++
 .../org/apache/mesos/MesosSchedulerDriver.java  |  2 ++
 .../src/org/apache/mesos/SchedulerDriver.java   | 10 ++++++++++
 3 files changed, 32 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/9c20b5d4/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
----------------------------------------------------------------------
diff --git a/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp b/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
index a89ebed..d8acc4f 100644
--- a/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
+++ b/src/java/jni/org_apache_mesos_MesosSchedulerDriver.cpp
@@ -988,6 +988,26 @@ JNIEXPORT jobject JNICALL Java_org_apache_mesos_MesosSchedulerDriver_reviveOffer
 
 /*
  * Class:     org_apache_mesos_MesosSchedulerDriver
+ * Method:    quiesceOffers
+ * Signature: ()Lorg/apache/mesos/Protos/Status;
+ */
+JNIEXPORT jobject JNICALL Java_org_apache_mesos_MesosSchedulerDriver_quiesceOffers
+  (JNIEnv* env, jobject thiz)
+{
+  jclass clazz = env->GetObjectClass(thiz);
+
+  jfieldID __driver = env->GetFieldID(clazz, "__driver", "J");
+  MesosSchedulerDriver* driver =
+    (MesosSchedulerDriver*) env->GetLongField(thiz, __driver);
+
+  Status status = driver->quiesceOffers();
+
+  return convert<Status>(env, status);
+}
+
+
+/*
+ * Class:     org_apache_mesos_MesosSchedulerDriver
  * Method:    requestResources
  * Signature: (Ljava/util/Collection;)Lorg/apache/mesos/Protos/Status;
  */

http://git-wip-us.apache.org/repos/asf/mesos/blob/9c20b5d4/src/java/src/org/apache/mesos/MesosSchedulerDriver.java
----------------------------------------------------------------------
diff --git a/src/java/src/org/apache/mesos/MesosSchedulerDriver.java b/src/java/src/org/apache/mesos/MesosSchedulerDriver.java
index b9b2ea8..de88463 100644
--- a/src/java/src/org/apache/mesos/MesosSchedulerDriver.java
+++ b/src/java/src/org/apache/mesos/MesosSchedulerDriver.java
@@ -288,6 +288,8 @@ public class MesosSchedulerDriver implements SchedulerDriver {
 
   public native Status reviveOffers();
 
+  public native Status quiesceOffers();
+
   public native Status acknowledgeStatusUpdate(TaskStatus status);
 
   public native Status sendFrameworkMessage(ExecutorID executorId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/9c20b5d4/src/java/src/org/apache/mesos/SchedulerDriver.java
----------------------------------------------------------------------
diff --git a/src/java/src/org/apache/mesos/SchedulerDriver.java b/src/java/src/org/apache/mesos/SchedulerDriver.java
index 183eec8..ba4bc58 100644
--- a/src/java/src/org/apache/mesos/SchedulerDriver.java
+++ b/src/java/src/org/apache/mesos/SchedulerDriver.java
@@ -251,6 +251,16 @@ public interface SchedulerDriver {
   Status reviveOffers();
 
   /**
+   * Inform Mesos master to stop sending offers to the framework. The
+   * scheduler should call reviveOffers() to resume getting offers.
+   *
+   * @return    The state of the driver after the call.
+   *
+   * @see Status
+   */
+  Status quiesceOffers();
+
+  /**
    * Acknowledges the status update. This should only be called
    * once the status update is processed durably by the scheduler.
    * Not that explicit acknowledgements must be requested via the


[2/6] mesos git commit: Added quiesce logic in allocator.

Posted by vi...@apache.org.
Added quiesce logic in allocator.

Review: https://reviews.apache.org/r/37873


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3de5bf08
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3de5bf08
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3de5bf08

Branch: refs/heads/master
Commit: 3de5bf088b595b8c0f38cb24743465f586e0d81d
Parents: 3a1f2d3
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:13:44 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:13:44 2015 -0700

----------------------------------------------------------------------
 include/mesos/master/allocator.hpp          |  4 ++++
 src/master/allocator/mesos/allocator.hpp    | 17 +++++++++++++++++
 src/master/allocator/mesos/hierarchical.hpp | 24 ++++++++++++++++++++++++
 src/master/master.cpp                       |  3 +--
 src/tests/mesos.hpp                         | 13 +++++++++++++
 5 files changed, 59 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3de5bf08/include/mesos/master/allocator.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/master/allocator.hpp b/include/mesos/master/allocator.hpp
index fb09e2a..2dc6312 100644
--- a/include/mesos/master/allocator.hpp
+++ b/include/mesos/master/allocator.hpp
@@ -171,6 +171,10 @@ public:
   // offers for those resources the master invokes this callback.
   virtual void reviveOffers(
       const FrameworkID& frameworkId) = 0;
+
+  // Informs the allocator to stop sending resources for the framework
+  virtual void quiesceOffers(
+      const FrameworkID& frameworkId) = 0;
 };
 
 } // namespace allocator {

http://git-wip-us.apache.org/repos/asf/mesos/blob/3de5bf08/src/master/allocator/mesos/allocator.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/allocator.hpp b/src/master/allocator/mesos/allocator.hpp
index 171548b..86f6c55 100644
--- a/src/master/allocator/mesos/allocator.hpp
+++ b/src/master/allocator/mesos/allocator.hpp
@@ -127,6 +127,9 @@ public:
       const Resources& resources,
       const Option<Filters>& filters);
 
+  void quiesceOffers(
+      const FrameworkID& frameworkId);
+
   void reviveOffers(
       const FrameworkID& frameworkId);
 
@@ -231,6 +234,9 @@ public:
       const Resources& resources,
       const Option<Filters>& filters) = 0;
 
+  virtual void quiesceOffers(
+      const FrameworkID& frameworkId) = 0;
+
   virtual void reviveOffers(
       const FrameworkID& frameworkId) = 0;
 };
@@ -509,6 +515,17 @@ inline void MesosAllocator<AllocatorProcess>::recoverResources(
 
 
 template <typename AllocatorProcess>
+inline void MesosAllocator<AllocatorProcess>::quiesceOffers(
+    const FrameworkID& frameworkId)
+{
+  process::dispatch(
+      process,
+      &MesosAllocatorProcess::quiesceOffers,
+      frameworkId);
+}
+
+
+template <typename AllocatorProcess>
 inline void MesosAllocator<AllocatorProcess>::reviveOffers(
     const FrameworkID& frameworkId)
 {

http://git-wip-us.apache.org/repos/asf/mesos/blob/3de5bf08/src/master/allocator/mesos/hierarchical.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/hierarchical.hpp b/src/master/allocator/mesos/hierarchical.hpp
index 3374d63..8f2232a 100644
--- a/src/master/allocator/mesos/hierarchical.hpp
+++ b/src/master/allocator/mesos/hierarchical.hpp
@@ -165,6 +165,9 @@ public:
       const Resources& resources,
       const Option<Filters>& filters);
 
+  void quiesceOffers(
+      const FrameworkID& frameworkId);
+
   void reviveOffers(
       const FrameworkID& frameworkId);
 
@@ -241,6 +244,9 @@ protected:
     std::string role;
     bool checkpoint;  // Whether the framework desires checkpointing.
 
+    // Whether the framework quiesces resources.
+    bool quiesced;
+
     // Whether the framework desires revocable resources.
     bool revocable;
 
@@ -450,6 +456,8 @@ HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::addFramework(
     }
   }
 
+  frameworks[frameworkId].quiesced = false;
+
   LOG(INFO) << "Added framework " << frameworkId;
 
   allocate();
@@ -1006,12 +1014,23 @@ HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::recoverResources(
 
 template <class RoleSorter, class FrameworkSorter>
 void
+HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::quiesceOffers(
+    const FrameworkID& frameworkId)
+{
+  CHECK(initialized);
+  frameworks[frameworkId].quiesced = true;
+}
+
+
+template <class RoleSorter, class FrameworkSorter>
+void
 HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::reviveOffers(
     const FrameworkID& frameworkId)
 {
   CHECK(initialized);
 
   frameworks[frameworkId].filters.clear();
+  frameworks[frameworkId].quiesced = false;
 
   // We delete each actual Filter when
   // HierarchicalAllocatorProcess::expire gets invoked. If we delete the
@@ -1101,6 +1120,11 @@ HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::allocate(
         FrameworkID frameworkId;
         frameworkId.set_value(frameworkId_);
 
+        // If the framework has quiesced, ignore.
+        if (frameworks[frameworkId].quiesced) {
+          continue;
+        }
+
         // Calculate the currently available resources on the slave.
         Resources available = slaves[slaveId].total - slaves[slaveId].allocated;
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3de5bf08/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 7ae4ef8..151ce71 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -2607,8 +2607,7 @@ void Master::quiesce(Framework* framework)
 
   LOG(INFO) << "Processing QUIESCE call for framework " << *framework;
 
-  //TODO(gyliu513): Add quiesce logic here.
-  LOG(WARNING) << "Not implemented yet, ignoring the QUIESCE call.";
+  allocator->quiesceOffers(framework->id());
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3de5bf08/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index 3db97ac..760dcb7 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -1380,6 +1380,12 @@ ACTION_P2(InvokeRecoverResourcesWithFilters, allocator, timeout)
 }
 
 
+ACTION_P(InvokeQuiesceOffers, allocator)
+{
+  allocator->real->quiesceOffers(arg0);
+}
+
+
 ACTION_P(InvokeReviveOffers, allocator)
 {
   allocator->real->reviveOffers(arg0);
@@ -1507,6 +1513,11 @@ public:
       .WillByDefault(InvokeReviveOffers(this));
     EXPECT_CALL(*this, reviveOffers(_))
       .WillRepeatedly(DoDefault());
+
+    ON_CALL(*this, quiesceOffers(_))
+      .WillByDefault(InvokeQuiesceOffers(this));
+    EXPECT_CALL(*this, quiesceOffers(_))
+      .WillRepeatedly(DoDefault());
   }
 
   virtual ~TestAllocator() {}
@@ -1592,6 +1603,8 @@ public:
 
   MOCK_METHOD1(reviveOffers, void(const FrameworkID&));
 
+  MOCK_METHOD1(quiesceOffers, void(const FrameworkID&));
+
   process::Owned<mesos::master::allocator::Allocator> real;
 };
 


[5/6] mesos git commit: Added Python Support for QuiesceOffers.

Posted by vi...@apache.org.
Added Python Support for QuiesceOffers.

Review: https://reviews.apache.org/r/38121


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

Branch: refs/heads/master
Commit: dd3fbe815b0edb74fec4101776af2830f47f90d5
Parents: 9c20b5d
Author: Guangya Liu <gy...@gmail.com>
Authored: Fri Sep 18 16:15:55 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Fri Sep 18 16:15:55 2015 -0700

----------------------------------------------------------------------
 .../interface/src/mesos/interface/__init__.py      |  6 ++++++
 .../mesos/native/mesos_scheduler_driver_impl.cpp   | 17 +++++++++++++++++
 .../mesos/native/mesos_scheduler_driver_impl.hpp   |  3 +++
 3 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/dd3fbe81/src/python/interface/src/mesos/interface/__init__.py
----------------------------------------------------------------------
diff --git a/src/python/interface/src/mesos/interface/__init__.py b/src/python/interface/src/mesos/interface/__init__.py
index 686abb2..cd60ead 100644
--- a/src/python/interface/src/mesos/interface/__init__.py
+++ b/src/python/interface/src/mesos/interface/__init__.py
@@ -230,6 +230,12 @@ class SchedulerDriver(object):
       those filtered slaves.
     """
 
+  def quiesceOffers(self):
+    """
+      Inform Mesos master to stop sending offers to the framework. The
+      scheduler should call reviveOffers() to resume getting offers.
+    """
+
   def acknowledgeStatusUpdate(self, status):
     """
       Acknowledges the status update. This should only be called

http://git-wip-us.apache.org/repos/asf/mesos/blob/dd3fbe81/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.cpp
----------------------------------------------------------------------
diff --git a/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.cpp b/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.cpp
index 609dfa3..10208b1 100644
--- a/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.cpp
+++ b/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.cpp
@@ -143,6 +143,11 @@ PyMethodDef MesosSchedulerDriverImpl_methods[] = {
     METH_NOARGS,
     "Remove all filters and ask Mesos for new offers"
   },
+  { "quiesceOffers",
+    (PyCFunction) MesosSchedulerDriverImpl_quiesceOffers,
+    METH_NOARGS,
+    "Set quiescent attribute as true for the Framework"
+  },
   { "acknowledgeStatusUpdate",
     (PyCFunction) MesosSchedulerDriverImpl_acknowledgeStatusUpdate,
     METH_VARARGS,
@@ -654,6 +659,18 @@ PyObject* MesosSchedulerDriverImpl_reviveOffers(MesosSchedulerDriverImpl* self)
 }
 
 
+PyObject* MesosSchedulerDriverImpl_quiesceOffers(MesosSchedulerDriverImpl* self)
+{
+  if (self->driver == NULL) {
+    PyErr_Format(PyExc_Exception, "MesosSchedulerDriverImpl.driver is NULL");
+    return NULL;
+  }
+
+  Status status = self->driver->quiesceOffers();
+  return PyInt_FromLong(status); // Sets exception if creating long fails.
+}
+
+
 PyObject* MesosSchedulerDriverImpl_acknowledgeStatusUpdate(
     MesosSchedulerDriverImpl* self,
     PyObject* args)

http://git-wip-us.apache.org/repos/asf/mesos/blob/dd3fbe81/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.hpp
----------------------------------------------------------------------
diff --git a/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.hpp b/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.hpp
index b1ad8e5..04e3190 100644
--- a/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.hpp
+++ b/src/python/native/src/mesos/native/mesos_scheduler_driver_impl.hpp
@@ -115,6 +115,9 @@ PyObject* MesosSchedulerDriverImpl_declineOffer(
 
 PyObject* MesosSchedulerDriverImpl_reviveOffers(MesosSchedulerDriverImpl* self);
 
+PyObject* MesosSchedulerDriverImpl_quiesceOffers(
+    MesosSchedulerDriverImpl* self);
+
 PyObject* MesosSchedulerDriverImpl_acknowledgeStatusUpdate(
     MesosSchedulerDriverImpl* self,
     PyObject* args);