You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by al...@apache.org on 2018/08/28 19:50:11 UTC

[mesos] 01/06: Added '/state-summary' to the set of batched master endpoints.

This is an automated email from the ASF dual-hosted git repository.

alexr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit 4118a482a95793252f4713c5e20ef2c70f2ab07b
Author: Benno Evers <be...@mesosphere.com>
AuthorDate: Tue Aug 28 21:25:52 2018 +0200

    Added '/state-summary' to the set of batched master endpoints.
    
    Review: https://reviews.apache.org/r/68321/
---
 src/master/http.cpp   | 268 ++++++++++++++++++++++++++------------------------
 src/master/master.hpp |   7 ++
 2 files changed, 146 insertions(+), 129 deletions(-)

diff --git a/src/master/http.cpp b/src/master/http.cpp
index ae28d52..5cd177e 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -3334,147 +3334,157 @@ Future<Response> Master::Http::stateSummary(
       {VIEW_ROLE, VIEW_FRAMEWORK})
     .then(defer(
         master->self(),
-        [this, request](const Owned<ObjectApprovers>& approvers) -> Response {
-          auto stateSummary = [this, &approvers](JSON::ObjectWriter* writer) {
-            writer->field("hostname", master->info().hostname());
+        [this, request](const Owned<ObjectApprovers>& approvers) {
+          return deferBatchedRequest(
+              &Master::ReadOnlyHandler::stateSummary, request, approvers);
+        }));
+}
 
-            if (master->flags.cluster.isSome()) {
-              writer->field("cluster", master->flags.cluster.get());
-            }
 
-            // We use the tasks in the 'Frameworks' struct to compute summaries
-            // for this endpoint. This is done 1) for consistency between the
-            // 'slaves' and 'frameworks' subsections below 2) because we want to
-            // provide summary information for frameworks that are currently
-            // registered 3) the frameworks keep a circular buffer of completed
-            // tasks that we can use to keep a limited view on the history of
-            // recent completed / failed tasks.
+process::http::Response Master::ReadOnlyHandler::stateSummary(
+    const process::http::Request& request,
+    const process::Owned<ObjectApprovers>& approvers) const
+{
+  const Master* master = this->master;
+  auto stateSummary = [master, &approvers](JSON::ObjectWriter* writer) {
+    writer->field("hostname", master->info().hostname());
 
-            // Generate mappings from 'slave' to 'framework' and reverse.
-            SlaveFrameworkMapping slaveFrameworkMapping(
-                master->frameworks.registered);
+    if (master->flags.cluster.isSome()) {
+      writer->field("cluster", master->flags.cluster.get());
+    }
 
-            // Generate 'TaskState' summaries for all framework and slave ids.
-            TaskStateSummaries taskStateSummaries(
-                master->frameworks.registered);
+    // We use the tasks in the 'Frameworks' struct to compute summaries
+    // for this endpoint. This is done 1) for consistency between the
+    // 'slaves' and 'frameworks' subsections below 2) because we want to
+    // provide summary information for frameworks that are currently
+    // registered 3) the frameworks keep a circular buffer of completed
+    // tasks that we can use to keep a limited view on the history of
+    // recent completed / failed tasks.
 
-            // Model all of the slaves.
-            writer->field(
-                "slaves",
-                [this,
+    // Generate mappings from 'slave' to 'framework' and reverse.
+    SlaveFrameworkMapping slaveFrameworkMapping(
+        master->frameworks.registered);
+
+    // Generate 'TaskState' summaries for all framework and slave ids.
+    TaskStateSummaries taskStateSummaries(
+        master->frameworks.registered);
+
+    // Model all of the slaves.
+    writer->field(
+        "slaves",
+        [master,
+         &slaveFrameworkMapping,
+         &taskStateSummaries,
+         &approvers](JSON::ArrayWriter* writer) {
+          foreachvalue (Slave* slave, master->slaves.registered) {
+            writer->element(
+                [&slave,
                  &slaveFrameworkMapping,
                  &taskStateSummaries,
-                 &approvers](JSON::ArrayWriter* writer) {
-                  foreachvalue (Slave* slave, master->slaves.registered) {
-                    writer->element(
-                        [&slave,
-                         &slaveFrameworkMapping,
-                         &taskStateSummaries,
-                         &approvers](JSON::ObjectWriter* writer) {
-                          SlaveWriter slaveWriter(*slave, approvers);
-                          slaveWriter(writer);
-
-                          // Add the 'TaskState' summary for this slave.
-                          const TaskStateSummary& summary =
-                              taskStateSummaries.slave(slave->id);
-
-                          // Certain per-agent status totals will always be zero
-                          // (e.g., TASK_ERROR, TASK_UNREACHABLE). We report
-                          // them here anyway, for completeness.
-                          //
-                          // TODO(neilc): Update for TASK_GONE and
-                          // TASK_GONE_BY_OPERATOR.
-                          writer->field("TASK_STAGING", summary.staging);
-                          writer->field("TASK_STARTING", summary.starting);
-                          writer->field("TASK_RUNNING", summary.running);
-                          writer->field("TASK_KILLING", summary.killing);
-                          writer->field("TASK_FINISHED", summary.finished);
-                          writer->field("TASK_KILLED", summary.killed);
-                          writer->field("TASK_FAILED", summary.failed);
-                          writer->field("TASK_LOST", summary.lost);
-                          writer->field("TASK_ERROR", summary.error);
-                          writer->field(
-                              "TASK_UNREACHABLE",
-                              summary.unreachable);
-
-                          // Add the ids of all the frameworks running on this
-                          // slave.
-                          const hashset<FrameworkID>& frameworks =
-                              slaveFrameworkMapping.frameworks(slave->id);
-
-                          writer->field(
-                              "framework_ids",
-                              [&frameworks](JSON::ArrayWriter* writer) {
-                                foreach (
-                                    const FrameworkID& frameworkId,
-                                    frameworks) {
-                                  writer->element(frameworkId.value());
-                                }
-                              });
-                        });
-                  }
+                 &approvers](JSON::ObjectWriter* writer) {
+                  SlaveWriter slaveWriter(*slave, approvers);
+                  slaveWriter(writer);
+
+                  // Add the 'TaskState' summary for this slave.
+                  const TaskStateSummary& summary =
+                      taskStateSummaries.slave(slave->id);
+
+                  // Certain per-agent status totals will always be zero
+                  // (e.g., TASK_ERROR, TASK_UNREACHABLE). We report
+                  // them here anyway, for completeness.
+                  //
+                  // TODO(neilc): Update for TASK_GONE and
+                  // TASK_GONE_BY_OPERATOR.
+                  writer->field("TASK_STAGING", summary.staging);
+                  writer->field("TASK_STARTING", summary.starting);
+                  writer->field("TASK_RUNNING", summary.running);
+                  writer->field("TASK_KILLING", summary.killing);
+                  writer->field("TASK_FINISHED", summary.finished);
+                  writer->field("TASK_KILLED", summary.killed);
+                  writer->field("TASK_FAILED", summary.failed);
+                  writer->field("TASK_LOST", summary.lost);
+                  writer->field("TASK_ERROR", summary.error);
+                  writer->field(
+                      "TASK_UNREACHABLE",
+                      summary.unreachable);
+
+                  // Add the ids of all the frameworks running on this
+                  // slave.
+                  const hashset<FrameworkID>& frameworks =
+                      slaveFrameworkMapping.frameworks(slave->id);
+
+                  writer->field(
+                      "framework_ids",
+                      [&frameworks](JSON::ArrayWriter* writer) {
+                        foreach (
+                            const FrameworkID& frameworkId,
+                            frameworks) {
+                          writer->element(frameworkId.value());
+                        }
+                      });
                 });
+          }
+        });
 
-            // Model all of the frameworks.
-            writer->field(
-                "frameworks",
-                [this,
-                 &slaveFrameworkMapping,
-                 &taskStateSummaries,
-                 &approvers](JSON::ArrayWriter* writer) {
-                  foreachpair (const FrameworkID& frameworkId,
-                               Framework* framework,
-                               master->frameworks.registered) {
-                    // Skip unauthorized frameworks.
-                    if (!approvers->approved<VIEW_FRAMEWORK>(framework->info)) {
-                      continue;
-                    }
+    // Model all of the frameworks.
+    writer->field(
+        "frameworks",
+        [master,
+         &slaveFrameworkMapping,
+         &taskStateSummaries,
+         &approvers](JSON::ArrayWriter* writer) {
+          foreachpair (const FrameworkID& frameworkId,
+                       Framework* framework,
+                       master->frameworks.registered) {
+            // Skip unauthorized frameworks.
+            if (!approvers->approved<VIEW_FRAMEWORK>(framework->info)) {
+              continue;
+            }
 
-                    writer->element(
-                        [&frameworkId,
-                         &framework,
-                         &slaveFrameworkMapping,
-                         &taskStateSummaries](JSON::ObjectWriter* writer) {
-                          json(writer, Summary<Framework>(*framework));
-
-                          // Add the 'TaskState' summary for this framework.
-                          const TaskStateSummary& summary =
-                              taskStateSummaries.framework(frameworkId);
-
-                          // TODO(neilc): Update for TASK_GONE and
-                          // TASK_GONE_BY_OPERATOR.
-                          writer->field("TASK_STAGING", summary.staging);
-                          writer->field("TASK_STARTING", summary.starting);
-                          writer->field("TASK_RUNNING", summary.running);
-                          writer->field("TASK_KILLING", summary.killing);
-                          writer->field("TASK_FINISHED", summary.finished);
-                          writer->field("TASK_KILLED", summary.killed);
-                          writer->field("TASK_FAILED", summary.failed);
-                          writer->field("TASK_LOST", summary.lost);
-                          writer->field("TASK_ERROR", summary.error);
-                          writer->field(
-                              "TASK_UNREACHABLE",
-                              summary.unreachable);
-
-                          // Add the ids of all the slaves running
-                          // this framework.
-                          const hashset<SlaveID>& slaves =
-                              slaveFrameworkMapping.slaves(frameworkId);
-
-                          writer->field(
-                              "slave_ids",
-                              [&slaves](JSON::ArrayWriter* writer) {
-                                foreach (const SlaveID& slaveId, slaves) {
-                                  writer->element(slaveId.value());
-                                }
-                              });
-                        });
-                  }
+            writer->element(
+                [&frameworkId,
+                 &framework,
+                 &slaveFrameworkMapping,
+                 &taskStateSummaries](JSON::ObjectWriter* writer) {
+                  json(writer, Summary<Framework>(*framework));
+
+                  // Add the 'TaskState' summary for this framework.
+                  const TaskStateSummary& summary =
+                      taskStateSummaries.framework(frameworkId);
+
+                  // TODO(neilc): Update for TASK_GONE and
+                  // TASK_GONE_BY_OPERATOR.
+                  writer->field("TASK_STAGING", summary.staging);
+                  writer->field("TASK_STARTING", summary.starting);
+                  writer->field("TASK_RUNNING", summary.running);
+                  writer->field("TASK_KILLING", summary.killing);
+                  writer->field("TASK_FINISHED", summary.finished);
+                  writer->field("TASK_KILLED", summary.killed);
+                  writer->field("TASK_FAILED", summary.failed);
+                  writer->field("TASK_LOST", summary.lost);
+                  writer->field("TASK_ERROR", summary.error);
+                  writer->field(
+                      "TASK_UNREACHABLE",
+                      summary.unreachable);
+
+                  // Add the ids of all the slaves running
+                  // this framework.
+                  const hashset<SlaveID>& slaves =
+                      slaveFrameworkMapping.slaves(frameworkId);
+
+                  writer->field(
+                      "slave_ids",
+                      [&slaves](JSON::ArrayWriter* writer) {
+                        foreach (const SlaveID& slaveId, slaves) {
+                          writer->element(slaveId.value());
+                        }
+                      });
                 });
-          };
+          }
+        });
+    };
 
-          return OK(jsonify(stateSummary), request.url.query.get("jsonp"));
-        }));
+  return OK(jsonify(stateSummary), request.url.query.get("jsonp"));
 }
 
 
diff --git a/src/master/master.hpp b/src/master/master.hpp
index 1e01dab..9db5aae 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -1401,6 +1401,11 @@ private:
         const process::http::Request& request,
         const process::Owned<ObjectApprovers>& approvers) const;
 
+    // /state-summary
+    process::http::Response stateSummary(
+        const process::http::Request& request,
+        const process::Owned<ObjectApprovers>& approvers) const;
+
   private:
     const Master* master;
   };
@@ -1492,6 +1497,8 @@ private:
             principal) const;
 
     // /master/state-summary
+    //
+    // NOTE: Requests to this endpoint are batched.
     process::Future<process::http::Response> stateSummary(
         const process::http::Request& request,
         const Option<process::http::authentication::Principal>&