From bb9d099ede8b9df36dba735a95bc1600fdd11408 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 18 Feb 2022 23:23:54 +0800 Subject: [PATCH] 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 --- .../onode_manager/staged-fltree/node_types.h | 34 ++++++++++++++++ src/crimson/os/seastore/seastore.cc | 40 +++++++++++++++++++ .../os/seastore/segment_manager/block.cc | 24 +++++++++++ .../crimson/seastore/onode_tree/test_value.h | 22 ++++++++-- 4 files changed, 116 insertions(+), 4 deletions(-) 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 c5ee76b71bc..22c140b5993 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 0225e76664e..bbae6c1b592 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 aac9376cc7f..88a57e7be8e 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 4a2a21b98fa..83a500e5dd6 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