Repository: mesos Updated Branches: refs/heads/master a6f1587f7 -> ec41d1aa8
Extracted task collection logic to helper function. Added a helper function _tasks() to collect tasks. This is to be used by both tasks() and getTasks() in operator API. Review: https://reviews.apache.org/r/48400/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/608e3823 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/608e3823 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/608e3823 Branch: refs/heads/master Commit: 608e3823dbc19fabf70687840f27b1a628ac0cd6 Parents: a6f1587 Author: Jay Guo <guojian...@cn.ibm.com> Authored: Fri Jun 17 19:50:35 2016 -0700 Committer: Vinod Kone <vinodk...@gmail.com> Committed: Fri Jun 17 19:50:35 2016 -0700 ---------------------------------------------------------------------- src/master/http.cpp | 75 +++++++++++++++++++++++++++++----------------- src/master/master.hpp | 6 ++++ 2 files changed, 53 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/608e3823/src/master/http.cpp ---------------------------------------------------------------------- diff --git a/src/master/http.cpp b/src/master/http.cpp index dca814b..2d326ef 100644 --- a/src/master/http.cpp +++ b/src/master/http.cpp @@ -2692,6 +2692,40 @@ Future<Response> Master::Http::tasks( return redirect(request); } + // Get list options (limit and offset). + Result<int> result = numify<int>(request.url.query.get("limit")); + size_t limit = result.isSome() ? result.get() : TASK_LIMIT; + + result = numify<int>(request.url.query.get("offset")); + size_t offset = result.isSome() ? result.get() : 0; + + Option<string> order = request.url.query.get("order"); + string _order = order.isSome() && (order.get() == "asc") ? "asc" : "des"; + + return _tasks(limit, offset, _order, principal) + .then([=](const vector<const Task*>& tasks) -> Response { + auto tasksWriter = [&tasks](JSON::ObjectWriter* writer) { + writer->field("tasks", [&tasks](JSON::ArrayWriter* writer) { + foreach (const Task* task, tasks) { + writer->element(*task); + } + }); + }; + + return OK(jsonify(tasksWriter), request.url.query.get("jsonp")); + }) + .repair([](const Future<Response>& response) { + LOG(WARNING) << "Authorization failed: " << response.failure(); + return InternalServerError(response.failure()); + }); +} + +Future<vector<const Task*>> Master::Http::_tasks( + const size_t limit, + const size_t offset, + const string& order, + const Option<string>& principal) const +{ // Retrieve Approvers for authorizing frameworks and tasks. Future<Owned<ObjectApprover>> frameworksApprover; Future<Owned<ObjectApprover>> tasksApprover; @@ -2717,23 +2751,16 @@ Future<Response> Master::Http::tasks( } return collect(frameworksApprover, tasksApprover, executorsApprover) - .then(defer(master->self(), - [=](const tuple<Owned<ObjectApprover>, - Owned<ObjectApprover>, - Owned<ObjectApprover>>& approvers) -> Response { + .then([=](const tuple<Owned<ObjectApprover>, + Owned<ObjectApprover>, + Owned<ObjectApprover>>& approvers) + -> vector<const Task*> { // Get approver from tuple. Owned<ObjectApprover> frameworksApprover; Owned<ObjectApprover> tasksApprover; Owned<ObjectApprover> executorsApprover; tie(frameworksApprover, tasksApprover, executorsApprover) = approvers; - // Get list options (limit and offset). - Result<int> result = numify<int>(request.url.query.get("limit")); - size_t limit = result.isSome() ? result.get() : TASK_LIMIT; - - result = numify<int>(request.url.query.get("offset")); - size_t offset = result.isSome() ? result.get() : 0; - // TODO(nnielsen): Currently, formatting errors in offset and/or limit // will silently be ignored. This could be reported to the user instead. @@ -2782,29 +2809,21 @@ Future<Response> Master::Http::tasks( // Sort tasks by task status timestamp. Default order is descending. // The earliest timestamp is chosen for comparison when // multiple are present. - Option<string> order = request.url.query.get("order"); - if (order.isSome() && (order.get() == "asc")) { + if (order == "asc") { sort(tasks.begin(), tasks.end(), TaskComparator::ascending); } else { sort(tasks.begin(), tasks.end(), TaskComparator::descending); } - auto tasksWriter = [&tasks, limit, offset](JSON::ObjectWriter* writer) { - writer->field("tasks", - [&tasks, limit, offset](JSON::ArrayWriter* writer) { - size_t end = std::min(offset + limit, tasks.size()); - for (size_t i = offset; i < end; i++) { - const Task* task = tasks[i]; - writer->element(*task); - } - }); - }; + // Collect 'limit' number of tasks starting from 'offset'. + vector<const Task*> _tasks; + size_t end = std::min(offset + limit, tasks.size()); + for (size_t i = offset; i < end; i++) { + const Task* task = tasks[i]; + _tasks.push_back(task); + } - return OK(jsonify(tasksWriter), request.url.query.get("jsonp")); - })) - .repair([](const Future<Response>& response) { - LOG(WARNING) << "Authorization failed: " << response.failure(); - return InternalServerError(response.failure()); + return _tasks; }); } http://git-wip-us.apache.org/repos/asf/mesos/blob/608e3823/src/master/master.hpp ---------------------------------------------------------------------- diff --git a/src/master/master.hpp b/src/master/master.hpp index 2bddfe1..ea846f9 100644 --- a/src/master/master.hpp +++ b/src/master/master.hpp @@ -1237,6 +1237,12 @@ private: private: JSON::Object _flags() const; + process::Future<std::vector<const Task*>> _tasks( + const size_t limit, + const size_t offset, + const std::string& order, + const Option<std::string>& principal) const; + process::Future<process::http::Response> _teardown( const FrameworkID& id) const;