From: sajibreadd Date: Fri, 24 May 2024 11:27:26 +0000 (+0600) Subject: common/Formatter: dump inf/nan as null X-Git-Tag: v20.0.0~947^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=214328d9daa70a9299255bf07e7169dac1ccf5bd;p=ceph.git common/Formatter: dump inf/nan as null Fixes: https://tracker.ceph.com/issues/66215 Signed-off-by: Md Mahamudur Rahaman Sajib --- diff --git a/src/common/Formatter.cc b/src/common/Formatter.cc index f68f87f46453..fd3b2be02214 100644 --- a/src/common/Formatter.cc +++ b/src/common/Formatter.cc @@ -296,6 +296,17 @@ void JSONFormatter::finish_pending_string() } } +void JSONFormatter::add_value(std::string_view name, double val) { + CachedStackStringStream css; + if (!std::isfinite(val) || std::isnan(val)) { + *css << "null"; + } else { + css->precision(std::numeric_limits::max_digits10); + *css << val; + } + add_value(name, css->strv(), false); +} + template void JSONFormatter::add_value(std::string_view name, T val) { diff --git a/src/common/Formatter.h b/src/common/Formatter.h index 5575c931adc7..c237e8ea207d 100644 --- a/src/common/Formatter.h +++ b/src/common/Formatter.h @@ -232,6 +232,7 @@ private: void print_quoted_string(std::string_view s); void print_name(std::string_view name); void print_comma(json_formatter_stack_entry_d& entry); + void add_value(std::string_view name, double val); template void add_value(std::string_view name, T val); diff --git a/src/test/common/test_json_formatter.cc b/src/test/common/test_json_formatter.cc index 8a0f547a9298..9cc19b24ad1b 100644 --- a/src/test/common/test_json_formatter.cc +++ b/src/test/common/test_json_formatter.cc @@ -17,6 +17,7 @@ #include "common/ceph_json.h" #include "common/Clock.h" +#include "common/StackStringStream.h" #include @@ -79,3 +80,25 @@ TEST(formatter, utime) EXPECT_EQ(input.sec(), output.sec()); EXPECT_EQ(input.nsec(), output.nsec()); } + +TEST(formatter, dump_inf_or_nan) +{ + JSONFormatter formatter; + formatter.open_object_section("inf_and_nan"); + double inf = std::numeric_limits::infinity(); + formatter.dump_float("positive_infinity", inf); + formatter.dump_float("negative_infinity", -inf); + formatter.dump_float("nan_val", std::numeric_limits::quiet_NaN()); + formatter.dump_float("nan_val_alt", std::nan("")); + formatter.close_section(); + bufferlist bl; + formatter.flush(bl); + std::cout << std::string(bl.c_str(), bl.length()) << std::endl; + JSONParser parser; + parser.parse(bl.c_str(), bl.length()); + EXPECT_TRUE(parser.parse(bl.c_str(), bl.length())); + EXPECT_EQ(parser.find_obj("positive_infinity")->get_data(), "null"); + EXPECT_EQ(parser.find_obj("negative_infinity")->get_data(), "null"); + EXPECT_EQ(parser.find_obj("nan_val")->get_data(), "null"); + EXPECT_EQ(parser.find_obj("nan_val_alt")->get_data(), "null"); +}