You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by mp...@apache.org on 2016/02/01 05:34:47 UTC
[1/2] mesos git commit: Updated `json` to handle integral types
comprehensively.
Repository: mesos
Updated Branches:
refs/heads/master c9c67f74c -> 8ca4efc15
Updated `json` to handle integral types comprehensively.
Review: https://reviews.apache.org/r/42543
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b224995b
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b224995b
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b224995b
Branch: refs/heads/master
Commit: b224995b20fd8eb4c7c8832d29f1cc53093f260e
Parents: c9c67f7
Author: Michael Park <mp...@apache.org>
Authored: Tue Jan 19 20:08:53 2016 -0800
Committer: Michael Park <mp...@apache.org>
Committed: Sun Jan 31 20:06:14 2016 -0800
----------------------------------------------------------------------
.../3rdparty/stout/include/stout/jsonify.hpp | 103 +++++++++++++++----
1 file changed, 83 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/b224995b/3rdparty/libprocess/3rdparty/stout/include/stout/jsonify.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/jsonify.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/jsonify.hpp
index addec8e..f9d7224 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/jsonify.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/jsonify.hpp
@@ -128,7 +128,7 @@ class NumberWriter
{
public:
NumberWriter(std::ostream* stream)
- : stream_(stream), type_(INT64), int64_(0) {}
+ : stream_(stream), type_(INT), int_(0) {}
NumberWriter(const NumberWriter&) = delete;
NumberWriter(NumberWriter&&) = delete;
@@ -136,12 +136,12 @@ public:
~NumberWriter()
{
switch (type_) {
- case INT64: {
- *stream_ << int64_;
+ case INT: {
+ *stream_ << int_;
break;
}
- case UINT64: {
- *stream_ << uint64_;
+ case UINT: {
+ *stream_ << uint_;
break;
}
case DOUBLE: {
@@ -170,20 +170,52 @@ public:
NumberWriter& operator=(const NumberWriter&) = delete;
NumberWriter& operator=(NumberWriter&&) = delete;
- void set(int32_t value) { set(static_cast<int64_t>(value)); }
+ // NOTE 1: We enumerate overloads for all of the integral types here to avoid
+ // ambiguities between signed and unsigned conversions. If we were to only
+ // overload for `long long int` and `unsigned long long int`, passing an
+ // argument of `0` would be ambiguous since `0` has type `int`, and cost of
+ // conversion to `long long int` or `unsigned long long int` is equivalent.
- void set(int64_t value)
+ // NOTE 2: We use the various modifiers on `int` as opposed to fixed size
+ // types such as `int32_t` and `int64_t` because these types do not cover all
+ // of the integral types. For example, `uint32_t` may map to `unsigned int`,
+ // and `uint64_t` to `unsigned long long int`. If `size_t` maps to `unsigned
+ // long int`, it is ambiguous to pass an instance of `size_t`. defining an
+ // overload for `size_t` would solve the problem on a specific platform, but
+ // we can run into issues again on another platform if `size_t` maps to
+ // `unsigned long long int`, since we would get a redefinition error.
+
+ void set(short int value) { set(static_cast<long long int>(value)); }
+
+ void set(int value) { set(static_cast<long long int>(value)); }
+
+ void set(long int value) { set(static_cast<long long int>(value)); }
+
+ void set(long long int value)
{
- type_ = INT64;
- int64_ = value;
+ type_ = INT;
+ int_ = value;
}
- void set(uint32_t value) { set(static_cast<uint64_t>(value)); }
+ void set(unsigned short int value)
+ {
+ set(static_cast<unsigned long long int>(value));
+ }
+
+ void set(unsigned int value)
+ {
+ set(static_cast<unsigned long long int>(value));
+ }
- void set(uint64_t value)
+ void set(unsigned long int value)
{
- type_ = UINT64;
- uint64_ = value;
+ set(static_cast<unsigned long long int>(value));
+ }
+
+ void set(unsigned long long int value)
+ {
+ type_ = UINT;
+ uint_ = value;
}
void set(float value) { set(static_cast<double>(value)); }
@@ -197,12 +229,12 @@ public:
private:
std::ostream* stream_;
- enum { INT64, UINT64, DOUBLE } type_;
+ enum { INT, UINT, DOUBLE } type_;
union
{
- int64_t int64_;
- uint64_t uint64_;
+ long long int int_;
+ unsigned long long int uint_;
double double_;
};
};
@@ -336,10 +368,41 @@ inline void json(BooleanWriter* writer, bool value) { writer->set(value); }
// `json` functions for numbers.
-inline void json(NumberWriter* writer, int32_t value) { writer->set(value); }
-inline void json(NumberWriter* writer, int64_t value) { writer->set(value); }
-inline void json(NumberWriter* writer, uint32_t value) { writer->set(value); }
-inline void json(NumberWriter* writer, uint64_t value) { writer->set(value); }
+inline void json(NumberWriter* writer, short int value) { writer->set(value); }
+inline void json(NumberWriter* writer, int value) { writer->set(value); }
+inline void json(NumberWriter* writer, long int value) { writer->set(value); }
+
+
+inline void json(NumberWriter* writer, long long int value)
+{
+ writer->set(value);
+}
+
+
+inline void json(NumberWriter* writer, unsigned short int value)
+{
+ writer->set(value);
+}
+
+
+inline void json(NumberWriter* writer, unsigned int value)
+{
+ writer->set(value);
+}
+
+
+inline void json(NumberWriter* writer, unsigned long int value)
+{
+ writer->set(value);
+}
+
+
+inline void json(NumberWriter* writer, unsigned long long int value)
+{
+ writer->set(value);
+}
+
+
inline void json(NumberWriter* writer, float value) { writer->set(value); }
inline void json(NumberWriter* writer, double value) { writer->set(value); }
[2/2] mesos git commit: Updated `Master::Http::stateSummary` to use
`jsonify`.
Posted by mp...@apache.org.
Updated `Master::Http::stateSummary` to use `jsonify`.
Review: https://reviews.apache.org/r/42546
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8ca4efc1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8ca4efc1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8ca4efc1
Branch: refs/heads/master
Commit: 8ca4efc1518c50fbeba45a9f729cc7b354f091b3
Parents: b224995
Author: Michael Park <mp...@apache.org>
Authored: Tue Jan 19 20:10:02 2016 -0800
Committer: Michael Park <mp...@apache.org>
Committed: Sun Jan 31 20:06:16 2016 -0800
----------------------------------------------------------------------
src/master/http.cpp | 184 +++++++++++++++++++++++------------------------
1 file changed, 90 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/8ca4efc1/src/master/http.cpp
----------------------------------------------------------------------
diff --git a/src/master/http.cpp b/src/master/http.cpp
index 0422536..3d7a624 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -1569,109 +1569,105 @@ string Master::Http::STATESUMMARY_HELP()
Future<Response> Master::Http::stateSummary(const Request& request) const
{
- JSON::Object object;
-
- object.values["hostname"] = master->info().hostname();
-
- if (master->flags.cluster.isSome()) {
- object.values["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.
-
- // 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.
- {
- JSON::Array array;
- array.values.reserve(master->slaves.registered.size()); // MESOS-2353.
-
- foreachvalue (Slave* slave, master->slaves.registered) {
- JSON::Object json = summarize(*slave);
+ auto stateSummary = [this](JSON::ObjectWriter* writer) {
+ writer->field("hostname", master->info().hostname());
- // Add the 'TaskState' summary for this slave.
- const TaskStateSummary& summary = taskStateSummaries.slave(slave->id);
+ if (master->flags.cluster.isSome()) {
+ writer->field("cluster", master->flags.cluster.get());
+ }
- json.values["TASK_STAGING"] = summary.staging;
- json.values["TASK_STARTING"] = summary.starting;
- json.values["TASK_RUNNING"] = summary.running;
- json.values["TASK_FINISHED"] = summary.finished;
- json.values["TASK_KILLED"] = summary.killed;
- json.values["TASK_FAILED"] = summary.failed;
- json.values["TASK_LOST"] = summary.lost;
- json.values["TASK_ERROR"] = summary.error;
+ // 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.
- // Add the ids of all the frameworks running on this slave.
- const hashset<FrameworkID>& frameworks =
- slaveFrameworkMapping.frameworks(slave->id);
+ // Generate mappings from 'slave' to 'framework' and reverse.
+ SlaveFrameworkMapping slaveFrameworkMapping(master->frameworks.registered);
- JSON::Array frameworkIdArray;
- frameworkIdArray.values.reserve(frameworks.size()); // MESOS-2353.
+ // Generate 'TaskState' summaries for all framework and slave ids.
+ TaskStateSummaries taskStateSummaries(master->frameworks.registered);
- foreach (const FrameworkID& frameworkId, frameworks) {
- frameworkIdArray.values.push_back(frameworkId.value());
+ // Model all of the slaves.
+ writer->field("slaves", [this,
+ &slaveFrameworkMapping,
+ &taskStateSummaries](JSON::ArrayWriter* writer) {
+ foreachvalue (Slave* slave, master->slaves.registered) {
+ writer->element([&slave,
+ &slaveFrameworkMapping,
+ &taskStateSummaries](JSON::ObjectWriter* writer) {
+ json(writer, Summary<Slave>(*slave));
+
+ // Add the 'TaskState' summary for this slave.
+ const TaskStateSummary& summary = taskStateSummaries.slave(slave->id);
+
+ writer->field("TASK_STAGING", summary.staging);
+ writer->field("TASK_STARTING", summary.starting);
+ writer->field("TASK_RUNNING", summary.running);
+ 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);
+
+ // 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());
+ }
+ });
+ });
}
+ });
- json.values["framework_ids"] = std::move(frameworkIdArray);
-
- array.values.push_back(std::move(json));
- }
-
- object.values["slaves"] = std::move(array);
- }
-
- // Model all of the frameworks.
- {
- JSON::Array array;
- array.values.reserve(master->frameworks.registered.size()); // MESOS-2353.
-
- foreachpair (const FrameworkID& frameworkId,
- Framework* framework,
- master->frameworks.registered) {
- JSON::Object json = summarize(*framework);
-
- // Add the 'TaskState' summary for this framework.
- const TaskStateSummary& summary =
- taskStateSummaries.framework(frameworkId);
- json.values["TASK_STAGING"] = summary.staging;
- json.values["TASK_STARTING"] = summary.starting;
- json.values["TASK_RUNNING"] = summary.running;
- json.values["TASK_FINISHED"] = summary.finished;
- json.values["TASK_KILLED"] = summary.killed;
- json.values["TASK_FAILED"] = summary.failed;
- json.values["TASK_LOST"] = summary.lost;
- json.values["TASK_ERROR"] = summary.error;
-
- // Add the ids of all the slaves running this framework.
- const hashset<SlaveID>& slaves =
- slaveFrameworkMapping.slaves(frameworkId);
-
- JSON::Array slaveIdArray;
- slaveIdArray.values.reserve(slaves.size()); // MESOS-2353.
-
- foreach (const SlaveID& slaveId, slaves) {
- slaveIdArray.values.push_back(slaveId.value());
+ // Model all of the frameworks.
+ writer->field("frameworks",
+ [this,
+ &slaveFrameworkMapping,
+ &taskStateSummaries](JSON::ArrayWriter* writer) {
+ foreachpair (const FrameworkID& frameworkId,
+ Framework* framework,
+ master->frameworks.registered) {
+ 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);
+
+ writer->field("TASK_STAGING", summary.staging);
+ writer->field("TASK_STARTING", summary.starting);
+ writer->field("TASK_RUNNING", summary.running);
+ 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);
+
+ // 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());
+ }
+ });
+ });
}
+ });
+ };
- json.values["slave_ids"] = std::move(slaveIdArray);
-
- array.values.push_back(std::move(json));
- }
-
- object.values["frameworks"] = std::move(array);
- }
-
- return OK(object, request.url.query.get("jsonp"));
+ return OK(jsonify(stateSummary), request.url.query.get("jsonp"));
}