}
);
}
+
+ /**
+ * rewrite version
+ */
+ metrics.add_group(
+ "cache",
+ {
+ sm::make_counter(
+ "version_count_dirty",
+ stats.committed_dirty_version.num,
+ sm::description("total number of rewrite-dirty extents")
+ ),
+ sm::make_counter(
+ "version_sum_dirty",
+ stats.committed_dirty_version.version,
+ sm::description("sum of the version from rewrite-dirty extents")
+ ),
+ sm::make_counter(
+ "version_count_reclaim",
+ stats.committed_reclaim_version.num,
+ sm::description("total number of rewrite-reclaim extents")
+ ),
+ sm::make_counter(
+ "version_sum_reclaim",
+ stats.committed_reclaim_version.version,
+ sm::description("sum of the version from rewrite-reclaim extents")
+ ),
+ }
+ );
}
void Cache::add_extent(CachedExtentRef ref)
efforts.inline_record_metadata_bytes +=
(record.size.get_raw_mdlength() - record.get_delta_size());
+ auto &rewrite_version_stats = t.get_rewrite_version_stats();
+ if (trans_src == Transaction::src_t::CLEANER_TRIM) {
+ stats.committed_dirty_version.increment_stat(rewrite_version_stats);
+ } else if (trans_src == Transaction::src_t::CLEANER_RECLAIM) {
+ stats.committed_reclaim_version.increment_stat(rewrite_version_stats);
+ } else {
+ assert(rewrite_version_stats.is_clear());
+ }
+
return record;
}
std::array<uint64_t, NUM_SRC_COMB> trans_conflicts_by_srcs;
counter_by_src_t<uint64_t> trans_conflicts_by_unknown;
+
+ version_stat_t committed_dirty_version;
+ version_stat_t committed_reclaim_version;
} stats;
template <typename CounterT>
return out << stat.num << "(" << stat.bytes << "B)";
}
+struct version_stat_t {
+ uint64_t num = 0;
+ uint64_t version = 0;
+
+ bool is_clear() const {
+ return (num == 0 && version == 0);
+ }
+
+ void increment(extent_version_t v) {
+ ++num;
+ version += v;
+ }
+
+ void increment_stat(const version_stat_t& stat) {
+ num += stat.num;
+ version += stat.version;
+ }
+};
+
/**
* Transaction
*
lba_tree_stats = {};
backref_tree_stats = {};
ool_write_stats = {};
+ rewrite_version_stats = {};
to_release = NULL_SEG_ID;
conflicted = false;
if (!has_reset) {
ool_write_stats_t& get_ool_write_stats() {
return ool_write_stats;
}
+ version_stat_t& get_rewrite_version_stats() {
+ return rewrite_version_stats;
+ }
private:
friend class Cache;
tree_stats_t lba_tree_stats;
tree_stats_t backref_tree_stats;
ool_write_stats_t ool_write_stats;
+ version_stat_t rewrite_version_stats;
///< if != NULL_SEG_ID, release this segment after completion
segment_id_t to_release = NULL_SEG_ID;
LOG_PREFIX(TransactionManager::rewrite_extent);
if (is_backref_node(extent->get_type())) {
+ t.get_rewrite_version_stats().increment(extent->get_version());
return backref_manager->rewrite_extent(t, extent);
}
extent = updated;
}
+ t.get_rewrite_version_stats().increment(extent->get_version());
+
if (extent->get_type() == extent_types_t::ROOT) {
DEBUGT("marking root for rewrite -- {}", t, *extent);
cache->duplicate_for_write(t, extent);