You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jo...@apache.org on 2015/09/16 23:56:49 UTC
[1/5] mesos git commit: Integer Precision for JSON <-> Protobuf
conversions.
Repository: mesos
Updated Branches:
refs/heads/master be2c6ca76 -> 2c277f1c0
Integer Precision for JSON <-> Protobuf conversions.
Updates PicoJSON to version 1.3.0 and adds a -DPICOJSON_USE_INT64 flag
to the compilation flags.
Review: https://reviews.apache.org/r/38028
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3be13b3c
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3be13b3c
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3be13b3c
Branch: refs/heads/master
Commit: 3be13b3c6cb24e09ade07c8f8826b314596172b5
Parents: be2c6ca
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Wed Sep 16 13:37:16 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Wed Sep 16 17:39:01 2015 -0400
----------------------------------------------------------------------
3rdparty/libprocess/3rdparty/CMakeLists.txt | 3 +--
3rdparty/libprocess/3rdparty/Makefile.am | 3 +++
3rdparty/libprocess/3rdparty/picojson-1.3.0.tar.gz | Bin 0 -> 14695 bytes
.../libprocess/3rdparty/picojson-4f93734.tar.gz | Bin 11270 -> 0 bytes
3rdparty/libprocess/3rdparty/versions.am | 2 +-
3rdparty/libprocess/Makefile.am | 1 +
6 files changed, 6 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/3rdparty/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/CMakeLists.txt b/3rdparty/libprocess/3rdparty/CMakeLists.txt
index d13ba66..c746ba5 100644
--- a/3rdparty/libprocess/3rdparty/CMakeLists.txt
+++ b/3rdparty/libprocess/3rdparty/CMakeLists.txt
@@ -35,7 +35,7 @@ else (REBUNDLED)
set(GLOG_URL https://google-glog.googlecode.com/files/glog-${GLOG_VERSION}.tar.gz)
# NOTE: This url can't be versioned like the others, because it depends on
# specific commit, and isn't in our upstream.
- set(PICOJSON_URL https://github.com/kazuho/picojson/tarball/4f93734ade33ea0f5e5b4de35fc6b2c324a8dca6)
+ set(PICOJSON_URL https://github.com/kazuho/picojson/archive/v1.3.0.tar.gz)
# TODO(hausdorff): (MESOS-3395) depends on the github mirror, should remove
# when possible.
set(HTTP_PARSER_URL https://github.com/apache/mesos/raw/master/3rdparty/libprocess/3rdparty/ry-http-parser-${HTTP_PARSER_VERSION}.tar.gz)
@@ -153,7 +153,6 @@ ExternalProject_Add(
ExternalProject_Add(
${PICOJSON_TARGET}
PREFIX ${PICOJSON_CMAKE_ROOT}
- DOWNLOAD_NAME ${PICOJSON_TARGET}.tar.gz
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/3rdparty/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/Makefile.am b/3rdparty/libprocess/3rdparty/Makefile.am
index eb34251..8e437c7 100644
--- a/3rdparty/libprocess/3rdparty/Makefile.am
+++ b/3rdparty/libprocess/3rdparty/Makefile.am
@@ -214,6 +214,9 @@ endif
if WITH_BUNDLED_PICOJSON
stout_tests_CPPFLAGS += -I$(PICOJSON)
+
+ # Enable the INT64 support for PicoJSON.
+ stout_tests_CPPFLAGS += -DPICOJSON_USE_INT64
endif
if WITH_BUNDLED_GLOG
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/3rdparty/picojson-1.3.0.tar.gz
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/picojson-1.3.0.tar.gz b/3rdparty/libprocess/3rdparty/picojson-1.3.0.tar.gz
new file mode 100644
index 0000000..0ade1be
Binary files /dev/null and b/3rdparty/libprocess/3rdparty/picojson-1.3.0.tar.gz differ
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/3rdparty/picojson-4f93734.tar.gz
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/picojson-4f93734.tar.gz b/3rdparty/libprocess/3rdparty/picojson-4f93734.tar.gz
deleted file mode 100644
index f52dacd..0000000
Binary files a/3rdparty/libprocess/3rdparty/picojson-4f93734.tar.gz and /dev/null differ
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/3rdparty/versions.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/versions.am b/3rdparty/libprocess/3rdparty/versions.am
index f44c715..98195b8 100644
--- a/3rdparty/libprocess/3rdparty/versions.am
+++ b/3rdparty/libprocess/3rdparty/versions.am
@@ -9,4 +9,4 @@ GPERFTOOLS_VERSION = 2.0
LIBEV_VERSION = 4.15
PROTOBUF_VERSION = 2.5.0
RY_HTTP_PARSER_VERSION = 1c3624a
-PICOJSON_VERSION = 4f93734
\ No newline at end of file
+PICOJSON_VERSION = 1.3.0
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/mesos/blob/3be13b3c/3rdparty/libprocess/Makefile.am
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/Makefile.am b/3rdparty/libprocess/Makefile.am
index 064310c..e949bdd 100644
--- a/3rdparty/libprocess/Makefile.am
+++ b/3rdparty/libprocess/Makefile.am
@@ -93,6 +93,7 @@ libprocess_la_CPPFLAGS = \
-I$(BOOST) \
-I$(LIBEV) \
-I$(PICOJSON) \
+ -DPICOJSON_USE_INT64 \
$(AM_CPPFLAGS)
if ENABLE_LIBEVENT
[3/5] mesos git commit: Integer Precision for JSON <-> Protobuf
conversions.
Posted by jo...@apache.org.
Integer Precision for JSON <-> Protobuf conversions.
* Changes JSON::Number to keep track of whether it is floating, signed
integral, or unsigned integral.
* Changes how JSON::Number is stringified, to ensure that stringified
doubles are parsed as JSON doubles.
* Added one test for integer precision between
String <-> JSON <-> Protobuf conversions.
* Added one test for JSON::Number comparisons.
Review: https://reviews.apache.org/r/38031
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/4807db6c
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/4807db6c
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/4807db6c
Branch: refs/heads/master
Commit: 4807db6ceb7fafe59c28cbcfb31334ca7061dd59
Parents: ae9579d
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Wed Sep 16 13:40:02 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Wed Sep 16 17:45:36 2015 -0400
----------------------------------------------------------------------
.../3rdparty/stout/include/stout/json.hpp | 157 +++++++++++++++++--
.../3rdparty/stout/include/stout/protobuf.hpp | 54 ++-----
.../3rdparty/stout/tests/json_tests.cpp | 74 ++++++---
.../3rdparty/stout/tests/protobuf_tests.cpp | 82 +++++++++-
4 files changed, 289 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/4807db6c/3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp
index f28138c..6e667a1 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp
@@ -21,6 +21,7 @@
#include <limits>
#include <map>
#include <string>
+#include <type_traits>
#include <vector>
#include <boost/type_traits/is_arithmetic.hpp>
@@ -72,11 +73,71 @@ struct String
};
+// NOTE: Due to how PicoJson parses unsigned integers, a roundtrip from Number
+// to JSON and back to Number will result in:
+// - a signed integer, if the value is less than or equal to INT64_MAX;
+// - or a double, if the value is greater than INT64_MAX.
+// See: https://github.com/kazuho/picojson/blob/rel/v1.3.0/picojson.h#L777-L781
struct Number
{
Number() : value(0) {}
- Number(double _value) : value(_value) {}
- double value;
+
+ template <typename T>
+ Number(
+ T _value,
+ typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0)
+ : type(FLOATING), value(_value) {}
+
+ template <typename T>
+ Number(
+ T _value,
+ typename std::enable_if<
+ std::is_integral<T>::value && std::is_signed<T>::value,
+ int>::type = 0)
+ : type(SIGNED_INTEGER), signed_integer(_value) {}
+
+ template <typename T>
+ Number(
+ T _value,
+ typename std::enable_if<
+ std::is_integral<T>::value && std::is_unsigned<T>::value,
+ int>::type = 0)
+ : type(UNSIGNED_INTEGER), unsigned_integer(_value) {}
+
+ template <typename T>
+ T as() const
+ {
+ switch (type) {
+ case FLOATING:
+ return static_cast<T>(value);
+ case SIGNED_INTEGER:
+ return static_cast<T>(signed_integer);
+ case UNSIGNED_INTEGER:
+ return static_cast<T>(unsigned_integer);
+
+ // NOTE: By not setting a default we leverage the compiler
+ // errors when the enumeration is augmented to find all
+ // the cases we need to provide.
+ }
+ }
+
+ enum Type
+ {
+ FLOATING,
+ SIGNED_INTEGER,
+ UNSIGNED_INTEGER,
+ } type;
+
+private:
+ friend struct Value;
+ friend struct Comparator;
+ friend std::ostream& operator<<(std::ostream& stream, const Number& number);
+
+ union {
+ double value;
+ int64_t signed_integer;
+ uint64_t unsigned_integer;
+ };
};
@@ -207,6 +268,8 @@ struct Value : internal::Variant
bool contains(const Value& other) const;
private:
+ friend struct Comparator;
+
// A class which follows the visitor pattern and implements the
// containment rules described in the documentation of 'contains'.
// See 'bool Value::contains(const Value& other) const'.
@@ -257,7 +320,6 @@ inline const Value& Value::as<Value>() const
}
-
template <typename T>
Result<T> Object::find(const std::string& path) const
{
@@ -384,7 +446,53 @@ inline bool Value::ContainmentComparator::operator()(const Number& other) const
if (!self.is<Number>()) {
return false;
}
- return self.as<Number>().value == other.value;
+
+ // NOTE: For the following switch statements, we do not set a default
+ // case in order to leverage the compiler errors when the enumeration
+ // is augmented to find all the cases we need to provide.
+
+ // NOTE: Using '==' is unsafe for unsigned-signed integer comparisons.
+ // The compiler will automatically cast the signed integer to an
+ // unsigned integer. i.e. If the signed integer was negative, it
+ // might be converted to a large positive number.
+ // Using the '==' operator *is* safe for double-integer comparisons.
+
+ const Number& number = self.as<Number>();
+ switch (number.type) {
+ case Number::FLOATING:
+ switch (other.type) {
+ case Number::FLOATING:
+ return number.value == other.value;
+ case Number::SIGNED_INTEGER:
+ return number.value == other.signed_integer;
+ case Number::UNSIGNED_INTEGER:
+ return number.value == other.unsigned_integer;
+ }
+
+ case Number::SIGNED_INTEGER:
+ switch (other.type) {
+ case Number::FLOATING:
+ return number.signed_integer == other.value;
+ case Number::SIGNED_INTEGER:
+ return number.signed_integer == other.signed_integer;
+ case Number::UNSIGNED_INTEGER:
+ // See note above for why this is not a simple '==' expression.
+ return number.signed_integer >= 0 &&
+ number.as<uint64_t>() == other.unsigned_integer;
+ }
+
+ case Number::UNSIGNED_INTEGER:
+ switch (other.type) {
+ case Number::FLOATING:
+ return number.unsigned_integer == other.value;
+ case Number::SIGNED_INTEGER:
+ // See note above for why this is not a simple '==' expression.
+ return other.signed_integer >= 0 &&
+ number.unsigned_integer == other.as<uint64_t>();
+ case Number::UNSIGNED_INTEGER:
+ return number.unsigned_integer == other.unsigned_integer;
+ }
+ }
}
@@ -446,12 +554,11 @@ struct Comparator : boost::static_visitor<bool>
return false;
}
- bool operator()(const Number& number) const
+ bool operator()(const Number& other) const
{
- if (value.is<Number>()) {
- return value.as<Number>().value == number.value;
- }
- return false;
+ // Delegate to the containment comparator.
+ // See Value::ContainmentComparator::operator(Number).
+ return Value::ContainmentComparator(value)(other);
}
bool operator()(const Array& array) const
@@ -502,10 +609,32 @@ inline std::ostream& operator<<(std::ostream& out, const String& string)
inline std::ostream& operator<<(std::ostream& out, const Number& number)
{
- // Use the guaranteed accurate precision, see:
- // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2005.pdf
- return out << std::setprecision(std::numeric_limits<double>::digits10)
- << number.value;
+ switch (number.type) {
+ case Number::FLOATING: {
+ // Prints a floating point value, with the specified precision, see:
+ // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2005.pdf
+ // Additionally ensures that a decimal point is in the output.
+ char buffer[50] {}; // More than long enough for the specified precision.
+ snprintf(
+ buffer,
+ sizeof(buffer),
+ "%#.*g",
+ std::numeric_limits<double>::digits10,
+ number.value);
+
+ // Get rid of trailing zeroes before outputting.
+ // Otherwise, printing 1.0 would result in "1.00000000000000".
+ return out << strings::trim(buffer, strings::SUFFIX, "0");
+ }
+ case Number::SIGNED_INTEGER:
+ return out << number.signed_integer;
+ case Number::UNSIGNED_INTEGER:
+ return out << number.unsigned_integer;
+
+ // NOTE: By not setting a default we leverage the compiler
+ // errors when the enumeration is augmented to find all
+ // the cases we need to provide.
+ }
}
@@ -575,6 +704,8 @@ inline Value convert(const picojson::value& value)
array.values.push_back(convert(value));
}
return array;
+ } else if (value.is<int64_t>()) {
+ return Number(value.get<int64_t>());
} else if (value.is<double>()) {
return Number(value.get<double>());
} else if (value.is<std::string>()) {
http://git-wip-us.apache.org/repos/asf/mesos/blob/4807db6c/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
index 115cc0c..2285ce9 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
@@ -391,80 +391,50 @@ struct Parser : boost::static_visitor<Try<Nothing> >
switch (field->type()) {
case google::protobuf::FieldDescriptor::TYPE_DOUBLE:
if (field->is_repeated()) {
- reflection->AddDouble(message, field, number.value);
+ reflection->AddDouble(message, field, number.as<double>());
} else {
- reflection->SetDouble(message, field, number.value);
+ reflection->SetDouble(message, field, number.as<double>());
}
break;
case google::protobuf::FieldDescriptor::TYPE_FLOAT:
if (field->is_repeated()) {
- reflection->AddFloat(
- message,
- field,
- static_cast<float>(number.value));
+ reflection->AddFloat(message, field, number.as<float>());
} else {
- reflection->SetFloat(
- message,
- field,
- static_cast<float>(number.value));
+ reflection->SetFloat(message, field, number.as<float>());
}
break;
case google::protobuf::FieldDescriptor::TYPE_INT64:
case google::protobuf::FieldDescriptor::TYPE_SINT64:
case google::protobuf::FieldDescriptor::TYPE_SFIXED64:
if (field->is_repeated()) {
- reflection->AddInt64(
- message,
- field,
- static_cast<int64_t>(number.value));
+ reflection->AddInt64(message, field, number.as<int64_t>());
} else {
- reflection->SetInt64(
- message,
- field,
- static_cast<int64_t>(number.value));
+ reflection->SetInt64(message, field, number.as<int64_t>());
}
break;
case google::protobuf::FieldDescriptor::TYPE_UINT64:
case google::protobuf::FieldDescriptor::TYPE_FIXED64:
if (field->is_repeated()) {
- reflection->AddUInt64(
- message,
- field,
- static_cast<uint64_t>(number.value));
+ reflection->AddUInt64(message, field, number.as<uint64_t>());
} else {
- reflection->SetUInt64(
- message,
- field,
- static_cast<uint64_t>(number.value));
+ reflection->SetUInt64(message, field, number.as<uint64_t>());
}
break;
case google::protobuf::FieldDescriptor::TYPE_INT32:
case google::protobuf::FieldDescriptor::TYPE_SINT32:
case google::protobuf::FieldDescriptor::TYPE_SFIXED32:
if (field->is_repeated()) {
- reflection->AddInt32(
- message,
- field,
- static_cast<int32_t>(number.value));
+ reflection->AddInt32(message, field, number.as<int32_t>());
} else {
- reflection->SetInt32(
- message,
- field,
- static_cast<int32_t>(number.value));
+ reflection->SetInt32(message, field, number.as<int32_t>());
}
break;
case google::protobuf::FieldDescriptor::TYPE_UINT32:
case google::protobuf::FieldDescriptor::TYPE_FIXED32:
if (field->is_repeated()) {
- reflection->AddUInt32(
- message,
- field,
- static_cast<uint32_t>(number.value));
+ reflection->AddUInt32(message, field, number.as<uint32_t>());
} else {
- reflection->SetUInt32(
- message,
- field,
- static_cast<uint32_t>(number.value));
+ reflection->SetUInt32(message, field, number.as<uint32_t>());
}
break;
default:
http://git-wip-us.apache.org/repos/asf/mesos/blob/4807db6c/3rdparty/libprocess/3rdparty/stout/tests/json_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/tests/json_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/json_tests.cpp
index 850650c..88b6147 100644
--- a/3rdparty/libprocess/3rdparty/stout/tests/json_tests.cpp
+++ b/3rdparty/libprocess/3rdparty/stout/tests/json_tests.cpp
@@ -50,18 +50,50 @@ TEST(JsonTest, BinaryData)
TEST(JsonTest, NumberFormat)
{
- // Test whole numbers.
- EXPECT_EQ("0", stringify(JSON::Number(0.0)));
- EXPECT_EQ("1", stringify(JSON::Number(1.0)));
+ // Test whole numbers (as doubles).
+ EXPECT_EQ("0.", stringify(JSON::Number(0.0)));
+ EXPECT_EQ("1.", stringify(JSON::Number(1.0)));
// Negative.
- EXPECT_EQ("-1", stringify(JSON::Number(-1.0)));
+ EXPECT_EQ("-1.", stringify(JSON::Number(-1.0)));
+
+ // Test integers.
+ EXPECT_EQ("0", stringify(JSON::Number(0)));
+ EXPECT_EQ("2", stringify(JSON::Number(2)));
+ EXPECT_EQ("-2", stringify(JSON::Number(-2)));
// Expect at least 15 digits of precision.
EXPECT_EQ("1234567890.12345", stringify(JSON::Number(1234567890.12345)));
}
+TEST(JsonTest, NumberComparisons)
+{
+ // Unsigned and signed comparisons.
+ EXPECT_EQ(JSON::Number(1U), JSON::Number((int64_t) 1));
+ EXPECT_EQ(JSON::Number(0U), JSON::Number((int64_t) 0));
+
+ EXPECT_NE(JSON::Number(1U), JSON::Number(-1));
+ EXPECT_NE(JSON::Number((uint64_t) -1), JSON::Number(-1));
+
+ // Signed and unsigned comparisons (opposite order of above).
+ EXPECT_EQ(JSON::Number((int64_t) 1), JSON::Number(1U));
+ EXPECT_EQ(JSON::Number((int64_t) 0), JSON::Number(0U));
+
+ EXPECT_NE(JSON::Number(-1), JSON::Number(1U));
+ EXPECT_NE(JSON::Number(-1), JSON::Number((uint64_t) -1));
+
+ // Make sure we aren't doing an implicit cast from int64_t to uint64_t.
+ // These have the same bit representation (64h'8000_0000_0000_0001).
+ EXPECT_NE(
+ JSON::Number(9223372036854775809U),
+ JSON::Number(-9223372036854775807));
+ EXPECT_NE(
+ JSON::Number(-9223372036854775807),
+ JSON::Number(9223372036854775809U));
+}
+
+
TEST(JsonTest, BooleanFormat)
{
EXPECT_EQ("false", stringify(JSON::False()));
@@ -121,44 +153,50 @@ TEST(JsonTest, NumericAssignment)
s.st_nlink = 1;
JSON::Value v = s.st_nlink;
JSON::Number d = s.st_nlink;
- EXPECT_EQ(get<JSON::Number>(v).value, 1.0);
- EXPECT_EQ(d.value, 1.0);
+ EXPECT_NE(get<JSON::Number>(v).type, JSON::Number::FLOATING);
+ EXPECT_EQ(get<JSON::Number>(v).as<int64_t>(), 1);
+ EXPECT_EQ(d.as<int64_t>(), 1);
s.st_size = 2;
v = s.st_size;
d = s.st_size;
- EXPECT_EQ(get<JSON::Number>(v).value, 2.0);
- EXPECT_EQ(d.value, 2.0);
+ EXPECT_NE(get<JSON::Number>(v).type, JSON::Number::FLOATING);
+ EXPECT_EQ(get<JSON::Number>(v).as<int64_t>(), 2);
+ EXPECT_EQ(d.as<int64_t>(), 2);
s.st_mtime = 3;
v = s.st_mtime;
d = s.st_mtime;
- EXPECT_EQ(get<JSON::Number>(v).value, 3.0);
- EXPECT_EQ(d.value, 3.0);
+ EXPECT_EQ(get<JSON::Number>(v).as<int64_t>(), 3);
+ EXPECT_EQ(d.as<int64_t>(), 3);
size_t st = 4;
v = st;
d = st;
- EXPECT_EQ(get<JSON::Number>(v).value, 4.0);
- EXPECT_EQ(d.value, 4.0);
+ EXPECT_EQ(get<JSON::Number>(v).type, JSON::Number::UNSIGNED_INTEGER);
+ EXPECT_EQ(get<JSON::Number>(v).as<uint64_t>(), 4);
+ EXPECT_EQ(d.as<uint64_t>(), 4);
uint64_t ui64 = 5;
v = ui64;
d = ui64;
- EXPECT_EQ(get<JSON::Number>(v).value, 5.0);
- EXPECT_EQ(d.value, 5.0);
+ EXPECT_EQ(get<JSON::Number>(v).type, JSON::Number::UNSIGNED_INTEGER);
+ EXPECT_EQ(get<JSON::Number>(v).as<uint64_t>(), 5);
+ EXPECT_EQ(d.as<uint64_t>(), 5);
const unsigned int ui = 6;
v = ui;
d = ui;
- EXPECT_EQ(get<JSON::Number>(v).value, 6.0);
- EXPECT_EQ(d.value, 6.0);
+ EXPECT_EQ(get<JSON::Number>(v).type, JSON::Number::UNSIGNED_INTEGER);
+ EXPECT_EQ(get<JSON::Number>(v).as<uint64_t>(), 6);
+ EXPECT_EQ(d.as<uint64_t>(), 6);
int i = 7;
v = i;
d = i;
- EXPECT_EQ(get<JSON::Number>(v).value, 7.0);
- EXPECT_EQ(d.value, 7.0);
+ EXPECT_EQ(get<JSON::Number>(v).type, JSON::Number::SIGNED_INTEGER);
+ EXPECT_EQ(get<JSON::Number>(v).as<int64_t>(), 7);
+ EXPECT_EQ(d.as<int64_t>(), 7);
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/4807db6c/3rdparty/libprocess/3rdparty/stout/tests/protobuf_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/tests/protobuf_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/protobuf_tests.cpp
index 87737dd..01d5ec7 100644
--- a/3rdparty/libprocess/3rdparty/stout/tests/protobuf_tests.cpp
+++ b/3rdparty/libprocess/3rdparty/stout/tests/protobuf_tests.cpp
@@ -108,18 +108,18 @@ TEST(ProtobufTest, JSON)
"{"
" \"b\": true,"
" \"bytes\": \"Ynl0ZXM=\","
- " \"d\": 1,"
+ " \"d\": 1.,"
" \"e\": \"ONE\","
- " \"f\": 1,"
+ " \"f\": 1.,"
" \"int32\": -1,"
" \"int64\": -1,"
" \"nested\": { \"str\": \"nested\"},"
- " \"optional_default\": 42,"
+ " \"optional_default\": 42.,"
" \"repeated_bool\": [true],"
" \"repeated_bytes\": [\"cmVwZWF0ZWRfYnl0ZXM=\"],"
- " \"repeated_double\": [1, 2],"
+ " \"repeated_double\": [1., 2.],"
" \"repeated_enum\": [\"TWO\"],"
- " \"repeated_float\": [1],"
+ " \"repeated_float\": [1.],"
" \"repeated_int32\": [-2],"
" \"repeated_int64\": [-2],"
" \"repeated_nested\": [ { \"str\": \"repeated_nested\" } ],"
@@ -233,3 +233,75 @@ TEST(ProtobufTest, ParseJSONArray)
EXPECT_EQ(message, repeated.Get(0));
EXPECT_EQ(message, repeated.Get(1));
}
+
+
+// Tests that integer precision is maintained between
+// JSON <-> Protobuf conversions.
+TEST(ProtobufTest, JsonLargeIntegers)
+{
+ // These numbers are equal or close to the integer limits.
+ tests::Message message;
+ message.set_int32(-2147483647);
+ message.set_int64(-9223372036854775807);
+ message.set_uint32(4294967295U);
+ message.set_uint64(9223372036854775807);
+ message.set_sint32(-1234567890);
+ message.set_sint64(-1234567890123456789);
+ message.add_repeated_int32(-2000000000);
+ message.add_repeated_int64(-9000000000000000000);
+ message.add_repeated_uint32(3000000000U);
+ message.add_repeated_uint64(7000000000000000000);
+ message.add_repeated_sint32(-1000000000);
+ message.add_repeated_sint64(-8000000000000000000);
+
+ // Parts of the protobuf that are required. Copied from the above test.
+ message.set_b(true);
+ message.set_str("string");
+ message.set_bytes("bytes");
+ message.set_f(1.0);
+ message.set_d(1.0);
+ message.set_e(tests::ONE);
+ message.mutable_nested()->set_str("nested");
+
+ // The keys are in alphabetical order.
+ string expected = strings::remove(
+ "{"
+ " \"b\": true,"
+ " \"bytes\": \"Ynl0ZXM=\","
+ " \"d\": 1.,"
+ " \"e\": \"ONE\","
+ " \"f\": 1.,"
+ " \"int32\": -2147483647,"
+ " \"int64\": -9223372036854775807,"
+ " \"nested\": {\"str\": \"nested\"},"
+ " \"optional_default\": 42.,"
+ " \"repeated_int32\": [-2000000000],"
+ " \"repeated_int64\": [-9000000000000000000],"
+ " \"repeated_sint32\": [-1000000000],"
+ " \"repeated_sint64\": [-8000000000000000000],"
+ " \"repeated_uint32\": [3000000000],"
+ " \"repeated_uint64\": [7000000000000000000],"
+ " \"sint32\": -1234567890,"
+ " \"sint64\": -1234567890123456789,"
+ " \"str\": \"string\","
+ " \"uint32\": 4294967295,"
+ " \"uint64\": 9223372036854775807"
+ "}",
+ " ");
+
+ // Check JSON -> String.
+ JSON::Object object = JSON::Protobuf(message);
+ EXPECT_EQ(expected, stringify(object));
+
+ // Check JSON -> Protobuf.
+ Try<tests::Message> parse = protobuf::parse<tests::Message>(object);
+ ASSERT_SOME(parse);
+
+ // Check Protobuf -> JSON.
+ EXPECT_EQ(object, JSON::Protobuf(parse.get()));
+
+ // Check String -> JSON.
+ Try<JSON::Object> json = JSON::parse<JSON::Object>(expected);
+ ASSERT_SOME(json);
+ EXPECT_EQ(object, json.get());
+}
[4/5] mesos git commit: Integer Precision for JSON <-> Protobuf
conversions.
Posted by jo...@apache.org.
Integer Precision for JSON <-> Protobuf conversions.
Modify one libprocess test to match changes to JSON::Number.
Review: https://reviews.apache.org/r/38076
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/df9eacb1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/df9eacb1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/df9eacb1
Branch: refs/heads/master
Commit: df9eacb10fbec7758bde1b05f35661e2e82441f4
Parents: 4807db6
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Wed Sep 16 13:44:25 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Wed Sep 16 17:48:00 2015 -0400
----------------------------------------------------------------------
3rdparty/libprocess/src/tests/metrics_tests.cpp | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/df9eacb1/3rdparty/libprocess/src/tests/metrics_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/src/tests/metrics_tests.cpp b/3rdparty/libprocess/src/tests/metrics_tests.cpp
index 29ed033..8f15ee7 100644
--- a/3rdparty/libprocess/src/tests/metrics_tests.cpp
+++ b/3rdparty/libprocess/src/tests/metrics_tests.cpp
@@ -193,10 +193,10 @@ TEST(MetricsTest, Snapshot)
map<string, JSON::Value> values = responseJSON.get().values;
EXPECT_EQ(1u, values.count("test/counter"));
- EXPECT_FLOAT_EQ(0.0, values["test/counter"].as<JSON::Number>().value);
+ EXPECT_FLOAT_EQ(0.0, values["test/counter"].as<JSON::Number>().as<double>());
EXPECT_EQ(1u, values.count("test/gauge"));
- EXPECT_FLOAT_EQ(42.0, values["test/gauge"].as<JSON::Number>().value);
+ EXPECT_FLOAT_EQ(42.0, values["test/gauge"].as<JSON::Number>().as<double>());
EXPECT_EQ(0u, values.count("test/gauge_fail"));
@@ -290,10 +290,10 @@ TEST(MetricsTest, SnapshotTimeout)
map<string, JSON::Value> values = responseJSON.get().values;
EXPECT_EQ(1u, values.count("test/counter"));
- EXPECT_FLOAT_EQ(0.0, values["test/counter"].as<JSON::Number>().value);
+ EXPECT_FLOAT_EQ(0.0, values["test/counter"].as<JSON::Number>().as<double>());
EXPECT_EQ(1u, values.count("test/gauge"));
- EXPECT_FLOAT_EQ(42.0, values["test/gauge"].as<JSON::Number>().value);
+ EXPECT_FLOAT_EQ(42.0, values["test/gauge"].as<JSON::Number>().as<double>());
EXPECT_EQ(0u, values.count("test/gauge_fail"));
EXPECT_EQ(0u, values.count("test/gauge_timeout"));
@@ -381,7 +381,9 @@ TEST(MetricsTest, SnapshotStatistics)
const JSON::Value& value,
responseJSON.get().values) {
if (value.is<JSON::Number>()) {
- responseValues[key] = value.as<JSON::Number>().value;
+ // "test/counter/count" is an integer, everything else is a double.
+ JSON::Number number = value.as<JSON::Number>();
+ responseValues[key] = number.as<double>();
}
}
[2/5] mesos git commit: Integer Precision for JSON <-> Protobuf
conversions.
Posted by jo...@apache.org.
Integer Precision for JSON <-> Protobuf conversions.
Add PICOJSON_USE_INT64 flag to mesos compilation flags.
Review: https://reviews.apache.org/r/38030
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ae9579d9
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ae9579d9
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ae9579d9
Branch: refs/heads/master
Commit: ae9579d9249844703413eaec7c83c504aba247d0
Parents: 3be13b3
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Wed Sep 16 13:37:23 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Wed Sep 16 17:44:52 2015 -0400
----------------------------------------------------------------------
src/Makefile.am | 3 +++
1 file changed, 3 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/ae9579d9/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index db2f8d9..967147e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -106,6 +106,9 @@ MESOS_CPPFLAGS += -I../include/mesos
MESOS_CPPFLAGS += -I../$(BOOST)
MESOS_CPPFLAGS += -I../$(PICOJSON)
+# Enable the INT64 support for PicoJSON.
+MESOS_CPPFLAGS += -DPICOJSON_USE_INT64
+
MESOS_CPPFLAGS += -I../$(PROTOBUF)/src
MESOS_CPPFLAGS += -I../$(GLOG)/src
Re: [5/5] mesos git commit: Integer Precision for JSON <-> Protobuf conversions.
Posted by Joris Van Remoortere <jo...@mesosphere.io>.
Reverted for now while Joseph and I figure out a solution for this.
Thanks Jie!
Joris
On Wed, Sep 16, 2015 at 6:21 PM, Jie Yu <jy...@twitter.com> wrote:
> A different error on Ubuntu:
>
> In file included from ../../3rdparty/libprocess/include/process/http.hpp:39:0,
> from ../../3rdparty/libprocess/include/process/event.hpp:21,
> from ../../3rdparty/libprocess/include/process/process.hpp:26,
> from ../../src/docker/executor.cpp:26:
> ../../3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp: In function 'std::ostream& JSON::operator<<(std::ostream&, const JSON::Number&)':
> ../../3rdparty/libprocess/3rdparty/stout/include/stout/json.hpp:638:1: error: control reaches end of non-void function [-Werror=return-type]
> }
> ^
> cc1plus: all warnings being treated as errors
>
>
> On Wed, Sep 16, 2015 at 3:16 PM, Jie Yu <jy...@twitter.com> wrote:
>
>> It breaks the CI as well:
>>
>> https://builds.apache.org/job/Mesos/COMPILER=gcc,CONFIGURATION=--verbose,OS=centos:7,label_exp=docker%7C%7CHadoop/807/console
>>
>> On Wed, Sep 16, 2015 at 3:15 PM, Jie Yu <jy...@twitter.com> wrote:
>>
>>> Joris, I am using CentOS6 with devtoolset-2
>>>
>>> gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC)
>>>
>>> I did a clean build (rebootstrap, reconfigure).
>>>
>>> - Jie
>>>
>>>
>>> On Wed, Sep 16, 2015 at 3:14 PM, Joris Van Remoortere <
>>> joris@mesosphere.io> wrote:
>>>
>>>> Hi Jie,
>>>> Can you share your build info?
>>>> Did you rebootstrap?
>>>>
>>>> We've been building this for over a week so we must have a different
>>>> configuration.
>>>>
>>>> Thanks for letting us know! We will resolve this quickly :-)
>>>>
>>>> Joris
>>>>
>>>> On Wed, Sep 16, 2015 at 6:05 PM, Jie Yu <yu...@gmail.com> wrote:
>>>>
>>>>> Joris,
>>>>>
>>>>> It breaks the build:
>>>>>
>>>>> picojson-1.3.0/picojson.h: In member function ‘std::string
>>>>> picojson::value::to_str() const’:
>>>>> picojson-1.3.0/picojson.h:370:38: error: expected ‘)’ before ‘PRId64’
>>>>> SNPRINTF(buf, sizeof(buf), "%" PRId64, u_.int64_);
>>>>>
>>>>>
>>>>>
>>>>> On Wed, Sep 16, 2015 at 2:56 PM, <jo...@apache.org> wrote:
>>>>>
>>>>> > Integer Precision for JSON <-> Protobuf conversions.
>>>>> >
>>>>> > * Add TODO's for refactoring some JSON parsing in the docker code
>>>>> > (See MESOS-3409). Update how the JSON::Number is used.
>>>>> > * Tweak some tests to match changes to JSON::Number.
>>>>> > * Address a TODO on one test, which used a workaround for
>>>>> > double-precision comparison.
>>>>> >
>>>>> > Review: https://reviews.apache.org/r/38077
>>>>> >
>>>>> >
>>>>> > Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
>>>>> > Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2c277f1c
>>>>> > Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2c277f1c
>>>>> > Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2c277f1c
>>>>> >
>>>>> > Branch: refs/heads/master
>>>>> > Commit: 2c277f1c0e0dc0a6618ba930bb5f8d9dd753d4be
>>>>> > Parents: df9eacb
>>>>> > Author: Joseph Wu <jo...@mesosphere.io>
>>>>> > Authored: Wed Sep 16 13:44:47 2015 -0400
>>>>> > Committer: Joris Van Remoortere <jo...@gmail.com>
>>>>> > Committed: Wed Sep 16 17:48:43 2015 -0400
>>>>> >
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > src/docker/docker.cpp | 3 +-
>>>>> > .../provisioners/docker/token_manager.cpp | 3 +-
>>>>> > src/tests/fault_tolerance_tests.cpp | 2 +-
>>>>> > src/tests/master_tests.cpp | 2 +-
>>>>> > src/tests/monitor_tests.cpp | 50 +++------
>>>>> > src/tests/rate_limiting_tests.cpp | 106
>>>>> +++++++++++++------
>>>>> > src/tests/slave_tests.cpp | 2 +-
>>>>> > 7 files changed, 93 insertions(+), 75 deletions(-)
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/docker/docker.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
>>>>> > index c4c37cb..afcedf1 100755
>>>>> > --- a/src/docker/docker.cpp
>>>>> > +++ b/src/docker/docker.cpp
>>>>> > @@ -236,6 +236,7 @@ Try<Nothing> Docker::validateVersion(const
>>>>> Version&
>>>>> > minVersion) const
>>>>> > }
>>>>> >
>>>>> >
>>>>> > +// TODO(josephw): Parse this string with a protobuf.
>>>>> > Try<Docker::Container> Docker::Container::create(const string&
>>>>> output)
>>>>> > {
>>>>> > Try<JSON::Array> parse = JSON::parse<JSON::Array>(output);
>>>>> > @@ -286,7 +287,7 @@ Try<Docker::Container>
>>>>> Docker::Container::create(const
>>>>> > string& output)
>>>>> > return Error("Error finding Pid in State: " + pidValue.error());
>>>>> > }
>>>>> >
>>>>> > - pid_t pid = pid_t(pidValue.get().value);
>>>>> > + pid_t pid = pid_t(pidValue.get().as<int64_t>());
>>>>> >
>>>>> > Option<pid_t> optionalPid;
>>>>> > if (pid != 0) {
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/slave/containerizer/provisioners/docker/token_manager.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git
>>>>> a/src/slave/containerizer/provisioners/docker/token_manager.cpp
>>>>> > b/src/slave/containerizer/provisioners/docker/token_manager.cpp
>>>>> > index aec915f..95f459d 100644
>>>>> > --- a/src/slave/containerizer/provisioners/docker/token_manager.cpp
>>>>> > +++ b/src/slave/containerizer/provisioners/docker/token_manager.cpp
>>>>> > @@ -122,6 +122,7 @@ Token::Token(
>>>>> > notBefore(_notBefore) {}
>>>>> >
>>>>> >
>>>>> > +// TODO(josephw): Parse this string with some protobufs.
>>>>> > Try<Token> Token::create(const string& raw)
>>>>> > {
>>>>> > auto decode = [](
>>>>> > @@ -196,7 +197,7 @@ Result<Time> Token::getTimeValue(const
>>>>> JSON::Object&
>>>>> > object, const string& key)
>>>>> >
>>>>> > // If expiration is provided, we will process it for future
>>>>> validations.
>>>>> > if (jsonValue.isSome()) {
>>>>> > - Try<Time> time = Time::create(jsonValue.get().value);
>>>>> > + Try<Time> time = Time::create(jsonValue.get().as<double>());
>>>>> > if (time.isError()) {
>>>>> > return Error("Failed to decode time: " + time.error());
>>>>> > }
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/fault_tolerance_tests.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/tests/fault_tolerance_tests.cpp
>>>>> > b/src/tests/fault_tolerance_tests.cpp
>>>>> > index 061e099..c97bc46 100644
>>>>> > --- a/src/tests/fault_tolerance_tests.cpp
>>>>> > +++ b/src/tests/fault_tolerance_tests.cpp
>>>>> > @@ -1918,7 +1918,7 @@ TEST_F(FaultToleranceTest,
>>>>> > UpdateFrameworkInfoOnSchedulerFailover)
>>>>> > EXPECT_EQ(1u, framework.values.count("failover_timeout"));
>>>>> > JSON::Number failoverTimeout =
>>>>> > framework.values["failover_timeout"].as<JSON::Number>();
>>>>> > - EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.value);
>>>>> > + EXPECT_EQ(finfo2.failover_timeout(),
>>>>> failoverTimeout.as<double>());
>>>>> >
>>>>> > EXPECT_EQ(1u, framework.values.count("hostname"));
>>>>> > JSON::String hostname =
>>>>> framework.values["hostname"].as<JSON::String>();
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/master_tests.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
>>>>> > index dd65fcc..e4c89ab 100644
>>>>> > --- a/src/tests/master_tests.cpp
>>>>> > +++ b/src/tests/master_tests.cpp
>>>>> > @@ -2826,7 +2826,7 @@ TEST_F(MasterTest, StateEndpoint)
>>>>> > ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
>>>>> > EXPECT_EQ(
>>>>> > static_cast<int>(Clock::now().secs()),
>>>>> > -
>>>>> >
>>>>> static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
>>>>> > + state.values["start_time"].as<JSON::Number>().as<int>());
>>>>> >
>>>>> > ASSERT_TRUE(state.values["id"].is<JSON::String>());
>>>>> > EXPECT_NE("", state.values["id"].as<JSON::String>().value);
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/monitor_tests.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/tests/monitor_tests.cpp
>>>>> b/src/tests/monitor_tests.cpp
>>>>> > index f404955..583e711 100644
>>>>> > --- a/src/tests/monitor_tests.cpp
>>>>> > +++ b/src/tests/monitor_tests.cpp
>>>>> > @@ -106,44 +106,18 @@ TEST(MonitorTest, Statistics)
>>>>> > "Content-Type",
>>>>> > response);
>>>>> >
>>>>> > - // TODO(bmahler): Use JSON equality instead to avoid having to use
>>>>> > - // numeric limits for double precision.
>>>>> > - AWAIT_EXPECT_RESPONSE_BODY_EQ(
>>>>> > - strings::format(
>>>>> > - "[{"
>>>>> > - "\"executor_id\":\"executor\","
>>>>> > - "\"executor_name\":\"name\","
>>>>> > - "\"framework_id\":\"framework\","
>>>>> > - "\"source\":\"source\","
>>>>> > - "\"statistics\":{"
>>>>> > - "\"cpus_limit\":%g,"
>>>>> > - "\"cpus_nr_periods\":%d,"
>>>>> > - "\"cpus_nr_throttled\":%d,"
>>>>> > - "\"cpus_system_time_secs\":%g,"
>>>>> > - "\"cpus_throttled_time_secs\":%g,"
>>>>> > - "\"cpus_user_time_secs\":%g,"
>>>>> > - "\"mem_anon_bytes\":%lu,"
>>>>> > - "\"mem_file_bytes\":%lu,"
>>>>> > - "\"mem_limit_bytes\":%lu,"
>>>>> > - "\"mem_mapped_file_bytes\":%lu,"
>>>>> > - "\"mem_rss_bytes\":%lu,"
>>>>> > - "\"timestamp\":"
>>>>> > - "%." +
>>>>> stringify(numeric_limits<double>::digits10)
>>>>> > + "g"
>>>>> > - "}"
>>>>> > - "}]",
>>>>> > - statistics.cpus_limit(),
>>>>> > - statistics.cpus_nr_periods(),
>>>>> > - statistics.cpus_nr_throttled(),
>>>>> > - statistics.cpus_system_time_secs(),
>>>>> > - statistics.cpus_throttled_time_secs(),
>>>>> > - statistics.cpus_user_time_secs(),
>>>>> > - statistics.mem_anon_bytes(),
>>>>> > - statistics.mem_file_bytes(),
>>>>> > - statistics.mem_limit_bytes(),
>>>>> > - statistics.mem_mapped_file_bytes(),
>>>>> > - statistics.mem_rss_bytes(),
>>>>> > - statistics.timestamp()).get(),
>>>>> > - response);
>>>>> > + JSON::Array expected;
>>>>> > + JSON::Object usage;
>>>>> > + usage.values["executor_id"] = "executor";
>>>>> > + usage.values["executor_name"] = "name";
>>>>> > + usage.values["framework_id"] = "framework";
>>>>> > + usage.values["source"] = "source";
>>>>> > + usage.values["statistics"] = JSON::Protobuf(statistics);
>>>>> > + expected.values.push_back(usage);
>>>>> > +
>>>>> > + Try<JSON::Array> result =
>>>>> JSON::parse<JSON::Array>(response.get().body);
>>>>> > + ASSERT_SOME(result);
>>>>> > + ASSERT_EQ(expected, result.get());
>>>>> > }
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/rate_limiting_tests.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/tests/rate_limiting_tests.cpp
>>>>> > b/src/tests/rate_limiting_tests.cpp
>>>>> > index f3aedde..e512aa6 100644
>>>>> > --- a/src/tests/rate_limiting_tests.cpp
>>>>> > +++ b/src/tests/rate_limiting_tests.cpp
>>>>> > @@ -166,12 +166,16 @@ TEST_F(RateLimitingTest, NoRateLimiting)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > Future<Nothing> removeFramework =
>>>>> > @@ -270,12 +274,16 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // The 2nd message is throttled for a second.
>>>>> > @@ -305,8 +313,12 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
>>>>> >
>>>>> > // The 2nd message is received and but not processed after half
>>>>> > // a second because of throttling.
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_TRUE(duplicateFrameworkRegisteredMessage.isPending());
>>>>> > }
>>>>> >
>>>>> > @@ -324,8 +336,10 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> >
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > EXPECT_EQ(DRIVER_STOPPED, driver.stop());
>>>>> > EXPECT_EQ(DRIVER_STOPPED, driver.join());
>>>>> > @@ -481,19 +495,19 @@ TEST_F(RateLimitingTest,
>>>>> > DifferentPrincipalFrameworks)
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework1/messages_received"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework2/messages_received"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 1,
>>>>> > metrics.values["frameworks/framework1/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 1,
>>>>> > metrics.values["frameworks/framework2/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // Advance for a second so the message from framework1 (1qps)
>>>>> > @@ -508,11 +522,11 @@ TEST_F(RateLimitingTest,
>>>>> > DifferentPrincipalFrameworks)
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework1/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 1,
>>>>> > metrics.values["frameworks/framework2/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > // After another half a second framework2 (0.2qps)'s message is
>>>>> > // processed as well.
>>>>> > @@ -535,19 +549,19 @@ TEST_F(RateLimitingTest,
>>>>> > DifferentPrincipalFrameworks)
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework1/messages_received"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework2/messages_received"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework1/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > EXPECT_EQ(
>>>>> > 2,
>>>>> > metrics.values["frameworks/framework2/messages_processed"]
>>>>> > - .as<JSON::Number>().value);
>>>>> > + .as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // 3. Remove a framework and its message counters are deleted
>>>>> while
>>>>> > @@ -705,12 +719,16 @@ TEST_F(RateLimitingTest,
>>>>> SamePrincipalFrameworks)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // Advance for another half a second to make sure throttled
>>>>> > @@ -828,12 +846,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // 2. Now launch the second (i.e., failover) scheduler using the
>>>>> > @@ -898,12 +920,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // Need another half a second to have it processed.
>>>>> > @@ -922,12 +948,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(2,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 2,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > EXPECT_EQ(DRIVER_STOPPED, driver2.stop());
>>>>> > @@ -1012,12 +1042,16 @@ TEST_F(RateLimitingTest, CapacityReached)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // The subsequent messages are going to be throttled.
>>>>> > @@ -1064,12 +1098,16 @@ TEST_F(RateLimitingTest, CapacityReached)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(5,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 5,
>>>>> > +
>>>>> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > // Four messages not processed, two in the queue and two
>>>>> dropped.
>>>>> > - EXPECT_EQ(1,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 1,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> > }
>>>>> >
>>>>> > // Advance three times for the two pending messages and the exited
>>>>> > @@ -1086,12 +1124,16 @@ TEST_F(RateLimitingTest, CapacityReached)
>>>>> > const string& messages_received =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> "/messages_received";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_received));
>>>>> > - EXPECT_EQ(5,
>>>>> > metrics.values[messages_received].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 5,
>>>>> > +
>>>>> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>>>>> > const string& messages_processed =
>>>>> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
>>>>> > "/messages_processed";
>>>>> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
>>>>> > // Two messages are dropped.
>>>>> > - EXPECT_EQ(3,
>>>>> > metrics.values[messages_processed].as<JSON::Number>().value);
>>>>> > + EXPECT_EQ(
>>>>> > + 3,
>>>>> > +
>>>>> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>>>>> >
>>>>> > Shutdown();
>>>>> > }
>>>>> >
>>>>> >
>>>>> >
>>>>> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/slave_tests.cpp
>>>>> >
>>>>> ----------------------------------------------------------------------
>>>>> > diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
>>>>> > index 447c43c..dbe9b1d 100644
>>>>> > --- a/src/tests/slave_tests.cpp
>>>>> > +++ b/src/tests/slave_tests.cpp
>>>>> > @@ -1080,7 +1080,7 @@ TEST_F(SlaveTest, StateEndpoint)
>>>>> > ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
>>>>> > EXPECT_EQ(
>>>>> > static_cast<int>(Clock::now().secs()),
>>>>> > -
>>>>> >
>>>>> static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
>>>>> > + state.values["start_time"].as<JSON::Number>().as<int>());
>>>>> >
>>>>> > // TODO(bmahler): The slave must register for the 'id'
>>>>> > // to be non-empty.
>>>>> >
>>>>> >
>>>>>
>>>>
>>>>
>>>
>>
>
Re: [5/5] mesos git commit: Integer Precision for JSON <-> Protobuf conversions.
Posted by Joris Van Remoortere <jo...@mesosphere.io>.
Hi Jie,
Can you share your build info?
Did you rebootstrap?
We've been building this for over a week so we must have a different
configuration.
Thanks for letting us know! We will resolve this quickly :-)
Joris
On Wed, Sep 16, 2015 at 6:05 PM, Jie Yu <yu...@gmail.com> wrote:
> Joris,
>
> It breaks the build:
>
> picojson-1.3.0/picojson.h: In member function ‘std::string
> picojson::value::to_str() const’:
> picojson-1.3.0/picojson.h:370:38: error: expected ‘)’ before ‘PRId64’
> SNPRINTF(buf, sizeof(buf), "%" PRId64, u_.int64_);
>
>
>
> On Wed, Sep 16, 2015 at 2:56 PM, <jo...@apache.org> wrote:
>
> > Integer Precision for JSON <-> Protobuf conversions.
> >
> > * Add TODO's for refactoring some JSON parsing in the docker code
> > (See MESOS-3409). Update how the JSON::Number is used.
> > * Tweak some tests to match changes to JSON::Number.
> > * Address a TODO on one test, which used a workaround for
> > double-precision comparison.
> >
> > Review: https://reviews.apache.org/r/38077
> >
> >
> > Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
> > Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2c277f1c
> > Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2c277f1c
> > Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2c277f1c
> >
> > Branch: refs/heads/master
> > Commit: 2c277f1c0e0dc0a6618ba930bb5f8d9dd753d4be
> > Parents: df9eacb
> > Author: Joseph Wu <jo...@mesosphere.io>
> > Authored: Wed Sep 16 13:44:47 2015 -0400
> > Committer: Joris Van Remoortere <jo...@gmail.com>
> > Committed: Wed Sep 16 17:48:43 2015 -0400
> >
> > ----------------------------------------------------------------------
> > src/docker/docker.cpp | 3 +-
> > .../provisioners/docker/token_manager.cpp | 3 +-
> > src/tests/fault_tolerance_tests.cpp | 2 +-
> > src/tests/master_tests.cpp | 2 +-
> > src/tests/monitor_tests.cpp | 50 +++------
> > src/tests/rate_limiting_tests.cpp | 106
> +++++++++++++------
> > src/tests/slave_tests.cpp | 2 +-
> > 7 files changed, 93 insertions(+), 75 deletions(-)
> > ----------------------------------------------------------------------
> >
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/docker/docker.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
> > index c4c37cb..afcedf1 100755
> > --- a/src/docker/docker.cpp
> > +++ b/src/docker/docker.cpp
> > @@ -236,6 +236,7 @@ Try<Nothing> Docker::validateVersion(const Version&
> > minVersion) const
> > }
> >
> >
> > +// TODO(josephw): Parse this string with a protobuf.
> > Try<Docker::Container> Docker::Container::create(const string& output)
> > {
> > Try<JSON::Array> parse = JSON::parse<JSON::Array>(output);
> > @@ -286,7 +287,7 @@ Try<Docker::Container>
> Docker::Container::create(const
> > string& output)
> > return Error("Error finding Pid in State: " + pidValue.error());
> > }
> >
> > - pid_t pid = pid_t(pidValue.get().value);
> > + pid_t pid = pid_t(pidValue.get().as<int64_t>());
> >
> > Option<pid_t> optionalPid;
> > if (pid != 0) {
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/slave/containerizer/provisioners/docker/token_manager.cpp
> > ----------------------------------------------------------------------
> > diff --git
> a/src/slave/containerizer/provisioners/docker/token_manager.cpp
> > b/src/slave/containerizer/provisioners/docker/token_manager.cpp
> > index aec915f..95f459d 100644
> > --- a/src/slave/containerizer/provisioners/docker/token_manager.cpp
> > +++ b/src/slave/containerizer/provisioners/docker/token_manager.cpp
> > @@ -122,6 +122,7 @@ Token::Token(
> > notBefore(_notBefore) {}
> >
> >
> > +// TODO(josephw): Parse this string with some protobufs.
> > Try<Token> Token::create(const string& raw)
> > {
> > auto decode = [](
> > @@ -196,7 +197,7 @@ Result<Time> Token::getTimeValue(const JSON::Object&
> > object, const string& key)
> >
> > // If expiration is provided, we will process it for future
> validations.
> > if (jsonValue.isSome()) {
> > - Try<Time> time = Time::create(jsonValue.get().value);
> > + Try<Time> time = Time::create(jsonValue.get().as<double>());
> > if (time.isError()) {
> > return Error("Failed to decode time: " + time.error());
> > }
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/fault_tolerance_tests.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/tests/fault_tolerance_tests.cpp
> > b/src/tests/fault_tolerance_tests.cpp
> > index 061e099..c97bc46 100644
> > --- a/src/tests/fault_tolerance_tests.cpp
> > +++ b/src/tests/fault_tolerance_tests.cpp
> > @@ -1918,7 +1918,7 @@ TEST_F(FaultToleranceTest,
> > UpdateFrameworkInfoOnSchedulerFailover)
> > EXPECT_EQ(1u, framework.values.count("failover_timeout"));
> > JSON::Number failoverTimeout =
> > framework.values["failover_timeout"].as<JSON::Number>();
> > - EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.value);
> > + EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.as<double>());
> >
> > EXPECT_EQ(1u, framework.values.count("hostname"));
> > JSON::String hostname =
> framework.values["hostname"].as<JSON::String>();
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/master_tests.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
> > index dd65fcc..e4c89ab 100644
> > --- a/src/tests/master_tests.cpp
> > +++ b/src/tests/master_tests.cpp
> > @@ -2826,7 +2826,7 @@ TEST_F(MasterTest, StateEndpoint)
> > ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
> > EXPECT_EQ(
> > static_cast<int>(Clock::now().secs()),
> > -
> > static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
> > + state.values["start_time"].as<JSON::Number>().as<int>());
> >
> > ASSERT_TRUE(state.values["id"].is<JSON::String>());
> > EXPECT_NE("", state.values["id"].as<JSON::String>().value);
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/monitor_tests.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/tests/monitor_tests.cpp b/src/tests/monitor_tests.cpp
> > index f404955..583e711 100644
> > --- a/src/tests/monitor_tests.cpp
> > +++ b/src/tests/monitor_tests.cpp
> > @@ -106,44 +106,18 @@ TEST(MonitorTest, Statistics)
> > "Content-Type",
> > response);
> >
> > - // TODO(bmahler): Use JSON equality instead to avoid having to use
> > - // numeric limits for double precision.
> > - AWAIT_EXPECT_RESPONSE_BODY_EQ(
> > - strings::format(
> > - "[{"
> > - "\"executor_id\":\"executor\","
> > - "\"executor_name\":\"name\","
> > - "\"framework_id\":\"framework\","
> > - "\"source\":\"source\","
> > - "\"statistics\":{"
> > - "\"cpus_limit\":%g,"
> > - "\"cpus_nr_periods\":%d,"
> > - "\"cpus_nr_throttled\":%d,"
> > - "\"cpus_system_time_secs\":%g,"
> > - "\"cpus_throttled_time_secs\":%g,"
> > - "\"cpus_user_time_secs\":%g,"
> > - "\"mem_anon_bytes\":%lu,"
> > - "\"mem_file_bytes\":%lu,"
> > - "\"mem_limit_bytes\":%lu,"
> > - "\"mem_mapped_file_bytes\":%lu,"
> > - "\"mem_rss_bytes\":%lu,"
> > - "\"timestamp\":"
> > - "%." + stringify(numeric_limits<double>::digits10)
> > + "g"
> > - "}"
> > - "}]",
> > - statistics.cpus_limit(),
> > - statistics.cpus_nr_periods(),
> > - statistics.cpus_nr_throttled(),
> > - statistics.cpus_system_time_secs(),
> > - statistics.cpus_throttled_time_secs(),
> > - statistics.cpus_user_time_secs(),
> > - statistics.mem_anon_bytes(),
> > - statistics.mem_file_bytes(),
> > - statistics.mem_limit_bytes(),
> > - statistics.mem_mapped_file_bytes(),
> > - statistics.mem_rss_bytes(),
> > - statistics.timestamp()).get(),
> > - response);
> > + JSON::Array expected;
> > + JSON::Object usage;
> > + usage.values["executor_id"] = "executor";
> > + usage.values["executor_name"] = "name";
> > + usage.values["framework_id"] = "framework";
> > + usage.values["source"] = "source";
> > + usage.values["statistics"] = JSON::Protobuf(statistics);
> > + expected.values.push_back(usage);
> > +
> > + Try<JSON::Array> result =
> JSON::parse<JSON::Array>(response.get().body);
> > + ASSERT_SOME(result);
> > + ASSERT_EQ(expected, result.get());
> > }
> >
> >
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/rate_limiting_tests.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/tests/rate_limiting_tests.cpp
> > b/src/tests/rate_limiting_tests.cpp
> > index f3aedde..e512aa6 100644
> > --- a/src/tests/rate_limiting_tests.cpp
> > +++ b/src/tests/rate_limiting_tests.cpp
> > @@ -166,12 +166,16 @@ TEST_F(RateLimitingTest, NoRateLimiting)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(1,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > Future<Nothing> removeFramework =
> > @@ -270,12 +274,16 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(1,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // The 2nd message is throttled for a second.
> > @@ -305,8 +313,12 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
> >
> > // The 2nd message is received and but not processed after half
> > // a second because of throttling.
> > - EXPECT_EQ(2,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > EXPECT_TRUE(duplicateFrameworkRegisteredMessage.isPending());
> > }
> >
> > @@ -324,8 +336,10 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> >
> > - EXPECT_EQ(2,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > - EXPECT_EQ(2,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> > + EXPECT_EQ(
> > + 2,
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> >
> > EXPECT_EQ(DRIVER_STOPPED, driver.stop());
> > EXPECT_EQ(DRIVER_STOPPED, driver.join());
> > @@ -481,19 +495,19 @@ TEST_F(RateLimitingTest,
> > DifferentPrincipalFrameworks)
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework1/messages_received"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework2/messages_received"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 1,
> > metrics.values["frameworks/framework1/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 1,
> > metrics.values["frameworks/framework2/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > }
> >
> > // Advance for a second so the message from framework1 (1qps)
> > @@ -508,11 +522,11 @@ TEST_F(RateLimitingTest,
> > DifferentPrincipalFrameworks)
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework1/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 1,
> > metrics.values["frameworks/framework2/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> >
> > // After another half a second framework2 (0.2qps)'s message is
> > // processed as well.
> > @@ -535,19 +549,19 @@ TEST_F(RateLimitingTest,
> > DifferentPrincipalFrameworks)
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework1/messages_received"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework2/messages_received"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework1/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > EXPECT_EQ(
> > 2,
> > metrics.values["frameworks/framework2/messages_processed"]
> > - .as<JSON::Number>().value);
> > + .as<JSON::Number>().as<int64_t>());
> > }
> >
> > // 3. Remove a framework and its message counters are deleted while
> > @@ -705,12 +719,16 @@ TEST_F(RateLimitingTest, SamePrincipalFrameworks)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(2,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // Advance for another half a second to make sure throttled
> > @@ -828,12 +846,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(1,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // 2. Now launch the second (i.e., failover) scheduler using the
> > @@ -898,12 +920,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(2,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // Need another half a second to have it processed.
> > @@ -922,12 +948,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(2,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(2,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 2,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > EXPECT_EQ(DRIVER_STOPPED, driver2.stop());
> > @@ -1012,12 +1042,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(1,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> >
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // The subsequent messages are going to be throttled.
> > @@ -1064,12 +1098,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(5,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 5,
> > +
> > metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > // Four messages not processed, two in the queue and two dropped.
> > - EXPECT_EQ(1,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 1,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> > }
> >
> > // Advance three times for the two pending messages and the exited
> > @@ -1086,12 +1124,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> > const string& messages_received =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> > EXPECT_EQ(1u, metrics.values.count(messages_received));
> > - EXPECT_EQ(5,
> > metrics.values[messages_received].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 5,
> > +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> > const string& messages_processed =
> > "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> > "/messages_processed";
> > EXPECT_EQ(1u, metrics.values.count(messages_processed));
> > // Two messages are dropped.
> > - EXPECT_EQ(3,
> > metrics.values[messages_processed].as<JSON::Number>().value);
> > + EXPECT_EQ(
> > + 3,
> > +
> > metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> >
> > Shutdown();
> > }
> >
> >
> >
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/slave_tests.cpp
> > ----------------------------------------------------------------------
> > diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
> > index 447c43c..dbe9b1d 100644
> > --- a/src/tests/slave_tests.cpp
> > +++ b/src/tests/slave_tests.cpp
> > @@ -1080,7 +1080,7 @@ TEST_F(SlaveTest, StateEndpoint)
> > ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
> > EXPECT_EQ(
> > static_cast<int>(Clock::now().secs()),
> > -
> > static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
> > + state.values["start_time"].as<JSON::Number>().as<int>());
> >
> > // TODO(bmahler): The slave must register for the 'id'
> > // to be non-empty.
> >
> >
>
Re: [5/5] mesos git commit: Integer Precision for JSON <-> Protobuf conversions.
Posted by Jie Yu <yu...@gmail.com>.
Joris,
It breaks the build:
picojson-1.3.0/picojson.h: In member function ‘std::string
picojson::value::to_str() const’:
picojson-1.3.0/picojson.h:370:38: error: expected ‘)’ before ‘PRId64’
SNPRINTF(buf, sizeof(buf), "%" PRId64, u_.int64_);
On Wed, Sep 16, 2015 at 2:56 PM, <jo...@apache.org> wrote:
> Integer Precision for JSON <-> Protobuf conversions.
>
> * Add TODO's for refactoring some JSON parsing in the docker code
> (See MESOS-3409). Update how the JSON::Number is used.
> * Tweak some tests to match changes to JSON::Number.
> * Address a TODO on one test, which used a workaround for
> double-precision comparison.
>
> Review: https://reviews.apache.org/r/38077
>
>
> Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
> Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2c277f1c
> Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2c277f1c
> Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2c277f1c
>
> Branch: refs/heads/master
> Commit: 2c277f1c0e0dc0a6618ba930bb5f8d9dd753d4be
> Parents: df9eacb
> Author: Joseph Wu <jo...@mesosphere.io>
> Authored: Wed Sep 16 13:44:47 2015 -0400
> Committer: Joris Van Remoortere <jo...@gmail.com>
> Committed: Wed Sep 16 17:48:43 2015 -0400
>
> ----------------------------------------------------------------------
> src/docker/docker.cpp | 3 +-
> .../provisioners/docker/token_manager.cpp | 3 +-
> src/tests/fault_tolerance_tests.cpp | 2 +-
> src/tests/master_tests.cpp | 2 +-
> src/tests/monitor_tests.cpp | 50 +++------
> src/tests/rate_limiting_tests.cpp | 106 +++++++++++++------
> src/tests/slave_tests.cpp | 2 +-
> 7 files changed, 93 insertions(+), 75 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/docker/docker.cpp
> ----------------------------------------------------------------------
> diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
> index c4c37cb..afcedf1 100755
> --- a/src/docker/docker.cpp
> +++ b/src/docker/docker.cpp
> @@ -236,6 +236,7 @@ Try<Nothing> Docker::validateVersion(const Version&
> minVersion) const
> }
>
>
> +// TODO(josephw): Parse this string with a protobuf.
> Try<Docker::Container> Docker::Container::create(const string& output)
> {
> Try<JSON::Array> parse = JSON::parse<JSON::Array>(output);
> @@ -286,7 +287,7 @@ Try<Docker::Container> Docker::Container::create(const
> string& output)
> return Error("Error finding Pid in State: " + pidValue.error());
> }
>
> - pid_t pid = pid_t(pidValue.get().value);
> + pid_t pid = pid_t(pidValue.get().as<int64_t>());
>
> Option<pid_t> optionalPid;
> if (pid != 0) {
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/slave/containerizer/provisioners/docker/token_manager.cpp
> ----------------------------------------------------------------------
> diff --git a/src/slave/containerizer/provisioners/docker/token_manager.cpp
> b/src/slave/containerizer/provisioners/docker/token_manager.cpp
> index aec915f..95f459d 100644
> --- a/src/slave/containerizer/provisioners/docker/token_manager.cpp
> +++ b/src/slave/containerizer/provisioners/docker/token_manager.cpp
> @@ -122,6 +122,7 @@ Token::Token(
> notBefore(_notBefore) {}
>
>
> +// TODO(josephw): Parse this string with some protobufs.
> Try<Token> Token::create(const string& raw)
> {
> auto decode = [](
> @@ -196,7 +197,7 @@ Result<Time> Token::getTimeValue(const JSON::Object&
> object, const string& key)
>
> // If expiration is provided, we will process it for future validations.
> if (jsonValue.isSome()) {
> - Try<Time> time = Time::create(jsonValue.get().value);
> + Try<Time> time = Time::create(jsonValue.get().as<double>());
> if (time.isError()) {
> return Error("Failed to decode time: " + time.error());
> }
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/fault_tolerance_tests.cpp
> ----------------------------------------------------------------------
> diff --git a/src/tests/fault_tolerance_tests.cpp
> b/src/tests/fault_tolerance_tests.cpp
> index 061e099..c97bc46 100644
> --- a/src/tests/fault_tolerance_tests.cpp
> +++ b/src/tests/fault_tolerance_tests.cpp
> @@ -1918,7 +1918,7 @@ TEST_F(FaultToleranceTest,
> UpdateFrameworkInfoOnSchedulerFailover)
> EXPECT_EQ(1u, framework.values.count("failover_timeout"));
> JSON::Number failoverTimeout =
> framework.values["failover_timeout"].as<JSON::Number>();
> - EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.value);
> + EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.as<double>());
>
> EXPECT_EQ(1u, framework.values.count("hostname"));
> JSON::String hostname = framework.values["hostname"].as<JSON::String>();
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/master_tests.cpp
> ----------------------------------------------------------------------
> diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
> index dd65fcc..e4c89ab 100644
> --- a/src/tests/master_tests.cpp
> +++ b/src/tests/master_tests.cpp
> @@ -2826,7 +2826,7 @@ TEST_F(MasterTest, StateEndpoint)
> ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
> EXPECT_EQ(
> static_cast<int>(Clock::now().secs()),
> -
> static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
> + state.values["start_time"].as<JSON::Number>().as<int>());
>
> ASSERT_TRUE(state.values["id"].is<JSON::String>());
> EXPECT_NE("", state.values["id"].as<JSON::String>().value);
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/monitor_tests.cpp
> ----------------------------------------------------------------------
> diff --git a/src/tests/monitor_tests.cpp b/src/tests/monitor_tests.cpp
> index f404955..583e711 100644
> --- a/src/tests/monitor_tests.cpp
> +++ b/src/tests/monitor_tests.cpp
> @@ -106,44 +106,18 @@ TEST(MonitorTest, Statistics)
> "Content-Type",
> response);
>
> - // TODO(bmahler): Use JSON equality instead to avoid having to use
> - // numeric limits for double precision.
> - AWAIT_EXPECT_RESPONSE_BODY_EQ(
> - strings::format(
> - "[{"
> - "\"executor_id\":\"executor\","
> - "\"executor_name\":\"name\","
> - "\"framework_id\":\"framework\","
> - "\"source\":\"source\","
> - "\"statistics\":{"
> - "\"cpus_limit\":%g,"
> - "\"cpus_nr_periods\":%d,"
> - "\"cpus_nr_throttled\":%d,"
> - "\"cpus_system_time_secs\":%g,"
> - "\"cpus_throttled_time_secs\":%g,"
> - "\"cpus_user_time_secs\":%g,"
> - "\"mem_anon_bytes\":%lu,"
> - "\"mem_file_bytes\":%lu,"
> - "\"mem_limit_bytes\":%lu,"
> - "\"mem_mapped_file_bytes\":%lu,"
> - "\"mem_rss_bytes\":%lu,"
> - "\"timestamp\":"
> - "%." + stringify(numeric_limits<double>::digits10)
> + "g"
> - "}"
> - "}]",
> - statistics.cpus_limit(),
> - statistics.cpus_nr_periods(),
> - statistics.cpus_nr_throttled(),
> - statistics.cpus_system_time_secs(),
> - statistics.cpus_throttled_time_secs(),
> - statistics.cpus_user_time_secs(),
> - statistics.mem_anon_bytes(),
> - statistics.mem_file_bytes(),
> - statistics.mem_limit_bytes(),
> - statistics.mem_mapped_file_bytes(),
> - statistics.mem_rss_bytes(),
> - statistics.timestamp()).get(),
> - response);
> + JSON::Array expected;
> + JSON::Object usage;
> + usage.values["executor_id"] = "executor";
> + usage.values["executor_name"] = "name";
> + usage.values["framework_id"] = "framework";
> + usage.values["source"] = "source";
> + usage.values["statistics"] = JSON::Protobuf(statistics);
> + expected.values.push_back(usage);
> +
> + Try<JSON::Array> result = JSON::parse<JSON::Array>(response.get().body);
> + ASSERT_SOME(result);
> + ASSERT_EQ(expected, result.get());
> }
>
>
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/rate_limiting_tests.cpp
> ----------------------------------------------------------------------
> diff --git a/src/tests/rate_limiting_tests.cpp
> b/src/tests/rate_limiting_tests.cpp
> index f3aedde..e512aa6 100644
> --- a/src/tests/rate_limiting_tests.cpp
> +++ b/src/tests/rate_limiting_tests.cpp
> @@ -166,12 +166,16 @@ TEST_F(RateLimitingTest, NoRateLimiting)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(1,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> Future<Nothing> removeFramework =
> @@ -270,12 +274,16 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(1,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // The 2nd message is throttled for a second.
> @@ -305,8 +313,12 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
>
> // The 2nd message is received and but not processed after half
> // a second because of throttling.
> - EXPECT_EQ(2,
> metrics.values[messages_received].as<JSON::Number>().value);
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> EXPECT_TRUE(duplicateFrameworkRegisteredMessage.isPending());
> }
>
> @@ -324,8 +336,10 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
>
> - EXPECT_EQ(2,
> metrics.values[messages_received].as<JSON::Number>().value);
> - EXPECT_EQ(2,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> + EXPECT_EQ(
> + 2,
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>
> EXPECT_EQ(DRIVER_STOPPED, driver.stop());
> EXPECT_EQ(DRIVER_STOPPED, driver.join());
> @@ -481,19 +495,19 @@ TEST_F(RateLimitingTest,
> DifferentPrincipalFrameworks)
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework1/messages_received"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework2/messages_received"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 1,
> metrics.values["frameworks/framework1/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 1,
> metrics.values["frameworks/framework2/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> }
>
> // Advance for a second so the message from framework1 (1qps)
> @@ -508,11 +522,11 @@ TEST_F(RateLimitingTest,
> DifferentPrincipalFrameworks)
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework1/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 1,
> metrics.values["frameworks/framework2/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
>
> // After another half a second framework2 (0.2qps)'s message is
> // processed as well.
> @@ -535,19 +549,19 @@ TEST_F(RateLimitingTest,
> DifferentPrincipalFrameworks)
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework1/messages_received"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework2/messages_received"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework1/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> EXPECT_EQ(
> 2,
> metrics.values["frameworks/framework2/messages_processed"]
> - .as<JSON::Number>().value);
> + .as<JSON::Number>().as<int64_t>());
> }
>
> // 3. Remove a framework and its message counters are deleted while
> @@ -705,12 +719,16 @@ TEST_F(RateLimitingTest, SamePrincipalFrameworks)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(2,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // Advance for another half a second to make sure throttled
> @@ -828,12 +846,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(1,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // 2. Now launch the second (i.e., failover) scheduler using the
> @@ -898,12 +920,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(2,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // Need another half a second to have it processed.
> @@ -922,12 +948,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(2,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(2,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 2,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> EXPECT_EQ(DRIVER_STOPPED, driver2.stop());
> @@ -1012,12 +1042,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(1,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
>
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // The subsequent messages are going to be throttled.
> @@ -1064,12 +1098,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(5,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 5,
> +
> metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> // Four messages not processed, two in the queue and two dropped.
> - EXPECT_EQ(1,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 1,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
> }
>
> // Advance three times for the two pending messages and the exited
> @@ -1086,12 +1124,16 @@ TEST_F(RateLimitingTest, CapacityReached)
> const string& messages_received =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
> EXPECT_EQ(1u, metrics.values.count(messages_received));
> - EXPECT_EQ(5,
> metrics.values[messages_received].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 5,
> + metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
> const string& messages_processed =
> "frameworks/" + DEFAULT_CREDENTIAL.principal() +
> "/messages_processed";
> EXPECT_EQ(1u, metrics.values.count(messages_processed));
> // Two messages are dropped.
> - EXPECT_EQ(3,
> metrics.values[messages_processed].as<JSON::Number>().value);
> + EXPECT_EQ(
> + 3,
> +
> metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
>
> Shutdown();
> }
>
>
> http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/slave_tests.cpp
> ----------------------------------------------------------------------
> diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
> index 447c43c..dbe9b1d 100644
> --- a/src/tests/slave_tests.cpp
> +++ b/src/tests/slave_tests.cpp
> @@ -1080,7 +1080,7 @@ TEST_F(SlaveTest, StateEndpoint)
> ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
> EXPECT_EQ(
> static_cast<int>(Clock::now().secs()),
> -
> static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
> + state.values["start_time"].as<JSON::Number>().as<int>());
>
> // TODO(bmahler): The slave must register for the 'id'
> // to be non-empty.
>
>
[5/5] mesos git commit: Integer Precision for JSON <-> Protobuf
conversions.
Posted by jo...@apache.org.
Integer Precision for JSON <-> Protobuf conversions.
* Add TODO's for refactoring some JSON parsing in the docker code
(See MESOS-3409). Update how the JSON::Number is used.
* Tweak some tests to match changes to JSON::Number.
* Address a TODO on one test, which used a workaround for
double-precision comparison.
Review: https://reviews.apache.org/r/38077
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2c277f1c
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2c277f1c
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2c277f1c
Branch: refs/heads/master
Commit: 2c277f1c0e0dc0a6618ba930bb5f8d9dd753d4be
Parents: df9eacb
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Wed Sep 16 13:44:47 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Wed Sep 16 17:48:43 2015 -0400
----------------------------------------------------------------------
src/docker/docker.cpp | 3 +-
.../provisioners/docker/token_manager.cpp | 3 +-
src/tests/fault_tolerance_tests.cpp | 2 +-
src/tests/master_tests.cpp | 2 +-
src/tests/monitor_tests.cpp | 50 +++------
src/tests/rate_limiting_tests.cpp | 106 +++++++++++++------
src/tests/slave_tests.cpp | 2 +-
7 files changed, 93 insertions(+), 75 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index c4c37cb..afcedf1 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -236,6 +236,7 @@ Try<Nothing> Docker::validateVersion(const Version& minVersion) const
}
+// TODO(josephw): Parse this string with a protobuf.
Try<Docker::Container> Docker::Container::create(const string& output)
{
Try<JSON::Array> parse = JSON::parse<JSON::Array>(output);
@@ -286,7 +287,7 @@ Try<Docker::Container> Docker::Container::create(const string& output)
return Error("Error finding Pid in State: " + pidValue.error());
}
- pid_t pid = pid_t(pidValue.get().value);
+ pid_t pid = pid_t(pidValue.get().as<int64_t>());
Option<pid_t> optionalPid;
if (pid != 0) {
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/slave/containerizer/provisioners/docker/token_manager.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/provisioners/docker/token_manager.cpp b/src/slave/containerizer/provisioners/docker/token_manager.cpp
index aec915f..95f459d 100644
--- a/src/slave/containerizer/provisioners/docker/token_manager.cpp
+++ b/src/slave/containerizer/provisioners/docker/token_manager.cpp
@@ -122,6 +122,7 @@ Token::Token(
notBefore(_notBefore) {}
+// TODO(josephw): Parse this string with some protobufs.
Try<Token> Token::create(const string& raw)
{
auto decode = [](
@@ -196,7 +197,7 @@ Result<Time> Token::getTimeValue(const JSON::Object& object, const string& key)
// If expiration is provided, we will process it for future validations.
if (jsonValue.isSome()) {
- Try<Time> time = Time::create(jsonValue.get().value);
+ Try<Time> time = Time::create(jsonValue.get().as<double>());
if (time.isError()) {
return Error("Failed to decode time: " + time.error());
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/fault_tolerance_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/fault_tolerance_tests.cpp b/src/tests/fault_tolerance_tests.cpp
index 061e099..c97bc46 100644
--- a/src/tests/fault_tolerance_tests.cpp
+++ b/src/tests/fault_tolerance_tests.cpp
@@ -1918,7 +1918,7 @@ TEST_F(FaultToleranceTest, UpdateFrameworkInfoOnSchedulerFailover)
EXPECT_EQ(1u, framework.values.count("failover_timeout"));
JSON::Number failoverTimeout =
framework.values["failover_timeout"].as<JSON::Number>();
- EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.value);
+ EXPECT_EQ(finfo2.failover_timeout(), failoverTimeout.as<double>());
EXPECT_EQ(1u, framework.values.count("hostname"));
JSON::String hostname = framework.values["hostname"].as<JSON::String>();
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index dd65fcc..e4c89ab 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -2826,7 +2826,7 @@ TEST_F(MasterTest, StateEndpoint)
ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
EXPECT_EQ(
static_cast<int>(Clock::now().secs()),
- static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
+ state.values["start_time"].as<JSON::Number>().as<int>());
ASSERT_TRUE(state.values["id"].is<JSON::String>());
EXPECT_NE("", state.values["id"].as<JSON::String>().value);
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/monitor_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/monitor_tests.cpp b/src/tests/monitor_tests.cpp
index f404955..583e711 100644
--- a/src/tests/monitor_tests.cpp
+++ b/src/tests/monitor_tests.cpp
@@ -106,44 +106,18 @@ TEST(MonitorTest, Statistics)
"Content-Type",
response);
- // TODO(bmahler): Use JSON equality instead to avoid having to use
- // numeric limits for double precision.
- AWAIT_EXPECT_RESPONSE_BODY_EQ(
- strings::format(
- "[{"
- "\"executor_id\":\"executor\","
- "\"executor_name\":\"name\","
- "\"framework_id\":\"framework\","
- "\"source\":\"source\","
- "\"statistics\":{"
- "\"cpus_limit\":%g,"
- "\"cpus_nr_periods\":%d,"
- "\"cpus_nr_throttled\":%d,"
- "\"cpus_system_time_secs\":%g,"
- "\"cpus_throttled_time_secs\":%g,"
- "\"cpus_user_time_secs\":%g,"
- "\"mem_anon_bytes\":%lu,"
- "\"mem_file_bytes\":%lu,"
- "\"mem_limit_bytes\":%lu,"
- "\"mem_mapped_file_bytes\":%lu,"
- "\"mem_rss_bytes\":%lu,"
- "\"timestamp\":"
- "%." + stringify(numeric_limits<double>::digits10) + "g"
- "}"
- "}]",
- statistics.cpus_limit(),
- statistics.cpus_nr_periods(),
- statistics.cpus_nr_throttled(),
- statistics.cpus_system_time_secs(),
- statistics.cpus_throttled_time_secs(),
- statistics.cpus_user_time_secs(),
- statistics.mem_anon_bytes(),
- statistics.mem_file_bytes(),
- statistics.mem_limit_bytes(),
- statistics.mem_mapped_file_bytes(),
- statistics.mem_rss_bytes(),
- statistics.timestamp()).get(),
- response);
+ JSON::Array expected;
+ JSON::Object usage;
+ usage.values["executor_id"] = "executor";
+ usage.values["executor_name"] = "name";
+ usage.values["framework_id"] = "framework";
+ usage.values["source"] = "source";
+ usage.values["statistics"] = JSON::Protobuf(statistics);
+ expected.values.push_back(usage);
+
+ Try<JSON::Array> result = JSON::parse<JSON::Array>(response.get().body);
+ ASSERT_SOME(result);
+ ASSERT_EQ(expected, result.get());
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/rate_limiting_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/rate_limiting_tests.cpp b/src/tests/rate_limiting_tests.cpp
index f3aedde..e512aa6 100644
--- a/src/tests/rate_limiting_tests.cpp
+++ b/src/tests/rate_limiting_tests.cpp
@@ -166,12 +166,16 @@ TEST_F(RateLimitingTest, NoRateLimiting)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(1, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
Future<Nothing> removeFramework =
@@ -270,12 +274,16 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(1, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// The 2nd message is throttled for a second.
@@ -305,8 +313,12 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
// The 2nd message is received and but not processed after half
// a second because of throttling.
- EXPECT_EQ(2, metrics.values[messages_received].as<JSON::Number>().value);
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
EXPECT_TRUE(duplicateFrameworkRegisteredMessage.isPending());
}
@@ -324,8 +336,10 @@ TEST_F(RateLimitingTest, RateLimitingEnabled)
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(2, metrics.values[messages_received].as<JSON::Number>().value);
- EXPECT_EQ(2, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2, metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
+ EXPECT_EQ(
+ 2, metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
EXPECT_EQ(DRIVER_STOPPED, driver.stop());
EXPECT_EQ(DRIVER_STOPPED, driver.join());
@@ -481,19 +495,19 @@ TEST_F(RateLimitingTest, DifferentPrincipalFrameworks)
EXPECT_EQ(
2,
metrics.values["frameworks/framework1/messages_received"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
2,
metrics.values["frameworks/framework2/messages_received"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
1,
metrics.values["frameworks/framework1/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
1,
metrics.values["frameworks/framework2/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
}
// Advance for a second so the message from framework1 (1qps)
@@ -508,11 +522,11 @@ TEST_F(RateLimitingTest, DifferentPrincipalFrameworks)
EXPECT_EQ(
2,
metrics.values["frameworks/framework1/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
1,
metrics.values["frameworks/framework2/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
// After another half a second framework2 (0.2qps)'s message is
// processed as well.
@@ -535,19 +549,19 @@ TEST_F(RateLimitingTest, DifferentPrincipalFrameworks)
EXPECT_EQ(
2,
metrics.values["frameworks/framework1/messages_received"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
2,
metrics.values["frameworks/framework2/messages_received"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
2,
metrics.values["frameworks/framework1/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
EXPECT_EQ(
2,
metrics.values["frameworks/framework2/messages_processed"]
- .as<JSON::Number>().value);
+ .as<JSON::Number>().as<int64_t>());
}
// 3. Remove a framework and its message counters are deleted while
@@ -705,12 +719,16 @@ TEST_F(RateLimitingTest, SamePrincipalFrameworks)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(2, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// Advance for another half a second to make sure throttled
@@ -828,12 +846,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(1, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// 2. Now launch the second (i.e., failover) scheduler using the
@@ -898,12 +920,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(2, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// Need another half a second to have it processed.
@@ -922,12 +948,16 @@ TEST_F(RateLimitingTest, SchedulerFailover)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(2, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(2, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 2,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
EXPECT_EQ(DRIVER_STOPPED, driver2.stop());
@@ -1012,12 +1042,16 @@ TEST_F(RateLimitingTest, CapacityReached)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(1, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// The subsequent messages are going to be throttled.
@@ -1064,12 +1098,16 @@ TEST_F(RateLimitingTest, CapacityReached)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(5, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 5,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
// Four messages not processed, two in the queue and two dropped.
- EXPECT_EQ(1, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 1,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
}
// Advance three times for the two pending messages and the exited
@@ -1086,12 +1124,16 @@ TEST_F(RateLimitingTest, CapacityReached)
const string& messages_received =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_received";
EXPECT_EQ(1u, metrics.values.count(messages_received));
- EXPECT_EQ(5, metrics.values[messages_received].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 5,
+ metrics.values[messages_received].as<JSON::Number>().as<int64_t>());
const string& messages_processed =
"frameworks/" + DEFAULT_CREDENTIAL.principal() + "/messages_processed";
EXPECT_EQ(1u, metrics.values.count(messages_processed));
// Two messages are dropped.
- EXPECT_EQ(3, metrics.values[messages_processed].as<JSON::Number>().value);
+ EXPECT_EQ(
+ 3,
+ metrics.values[messages_processed].as<JSON::Number>().as<int64_t>());
Shutdown();
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/2c277f1c/src/tests/slave_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
index 447c43c..dbe9b1d 100644
--- a/src/tests/slave_tests.cpp
+++ b/src/tests/slave_tests.cpp
@@ -1080,7 +1080,7 @@ TEST_F(SlaveTest, StateEndpoint)
ASSERT_TRUE(state.values["start_time"].is<JSON::Number>());
EXPECT_EQ(
static_cast<int>(Clock::now().secs()),
- static_cast<int>(state.values["start_time"].as<JSON::Number>().value));
+ state.values["start_time"].as<JSON::Number>().as<int>());
// TODO(bmahler): The slave must register for the 'id'
// to be non-empty.