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)
};
}
+
+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);
+ }
+};
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 {
#include <sys/mman.h>
#include <string.h>
+#include <fmt/format.h>
+
#include "include/buffer.h"
#include "crimson/common/config_proxy.h"
* - 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(
#pragma once
+#include <fmt/format.h>
+
#include "crimson/common/log.h"
#include "crimson/os/seastore/onode_manager/staged-fltree/value.h"
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,
public:
class Recorder final : public ValueDeltaRecorder {
- enum class delta_op_t : uint8_t {
- UPDATE_ID,
- UPDATE_TAIL_MAGIC,
- };
public:
Recorder(ceph::bufferlist& encoded)