]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: specialize fmt::formatter<>() for crimson types
authorKefu Chai <tchaikov@gmail.com>
Fri, 18 Feb 2022 15:23:54 +0000 (23:23 +0800)
committerKefu Chai <tchaikov@gmail.com>
Mon, 15 Aug 2022 16:55:07 +0000 (00:55 +0800)
otherwise we'd have FTBFS like

/usr/include/fmt/core.h:1727:3: error: static_assert failed due to requirement 'formattable' "Cannot format an argument. To make type T formattable provide a formatter<T> specialization: https://fmt.dev/latest/api$
  static_assert(
  ^
/usr/include/fmt/core.h:1853:23: note: in instantiation of function template specialization 'fmt::detail::make_arg<true, fmt::basic_format_context<fmt::appender, char>, fmt::detail::type::custom_type, crimson::os:$
        data_{detail::make_arg<

please note, delta_op_t is lifted out of the templated outer class
to avoid the headache of specialization of template of template in
another namespace.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
(cherry picked from commit bb9d099ede8b9df36dba735a95bc1600fdd11408)

src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h
src/crimson/os/seastore/seastore.cc
src/crimson/os/seastore/segment_manager/block.cc
src/test/crimson/seastore/onode_tree/test_value.h

index c5ee76b71bca8ec408db03240ee839d4e63ebe6a..22c140b5993d948063150e1502227dd5f305b32e 100644 (file)
@@ -109,3 +109,37 @@ enum class nextent_state_t : uint8_t {
 };
 
 }
+
+template <> struct fmt::formatter<crimson::os::seastore::onode::node_delta_op_t>
+  : fmt::formatter<std::string_view> {
+  using node_delta_op_t =  crimson::os::seastore::onode::node_delta_op_t;
+  // parse is inherited from formatter<string_view>.
+  template <typename FormatContext>
+  auto format(node_delta_op_t op, FormatContext& ctx) {
+    std::string_view name = "unknown";
+    switch (op) {
+    case node_delta_op_t::INSERT:
+      name = "insert";
+      break;
+    case node_delta_op_t::SPLIT:
+      name = "split";
+      break;
+    case node_delta_op_t::SPLIT_INSERT:
+      name = "split_insert";
+      break;
+    case node_delta_op_t::UPDATE_CHILD_ADDR:
+      name = "update_child_addr";
+      break;
+    case node_delta_op_t::ERASE:
+      name = "erase";
+      break;
+    case node_delta_op_t::MAKE_TAIL:
+      name = "make_tail";
+      break;
+    case node_delta_op_t::SUBOP_UPDATE_VALUE:
+      name = "subop_update_value";
+      break;
+    }
+    return formatter<string_view>::format(name, ctx);
+  }
+};
index eb166b1ad3258ee005eb6049774c099b2774cfed..2d38788c57992b70616408e618f5dd8c9da750a5 100644 (file)
 using std::string;
 using crimson::common::local_conf;
 
+template <> struct fmt::formatter<crimson::os::seastore::SeaStore::op_type_t>
+  : fmt::formatter<std::string_view> {
+  using op_type_t =  crimson::os::seastore::SeaStore::op_type_t;
+  // parse is inherited from formatter<string_view>.
+  template <typename FormatContext>
+  auto format(op_type_t op, FormatContext& ctx) {
+    std::string_view name = "unknown";
+    switch (op) {
+      case op_type_t::TRANSACTION:
+      name = "transaction";
+      break;
+    case op_type_t::READ:
+      name = "read";
+      break;
+    case op_type_t::WRITE:
+      name = "write";
+      break;
+    case op_type_t::GET_ATTR:
+      name = "get_attr";
+      break;
+    case op_type_t::GET_ATTRS:
+      name = "get_attrs";
+      break;
+    case op_type_t::STAT:
+      name = "stat";
+      break;
+    case op_type_t::OMAP_GET_VALUES:
+      name = "omap_get_values";
+      break;
+    case op_type_t::OMAP_LIST:
+      name = "omap_list";
+      break;
+    case op_type_t::MAX:
+      name = "unknown";
+      break;
+    }
+    return formatter<string_view>::format(name, ctx);
+  }
+};
+
 SET_SUBSYS(seastore);
 
 namespace crimson::os::seastore {
index f27942d5d3e77b09430e6d6481b4d139cff44daa..ced49d630532998df37d5108ece514b1417de995 100644 (file)
@@ -4,6 +4,8 @@
 #include <sys/mman.h>
 #include <string.h>
 
+#include <fmt/format.h>
+
 #include "include/buffer.h"
 
 #include "crimson/common/config_proxy.h"
@@ -24,6 +26,28 @@ SET_SUBSYS(seastore_device);
  * - TRACE: DEBUG details
  */
 
+using segment_state_t = crimson::os::seastore::Segment::segment_state_t;
+
+template <> struct fmt::formatter<segment_state_t>: fmt::formatter<std::string_view> {
+  // parse is inherited from formatter<string_view>.
+  template <typename FormatContext>
+  auto format(segment_state_t s, FormatContext& ctx) {
+    std::string_view name = "unknown";
+    switch (s) {
+    case segment_state_t::EMPTY:
+      name = "empty";
+      break;
+    case segment_state_t::OPEN:
+      name = "open";
+      break;
+    case segment_state_t::CLOSED:
+      name = "closed";
+      break;
+    }
+    return formatter<string_view>::format(name, ctx);
+  }
+};
+
 namespace crimson::os::seastore::segment_manager::block {
 
 static write_ertr::future<> do_write(
index 4a2a21b98fa73c254fffd6e9873d8f03e236ac9a..83a500e5dd64aa70ef047dcd3229e56896d9f71f 100644 (file)
@@ -3,6 +3,8 @@
 
 #pragma once
 
+#include <fmt/format.h>
+
 #include "crimson/common/log.h"
 #include "crimson/os/seastore/onode_manager/staged-fltree/value.h"
 
@@ -36,6 +38,22 @@ inline std::ostream& operator<<(std::ostream& os, const test_item_t& item) {
   return os << "TestItem(#" << item.id << ", " << item.size << "B)";
 }
 
+enum class delta_op_t : uint8_t {
+  UPDATE_ID,
+  UPDATE_TAIL_MAGIC,
+};
+
+inline std::ostream& operator<<(std::ostream& os, const delta_op_t op) {
+  switch (op) {
+  case delta_op_t::UPDATE_ID:
+    return os << "update_id";
+  case delta_op_t::UPDATE_TAIL_MAGIC:
+    return os << "update_tail_magic";
+  default:
+    return os << "unknown";
+  }
+}
+
 template <value_magic_t MAGIC,
           string_size_t MAX_NS_SIZE,
           string_size_t MAX_OID_SIZE,
@@ -86,10 +104,6 @@ class TestValue final : public Value {
 
  public:
   class Recorder final : public ValueDeltaRecorder {
-    enum class delta_op_t : uint8_t {
-      UPDATE_ID,
-      UPDATE_TAIL_MAGIC,
-    };
 
    public:
     Recorder(ceph::bufferlist& encoded)