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;
 

Reply via email to