);
}
+ /**
+ * Record header fullness
+ */
+ auto record_type_label = sm::label("record_type");
+ using namespace std::literals::string_view_literals;
+ const string_view record_type_names[] = {
+ "INLINE"sv,
+ "OOL"sv,
+ };
+ for (auto& [src, src_label] : labels_by_src) {
+ if (src == src_t::READ) {
+ // READ transaction won't commit
+ continue;
+ }
+ auto& record_header_fullness = get_by_src(
+ stats.record_header_fullness_by_src, src);
+ for (auto& record_type_name : record_type_names) {
+ auto& fill_stat = [&record_type_name,
+ &record_header_fullness]() -> fill_stat_t& {
+ if (record_type_name == "INLINE") {
+ return record_header_fullness.inline_stats;
+ } else {
+ assert(record_type_name == "OOL");
+ return record_header_fullness.ool_stats;
+ }
+ }();
+ metrics.add_group(
+ "cache",
+ {
+ sm::make_counter(
+ "record_header_filled_bytes",
+ fill_stat.filled_bytes,
+ sm::description("filled bytes of record header"),
+ {src_label, record_type_label(record_type_name)}
+ ),
+ sm::make_counter(
+ "record_header_total_bytes",
+ fill_stat.total_bytes,
+ sm::description("total bytes of record header"),
+ {src_label, record_type_label(record_type_name)}
+ ),
+ }
+ );
+ }
+ }
+
/**
* Cached extents (including placeholders)
*
efforts.num_ool_records += ool_stats.num_records;
efforts.ool_record_overhead_bytes += ool_stats.header_bytes;
+ auto& record_header_fullness = get_by_src(
+ stats.record_header_fullness_by_src, t.get_src());
+ record_header_fullness.ool_stats.filled_bytes += ool_stats.header_raw_bytes;
+ record_header_fullness.ool_stats.total_bytes += ool_stats.header_bytes;
+
if (t.get_src() == Transaction::src_t::CLEANER) {
// CLEANER transaction won't contain any onode tree operations
assert(t.onode_tree_stats.is_clear());
ceph_assert(ool_stats.extents.num == t.ool_block_list.size());
efforts.num_ool_records += ool_stats.num_records;
efforts.ool_record_overhead_bytes += ool_stats.header_bytes;
+
+ auto& record_header_fullness = get_by_src(
+ stats.record_header_fullness_by_src, t.get_src());
+ record_header_fullness.ool_stats.filled_bytes += ool_stats.header_raw_bytes;
+ record_header_fullness.ool_stats.total_bytes += ool_stats.header_bytes;
+
auto record_size = get_encoded_record_length(
record, segment_manager.get_block_size());
auto inline_overhead =
record_size.mdlength + record_size.dlength - record.get_raw_data_size();
efforts.inline_record_overhead_bytes += inline_overhead;
+ record_header_fullness.inline_stats.filled_bytes += record_size.raw_mdlength;
+ record_header_fullness.inline_stats.total_bytes += record_size.mdlength;
+
return record;
}
template <typename CounterT>
using counter_by_src_t = std::array<CounterT, Transaction::SRC_MAX>;
+ struct fill_stat_t {
+ uint64_t filled_bytes = 0;
+ uint64_t total_bytes = 0;
+ };
+
+ struct record_header_fullness_t {
+ fill_stat_t inline_stats;
+ fill_stat_t ool_stats;
+ };
+
struct {
counter_by_src_t<uint64_t> trans_created_by_src;
counter_by_src_t<commit_trans_efforts_t> committed_efforts_by_src;
counter_by_src_t<invalid_trans_efforts_t> invalidated_efforts_by_src;
counter_by_src_t<query_counters_t> cache_query_by_src;
+ counter_by_src_t<record_header_fullness_t> record_header_fullness_by_src;
success_read_trans_efforts_t success_read_efforts;
uint64_t dirty_bytes = 0;