]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/Formatter: dump inf/nan as null 60064/head
authorsajibreadd <sajibreadd@gmail.com>
Fri, 24 May 2024 11:27:26 +0000 (17:27 +0600)
committersajibreadd <sajibreadd@gmail.com>
Mon, 30 Sep 2024 15:18:42 +0000 (17:18 +0200)
Fixes: https://tracker.ceph.com/issues/66215
Signed-off-by: Md Mahamudur Rahaman Sajib <mahamudur.sajib@croit.io>
(cherry picked from commit 214328d9daa70a9299255bf07e7169dac1ccf5bd)

Conflicts:
src/common/Formatter.h

src/common/Formatter.cc
src/common/Formatter.h
src/test/common/test_json_formatter.cc

index f121afa07a3e386ccbabde7a7b5d614d8fe695ba..d884b161bd60168fb91ce9e73ca365886ca61800 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "HTMLFormatter.h"
 #include "common/escape.h"
+#include "common/StackStringStream.h"
 #include "include/buffer.h"
 
 #include <fmt/format.h>
@@ -289,6 +290,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<double>::max_digits10);
+    *css << val;
+  }
+  add_value(name, css->strv(), false);
+}
+
 template <class T>
 void JSONFormatter::add_value(std::string_view name, T val)
 {
index 14f30c84f3de7056b2e4ffb1db0e769eb9b6b90f..0473ecbde09e38e2e730e06e971b582bcfe1503a 100644 (file)
@@ -189,6 +189,7 @@ namespace ceph {
     void print_name(std::string_view name);
     void print_comma(json_formatter_stack_entry_d& entry);
     void finish_pending_string();
+    void add_value(std::string_view name, double val);
 
     template <class T>
     void add_value(std::string_view name, T val);
index 8a0f547a9298a7be32bef141c43aa0438143c9a6..9cc19b24ad1b873d5b5640e6556dfbfc907c8723 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "common/ceph_json.h"
 #include "common/Clock.h"
+#include "common/StackStringStream.h"
 
 #include <sstream>
 
@@ -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<double>::infinity();
+  formatter.dump_float("positive_infinity", inf);
+  formatter.dump_float("negative_infinity", -inf);
+  formatter.dump_float("nan_val", std::numeric_limits<double>::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");
+}