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"));
 }