Labeled by source.
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
namespace crimson::os::seastore {
Cache::Cache(SegmentManager &segment_manager) :
- segment_manager(segment_manager) {}
+ segment_manager(segment_manager)
+{
+ register_metrics();
+}
Cache::~Cache()
{
DEBUG("exit");
}
+void Cache::register_metrics()
+{
+ namespace sm = seastar::metrics;
+ using src_t = Transaction::src_t;
+
+ auto src_label = sm::label("src");
+ std::map<src_t, sm::label_instance> labels_by_src {
+ {src_t::MUTATE, src_label("MUTATE")},
+ {src_t::READ, src_label("READ")},
+ {src_t::INIT, src_label("INIT")},
+ {src_t::CLEANER, src_label("CLEANER")},
+ };
+
+ /*
+ * trans_created
+ */
+ stats.trans_created_by_src.fill(0);
+ auto register_trans_created = [this, &labels_by_src](src_t src) {
+ std::ostringstream oss_desc;
+ oss_desc << "total number of transaction created (src="
+ << src << ")";
+ metrics.add_group(
+ "cache",
+ {
+ sm::make_counter(
+ "trans_created",
+ get_counter(stats.trans_created_by_src, src),
+ sm::description(oss_desc.str()),
+ {labels_by_src.find(src)->second}
+ ),
+ }
+ );
+ };
+ for (auto& [src, label] : labels_by_src) {
+ register_trans_created(src);
+ }
+
+ metrics.add_group(
+ "cache",
+ {
+ sm::make_counter(
+ "trans_created",
+ [this] {
+ uint64_t total = 0;
+ for (auto& v : stats.trans_created_by_src) {
+ total += v;
+ }
+ return total;
+ },
+ sm::description("total number of transaction created"),
+ {src_label("ALL")}
+ ),
+ }
+ );
+}
+
void Cache::add_extent(CachedExtentRef ref)
{
LOG_PREFIX(Cache::add_extent);
#pragma once
#include <iostream>
+#include <unordered_map>
+#include <boost/functional/hash.hpp>
#include "seastar/core/shared_future.hh"
TransactionRef create_transaction(
Transaction::src_t src) {
LOG_PREFIX(Cache::create_transaction);
+
+ ++(get_counter(stats.trans_created_by_src, src));
+
auto ret = std::make_unique<Transaction>(
get_dummy_ordering_handle(),
false,
TransactionRef create_weak_transaction(
Transaction::src_t src) {
LOG_PREFIX(Cache::create_weak_transaction);
+
+ ++(get_counter(stats.trans_created_by_src, src));
+
auto ret = std::make_unique<Transaction>(
get_dummy_ordering_handle(),
true,
/// Resets transaction preserving
void reset_transaction_preserve_handle(Transaction &t) {
+ if (t.did_reset()) {
+ ++(get_counter(stats.trans_created_by_src, t.get_src()));
+ }
t.reset_preserve_handle(last_commit);
}
*/
CachedExtent::list dirty;
+ struct {
+ std::array<uint64_t, Transaction::SRC_MAX> trans_created_by_src;
+ } stats;
+ uint64_t& get_counter(
+ std::array<uint64_t, Transaction::SRC_MAX>& counters_by_src,
+ Transaction::src_t src) {
+ assert(static_cast<std::size_t>(src) < counters_by_src.size());
+ return counters_by_src[static_cast<std::size_t>(src)];
+ }
+
+ seastar::metrics::metric_group metrics;
+ void register_metrics();
+
/// alloc buffer for cached extent
bufferptr alloc_cache_buf(size_t size) {
// TODO: memory pooling etc
to_release = NULL_SEG_ID;
retired_gate_token.reset(initiated_after);
conflicted = false;
+ if (!has_reset) {
+ has_reset = true;
+ }
+ }
+
+ bool did_reset() const {
+ return has_reset;
}
private:
bool conflicted = false;
+ bool has_reset = false;
+
OrderingHandle handle;
const src_t src;
using with_trans_ertr = typename T::base_ertr::template extend<crimson::ct_error::eagain>;
}
+
+namespace std {
+
+template<>
+struct hash<::crimson::os::seastore::Transaction::src_t> {
+ std::size_t operator()(
+ const ::crimson::os::seastore::Transaction::src_t& src) const noexcept {
+ return std::hash<uint8_t>{}((uint8_t)src);
+ }
+};
+
+}