device_stats_t
ExtentPlacementManager::get_device_stats(
const writer_stats_t &journal_stats,
- bool report_detail) const
+ bool report_detail,
+ double seconds) const
{
LOG_PREFIX(ExtentPlacementManager::get_device_stats);
cold_stats.add(cold_writer_stats.back());
}
- auto now = seastar::lowres_clock::now();
- if (last_tp == seastar::lowres_clock::time_point::min()) {
- last_tp = now;
- return {};
- }
- std::chrono::duration<double> duration_d = now - last_tp;
- double seconds = duration_d.count();
- last_tp = now;
-
- if (report_detail) {
+ if (report_detail && seconds != 0) {
std::ostringstream oss;
auto report_writer_stats = [seconds, &oss](
const char* name,
device_stats_t get_device_stats(
const writer_stats_t &journal_stats,
- bool report_detail) const;
+ bool report_detail,
+ double seconds) const;
using mount_ertr = crimson::errorator<
crimson::ct_error::input_output_error>;
SegmentSeqAllocatorRef ool_segment_seq_allocator;
extent_len_t max_data_allocation_size = 0;
- mutable seastar::lowres_clock::time_point last_tp =
- seastar::lowres_clock::time_point::min();
-
friend class ::transaction_manager_test_t;
};
shard_io_stats.resize(seastar::smp::count);
return shard_stores.invoke_on_all([this](const Shard &local_store) {
bool report_detail = false;
+ double seconds = 0;
if (seastar::this_shard_id() == 0) {
// avoid too verbose logs, only report detail in a particular shard
report_detail = true;
+ seconds = local_store.reset_report_interval();
}
shard_device_stats[seastar::this_shard_id()] =
- local_store.get_device_stats(report_detail);
+ local_store.get_device_stats(report_detail, seconds);
shard_io_stats[seastar::this_shard_id()] =
- local_store.get_io_stats(report_detail);
+ local_store.get_io_stats(report_detail, seconds);
}).then([this] {
LOG_PREFIX(SeaStore);
auto now = seastar::lowres_clock::now();
*transaction_manager);
}
-device_stats_t SeaStore::Shard::get_device_stats(bool report_detail) const
-{
- return transaction_manager->get_device_stats(report_detail);
-}
-
-shard_stats_t SeaStore::Shard::get_io_stats(bool report_detail) const
+double SeaStore::Shard::reset_report_interval() const
{
+ double seconds;
auto now = seastar::lowres_clock::now();
if (last_tp == seastar::lowres_clock::time_point::min()) {
- last_tp = now;
- last_shard_stats = shard_stats;
- return {};
+ seconds = 0;
+ } else {
+ std::chrono::duration<double> duration_d = now - last_tp;
+ seconds = duration_d.count();
}
- std::chrono::duration<double> duration_d = now - last_tp;
- double seconds = duration_d.count();
last_tp = now;
+ return seconds;
+}
+device_stats_t SeaStore::Shard::get_device_stats(
+ bool report_detail, double seconds) const
+{
+ return transaction_manager->get_device_stats(report_detail, seconds);
+}
+
+shard_stats_t SeaStore::Shard::get_io_stats(
+ bool report_detail, double seconds) const
+{
shard_stats_t ret = shard_stats;
ret.minus(last_shard_stats);
- last_shard_stats = shard_stats;
- if (report_detail) {
+
+ if (report_detail && seconds != 0) {
LOG_PREFIX(SeaStore::get_io_stats);
auto calc_conflicts = [](uint64_t ios, uint64_t repeats) {
return (double)(repeats-ios)/ios;
ret.pending_bg_num,
ret.pending_flush_num);
}
+
+ last_shard_stats = shard_stats;
return ret;
}
using close_ertr = base_ertr;
close_ertr::future<> close();
- device_stats_t get_device_stats(bool report_detail) const {
+ device_stats_t get_device_stats(
+ bool report_detail, double seconds) const {
writer_stats_t journal_stats = journal->get_writer_stats();
- return epm->get_device_stats(journal_stats, report_detail);
+ return epm->get_device_stats(journal_stats, report_detail, seconds);
}
/// Resets transaction