From: Kefu Chai Date: Fri, 18 Feb 2022 15:23:54 +0000 (+0800) Subject: crimson: specialize fmt::formatter<>() for crimson types X-Git-Tag: v17.2.4~107^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ebcb27d1d9d8346a9d26c42e8a24f3087e6651eb;p=ceph.git crimson: specialize fmt::formatter<>() for crimson types 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 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, 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 (cherry picked from commit bb9d099ede8b9df36dba735a95bc1600fdd11408) --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h index c5ee76b71bca..22c140b5993d 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_types.h @@ -109,3 +109,37 @@ enum class nextent_state_t : uint8_t { }; } + +template <> struct fmt::formatter + : fmt::formatter { + using node_delta_op_t = crimson::os::seastore::onode::node_delta_op_t; + // parse is inherited from formatter. + template + 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::format(name, ctx); + } +}; diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index eb166b1ad325..2d38788c5799 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -35,6 +35,46 @@ using std::string; using crimson::common::local_conf; +template <> struct fmt::formatter + : fmt::formatter { + using op_type_t = crimson::os::seastore::SeaStore::op_type_t; + // parse is inherited from formatter. + template + 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::format(name, ctx); + } +}; + SET_SUBSYS(seastore); namespace crimson::os::seastore { diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index f27942d5d3e7..ced49d630532 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -4,6 +4,8 @@ #include #include +#include + #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: fmt::formatter { + // parse is inherited from formatter. + template + 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::format(name, ctx); + } +}; + namespace crimson::os::seastore::segment_manager::block { static write_ertr::future<> do_write( diff --git a/src/test/crimson/seastore/onode_tree/test_value.h b/src/test/crimson/seastore/onode_tree/test_value.h index 4a2a21b98fa7..83a500e5dd64 100644 --- a/src/test/crimson/seastore/onode_tree/test_value.h +++ b/src/test/crimson/seastore/onode_tree/test_value.h @@ -3,6 +3,8 @@ #pragma once +#include + #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