}
std::ostream& dump_brief(std::ostream& os) const override {
- auto& node_stage = extent.read();
- os << "Node" << NODE_TYPE << FIELD_TYPE
- << "@0x" << std::hex << extent.get_laddr()
- << "+" << node_stage_t::EXTENT_SIZE << std::dec
- << (node_stage.is_level_tail() ? "$" : "")
- << "(level=" << (unsigned)node_stage.level()
- << ", filled=" << filled_size() << "B"
- << ", free=" << node_stage.free_size() << "B"
- << ")";
+ os << name
+ << "(filled=" << filled_size() << "B"
+ << ", free=" << extent.read().free_size() << "B)";
return os;
}
+ const std::string& get_name() const override { return name; }
+
void validate_layout() const override {
#ifndef NDEBUG
STAGE_T::validate(extent.read());
void test_set_tail(NodeExtentMutable& mut) override {
node_stage_t::update_is_level_tail(mut, extent.read(), true);
+ build_name();
}
/*
#endif
extent.split_replayable(split_at);
}
+ if (right_impl.is_level_tail()) {
+ // is_level_tail of left is changed by split/split_insert
+ build_name();
+ }
if (unlikely(logger().is_enabled(seastar::log_level::debug))) {
std::ostringstream sos;
dump(sos);
}
private:
- NodeLayoutT(NodeExtentRef extent) : extent{extent} {}
+ NodeLayoutT(NodeExtentRef extent) : extent{extent} {
+ build_name();
+ }
node_offset_t filled_size() const {
auto& node_stage = extent.read();
return ret;
}
+ // rebuild the name whenever addr, type, level, tail is changed
+ void build_name() {
+ // XXX: maybe also include the extent state
+ std::ostringstream sos;
+ sos << "Node" << NODE_TYPE << FIELD_TYPE
+ << "@0x" << std::hex << extent.get_laddr()
+ << "+" << node_stage_t::EXTENT_SIZE << std::dec
+ << "Lv" << (unsigned)level()
+ << (is_level_tail() ? "$" : "");
+ name = sos.str();
+ }
+
static seastar::logger& logger() {
return crimson::get_logger(ceph_subsys_filestore);
}
extent_t extent;
+ std::string name = "Node-N/A";
};
using InternalNode0 = NodeLayoutT<node_fields_0_t, node_type_t::INTERNAL>;
DummyChildImpl(const std::set<ghobject_t>& keys, bool is_level_tail, laddr_t laddr)
: keys{keys}, _is_level_tail{is_level_tail}, _laddr{laddr} {
std::tie(key_view, p_mem_key_view) = build_key_view(*keys.crbegin());
+ build_name();
}
~DummyChildImpl() override {
std::free(p_mem_key_view);
_is_level_tail = level_tail;
std::free(p_mem_key_view);
std::tie(key_view, p_mem_key_view) = build_key_view(*keys.crbegin());
+ build_name();
}
public:
laddr_t laddr() const override { return _laddr; }
bool is_level_tail() const override { return _is_level_tail; }
std::optional<key_view_t> get_pivot_index() const override { return {key_view}; }
+ const std::string& get_name() const override { return name; }
protected:
node_type_t node_type() const override { return node_type_t::LEAF; }
ceph_abort("impossible path"); }
private:
+ void build_name() {
+ std::ostringstream sos;
+ sos << "DummyNode"
+ << "@0x" << std::hex << laddr() << std::dec
+ << "Lv" << (unsigned)level()
+ << (is_level_tail() ? "$" : "")
+ << "(" << key_view << ")";
+ name = sos.str();
+ }
+
std::set<ghobject_t> keys;
bool _is_level_tail;
laddr_t _laddr;
+ std::string name;
key_view_t key_view;
void* p_mem_key_view;