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/07/23 21:33:15 UTC
[1/2] mesos git commit: Added HEARTBEAT event to the scheduler API.
Repository: mesos
Updated Branches:
refs/heads/master f0ee4aa3d -> dfd55d2a1
Added HEARTBEAT event to the scheduler API.
Review: https://reviews.apache.org/r/36708
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/dfd55d2a
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/dfd55d2a
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/dfd55d2a
Branch: refs/heads/master
Commit: dfd55d2a14f75f4e4581b9d3b75d0c7a9c546e69
Parents: 9225013
Author: Vinod Kone <vi...@gmail.com>
Authored: Wed Jul 22 15:05:37 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Thu Jul 23 12:32:56 2015 -0700
----------------------------------------------------------------------
include/mesos/scheduler/scheduler.proto | 15 +++++++++++++++
1 file changed, 15 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/dfd55d2a/include/mesos/scheduler/scheduler.proto
----------------------------------------------------------------------
diff --git a/include/mesos/scheduler/scheduler.proto b/include/mesos/scheduler/scheduler.proto
index 5219b76..89daf8a 100644
--- a/include/mesos/scheduler/scheduler.proto
+++ b/include/mesos/scheduler/scheduler.proto
@@ -42,11 +42,26 @@ message Event {
MESSAGE = 5; // See 'Message' below.
FAILURE = 6; // See 'Failure' below.
ERROR = 7; // See 'Error' below.
+
+ // Periodic message sent by the Mesos master according to
+ // 'Subscribed.heartbeat_interval_seconds'. If the scheduler does
+ // not receive any events (including heartbeats) for an extended
+ // period of time (e.g., 5 x heartbeat_interval_seconds), there is
+ // likely a network partition. In such a case the scheduler should
+ // close the existing subscription connection and resubscribe
+ // using a backoff strategy.
+ HEARTBEAT = 8;
}
// First event received when the scheduler subscribes.
message Subscribed {
required FrameworkID framework_id = 1;
+
+ // This value will be set if the master is sending heartbeats. See
+ // the comment above on 'HEARTBEAT' for more details.
+ // TODO(vinod): Implement heartbeats in the master once the master
+ // can send HTTP events.
+ optional double heartbeat_interval_seconds = 2;
}
// Received whenever there are new resources that are offered to the
[2/2] mesos git commit: Updated scheduler library to send REQUEST
call.
Posted by vi...@apache.org.
Updated scheduler library to send REQUEST call.
Review: https://reviews.apache.org/r/36698
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/92250130
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/92250130
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/92250130
Branch: refs/heads/master
Commit: 922501309e41dcbe141fb33c08e7f9600ea0d6ff
Parents: f0ee4aa
Author: Vinod Kone <vi...@gmail.com>
Authored: Mon Jul 20 17:19:20 2015 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Thu Jul 23 12:32:56 2015 -0700
----------------------------------------------------------------------
include/mesos/mesos.proto | 2 -
include/mesos/scheduler/scheduler.proto | 12 +++++
src/master/master.cpp | 31 ++++++++++++-
src/master/master.hpp | 4 ++
src/scheduler/scheduler.cpp | 11 ++++-
src/tests/scheduler_tests.cpp | 66 ++++++++++++++++++++++++++++
6 files changed, 121 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/include/mesos/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto
index bcb38d9..e015c81 100644
--- a/include/mesos/mesos.proto
+++ b/include/mesos/mesos.proto
@@ -781,8 +781,6 @@ message PerfStatistics {
* to proactively influence the allocator. If 'slave_id' is provided
* then this request is assumed to only apply to resources on that
* slave.
- *
- * TODO(vinod): Remove this once the old driver is removed.
*/
message Request {
optional SlaveID slave_id = 1;
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/include/mesos/scheduler/scheduler.proto
----------------------------------------------------------------------
diff --git a/include/mesos/scheduler/scheduler.proto b/include/mesos/scheduler/scheduler.proto
index e2ca8e5..5219b76 100644
--- a/include/mesos/scheduler/scheduler.proto
+++ b/include/mesos/scheduler/scheduler.proto
@@ -154,6 +154,7 @@ message Call {
ACKNOWLEDGE = 8; // See 'Acknowledge' below.
RECONCILE = 9; // See 'Reconcile' below.
MESSAGE = 10; // See 'Message' below.
+ REQUEST = 11; // See 'Request' below.
// TODO(benh): Consider adding an 'ACTIVATE' and 'DEACTIVATE' for
// already subscribed frameworks as a way of stopping offers from
@@ -284,6 +285,16 @@ message Call {
required bytes data = 3;
}
+ // Requests a specific set of resources from Mesos's allocator. If
+ // the allocator has support for this, corresponding offers will be
+ // sent asynchronously via the OFFERS event(s).
+ //
+ // NOTE: The built-in hierarchical allocator doesn't have support
+ // for this call and hence simply ignores it.
+ message Request {
+ repeated mesos.Request requests = 1;
+ }
+
// Identifies who generated this call. Master assigns a framework id
// when a new scheduler subscribes for the first time. Once assigned,
// the scheduler must set the 'framework_id' here and within its
@@ -304,4 +315,5 @@ message Call {
optional Acknowledge acknowledge = 8;
optional Reconcile reconcile = 9;
optional Message message = 10;
+ optional Request request = 11;
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 2f00f24..bab04fe 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -1729,6 +1729,15 @@ void Master::receive(
break;
}
+ case scheduler::Call::REQUEST: {
+ if (!call.has_request()) {
+ drop(from, call, "Expecting 'request' to be present");
+ return;
+ }
+ request(framework, call.request());
+ break;
+ }
+
default:
drop(from, call, "Unknown call type");
break;
@@ -2263,8 +2272,26 @@ void Master::resourceRequest(
return;
}
- LOG(INFO) << "Requesting resources for framework " << *framework;
- allocator->requestResources(frameworkId, requests);
+ scheduler::Call::Request call;
+ foreach (const Request& request, requests) {
+ call.add_requests()->CopyFrom(request);
+ }
+
+ request(framework, call);
+}
+
+
+void Master::request(
+ Framework* framework,
+ const scheduler::Call::Request& request)
+{
+ CHECK_NOTNULL(framework);
+
+ LOG(INFO) << "Processing REQUEST call for framework " << *framework;
+
+ allocator->requestResources(
+ framework->id(),
+ google::protobuf::convert(request.requests()));
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/src/master/master.hpp
----------------------------------------------------------------------
diff --git a/src/master/master.hpp b/src/master/master.hpp
index 2343a68..bf61bb2 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -1045,6 +1045,10 @@ private:
Framework* framework,
const scheduler::Call::Message& message);
+ void request(
+ Framework* framework,
+ const scheduler::Call::Request& request);
+
bool elected() const
{
return leader.isSome() && leader.get() == info_;
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/src/scheduler/scheduler.cpp
----------------------------------------------------------------------
diff --git a/src/scheduler/scheduler.cpp b/src/scheduler/scheduler.cpp
index ac23585..badc107 100644
--- a/src/scheduler/scheduler.cpp
+++ b/src/scheduler/scheduler.cpp
@@ -306,8 +306,17 @@ public:
break;
}
+ case Call::REQUEST: {
+ if (!call.has_request()) {
+ drop(call, "Expecting 'request' to be present");
+ return;
+ }
+ send(master.get(), call);
+ break;
+ }
+
default:
- VLOG(1) << "Unexpected call " << stringify(call.type());
+ LOG(ERROR) << "Unexpected call " << stringify(call.type());
break;
}
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/92250130/src/tests/scheduler_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/scheduler_tests.cpp b/src/tests/scheduler_tests.cpp
index 13fecb2..98fc70b 100644
--- a/src/tests/scheduler_tests.cpp
+++ b/src/tests/scheduler_tests.cpp
@@ -45,11 +45,15 @@
#include <stout/try.hpp>
#include <stout/uuid.hpp>
+#include "master/allocator/mesos/allocator.hpp"
+
#include "master/master.hpp"
#include "tests/containerizer.hpp"
#include "tests/mesos.hpp"
+using mesos::internal::master::allocator::MesosAllocatorProcess;
+
using mesos::internal::master::Master;
using mesos::internal::slave::Containerizer;
@@ -1002,6 +1006,68 @@ TEST_F(SchedulerTest, Message)
}
+TEST_F(SchedulerTest, Request)
+{
+ Try<PID<Master>> master = StartMaster();
+ ASSERT_SOME(master);
+
+ Callbacks callbacks;
+
+ Future<Nothing> connected;
+ EXPECT_CALL(callbacks, connected())
+ .WillOnce(FutureSatisfy(&connected));
+
+ scheduler::Mesos mesos(
+ master.get(),
+ DEFAULT_CREDENTIAL,
+ 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_FRAMEWORK_INFO);
+
+ mesos.send(call);
+ }
+
+ Future<Event> event = events.get();
+ AWAIT_READY(event);
+ EXPECT_EQ(Event::SUBSCRIBED, event.get().type());
+
+ FrameworkID id(event.get().subscribed().framework_id());
+
+ Future<Nothing> requestResources =
+ FUTURE_DISPATCH(_, &MesosAllocatorProcess::requestResources);
+
+ {
+ Call call;
+ call.mutable_framework_id()->CopyFrom(id);
+ call.set_type(Call::REQUEST);
+
+ // Create a dummy request.
+ Call::Request* request = call.mutable_request();
+ request->add_requests();
+
+ mesos.send(call);
+ }
+
+ AWAIT_READY(requestResources);
+
+ Shutdown();
+}
+
+
// TODO(benh): Write test for sending Call::Acknowledgement through
// master to slave when Event::Update was generated locally.