OPTION(bluestore_warn_on_legacy_statfs, OPT_BOOL)
OPTION(bluestore_log_op_age, OPT_DOUBLE)
OPTION(bluestore_log_omap_iterator_age, OPT_DOUBLE)
+OPTION(bluestore_log_collection_list_age, OPT_DOUBLE)
OPTION(kstore_max_ops, OPT_U64)
OPTION(kstore_max_bytes, OPT_U64)
.set_default(5)
.set_description("log omap iteration operation if it's slower than this age (seconds)"),
+ Option("bluestore_log_collection_list_age", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ .set_default(60)
+ .set_description("log collection list operation if it's slower than this age (seconds)"),
+
// -----------------------------------------
// kstore
"Average omap iterator lower_bound call latency");
b.add_time_avg(l_bluestore_omap_next_lat, "omap_next_lat",
"Average omap iterator next call latency");
+ b.add_time_avg(l_bluestore_clist_lat, "clist_lat",
+ "Average collection listing latency");
logger = b.create_perf_counters();
cct->get_perfcounters_collection()->add(logger);
}
if (!c->exists)
return -ENOENT;
+ auto start_time = mono_clock::now();
int r = 0;
ghobject_t static_next;
KeyValueDB::Iterator it;
if (!set_next) {
*pnext = ghobject_t::get_max();
}
-
+ log_latency_fn(
+ __func__,
+ l_bluestore_clist_lat,
+ mono_clock::now() - start_time,
+ cct->_conf->bluestore_log_collection_list_age,
+ [&] (const ceph::timespan& lat) {
+ ostringstream ostr;
+ ostr << ", lat = " << timespan_str(lat)
+ << " cid =" << c->cid
+ << " start " << start << " end " << end
+ << " max " << max;
+ return ostr.str();
+ }
+ );
return r;
}
l_bluestore_omap_upper_bound_lat,
l_bluestore_omap_lower_bound_lat,
l_bluestore_omap_next_lat,
+ l_bluestore_clist_lat,
l_bluestore_last
};