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>&