diff --git a/docs/config/osd.en.md b/docs/config/osd.en.md index fc9f0d06..c436e233 100644 --- a/docs/config/osd.en.md +++ b/docs/config/osd.en.md @@ -23,6 +23,7 @@ initialization and can be changed with an OSD restart. - [no_rebalance](#no_rebalance) - [print_stats_interval](#print_stats_interval) - [slow_log_interval](#slow_log_interval) +- [inode_vanish_time](#inode_vanish_time) - [max_write_iodepth](#max_write_iodepth) - [min_flusher_count](#min_flusher_count) - [max_flusher_count](#max_flusher_count) @@ -163,6 +164,13 @@ Time interval at which OSDs dump slow or stuck operations on stdout, if they're any. Also it's the time after which an operation is considered "slow". +## inode_vanish_time + +- Type: seconds +- Default: 60 + +Number of seconds after which a deleted inode is removed from OSD statistics. + ## max_write_iodepth - Type: integer diff --git a/docs/config/osd.ru.md b/docs/config/osd.ru.md index 86b2d79f..0faea608 100644 --- a/docs/config/osd.ru.md +++ b/docs/config/osd.ru.md @@ -24,6 +24,7 @@ - [no_rebalance](#no_rebalance) - [print_stats_interval](#print_stats_interval) - [slow_log_interval](#slow_log_interval) +- [inode_vanish_time](#inode_vanish_time) - [max_write_iodepth](#max_write_iodepth) - [min_flusher_count](#min_flusher_count) - [max_flusher_count](#max_flusher_count) @@ -169,6 +170,13 @@ OSD. медленных или зависших операций, если таковые имеются. Также время, при превышении которого операция считается "медленной". +## inode_vanish_time + +- Тип: секунды +- Значение по умолчанию: 60 + +Число секунд, через которое удалённые инод удаляется и из статистики OSD. + ## max_write_iodepth - Тип: целое число diff --git a/docs/config/src/osd.yml b/docs/config/src/osd.yml index bfa656b8..e2144a1b 100644 --- a/docs/config/src/osd.yml +++ b/docs/config/src/osd.yml @@ -158,6 +158,13 @@ Временной интервал, с которым OSD выводят в стандартный вывод список медленных или зависших операций, если таковые имеются. Также время, при превышении которого операция считается "медленной". +- name: inode_vanish_time + type: sec + default: 60 + info: | + Number of seconds after which a deleted inode is removed from OSD statistics. + info_ru: | + Число секунд, через которое удалённые инод удаляется и из статистики OSD. - name: max_write_iodepth type: int default: 128 diff --git a/mon/mon.js b/mon/mon.js index 41b79984..d5f1a618 100644 --- a/mon/mon.js +++ b/mon/mon.js @@ -105,6 +105,7 @@ const etcd_tree = { no_rebalance: false, print_stats_interval: 3, slow_log_interval: 10, + inode_vanish_time: 60, osd_memlock: false, // blockstore - fixed in superblock block_size, diff --git a/src/osd.cpp b/src/osd.cpp index 67a4c5a3..a615040b 100644 --- a/src/osd.cpp +++ b/src/osd.cpp @@ -168,6 +168,9 @@ void osd_t::parse_config(const json11::Json & config) slow_log_interval = config["slow_log_interval"].uint64_value(); if (!slow_log_interval) slow_log_interval = 10; + inode_vanish_time = config["inode_vanish_time"].uint64_value(); + if (!inode_vanish_time) + inode_vanish_time = 60; } void osd_t::bind_socket() diff --git a/src/osd.h b/src/osd.h index 6770ec3a..9cfc1855 100644 --- a/src/osd.h +++ b/src/osd.h @@ -113,6 +113,7 @@ class osd_t int autosync_writes = DEFAULT_AUTOSYNC_WRITES; int recovery_queue_depth = DEFAULT_RECOVERY_QUEUE; int recovery_sync_batch = DEFAULT_RECOVERY_BATCH; + int inode_vanish_time = 60; int log_level = 0; // cluster state @@ -165,6 +166,7 @@ class osd_t // op statistics osd_op_stats_t prev_stats; std::map inode_stats; + std::map vanishing_inodes; const char* recovery_stat_names[2] = { "degraded", "misplaced" }; uint64_t recovery_stat_count[2][2] = {}; uint64_t recovery_stat_bytes[2][2] = {}; diff --git a/src/osd_cluster.cpp b/src/osd_cluster.cpp index eb3294b9..ce1e59ca 100644 --- a/src/osd_cluster.cpp +++ b/src/osd_cluster.cpp @@ -186,7 +186,8 @@ void osd_t::report_statistics() json11::Json::object inode_space; json11::Json::object last_stat; pool_id_t last_pool = 0; - for (auto kv: bs->get_inode_space_stats()) + auto & bs_inode_space = bs->get_inode_space_stats(); + for (auto kv: bs_inode_space) { pool_id_t pool_id = INODE_POOL(kv.first); uint64_t only_inode_num = INODE_NO_POOL(kv.first); @@ -204,8 +205,26 @@ void osd_t::report_statistics() last_stat = json11::Json::object(); last_pool = 0; json11::Json::object inode_ops; - for (auto kv: inode_stats) + timespec tv_now; + for (auto st_it = inode_stats.begin(); st_it != inode_stats.end(); ) { + auto & kv = *st_it; + if (!bs_inode_space[kv.first]) + { + // Is it an empty inode? + if (!tv_now.tv_sec) + clock_gettime(CLOCK_REALTIME, &tv_now); + auto & tv_van = vanishing_inodes[kv.first]; + if (!tv_van.tv_sec) + tv_van = tv_now; + else if (tv_van.tv_sec < tv_now.tv_sec-inode_vanish_time) + { + // Inode vanished seconds ago, remove it from stats + vanishing_inodes.erase(kv.first); + inode_stats.erase(st_it++); + continue; + } + } pool_id_t pool_id = INODE_POOL(kv.first); uint64_t only_inode_num = (kv.first & (((uint64_t)1 << (64-POOL_ID_BITS)) - 1)); if (!last_pool || pool_id != last_pool) @@ -232,6 +251,7 @@ void osd_t::report_statistics() { "bytes", kv.second.op_bytes[INODE_STATS_DELETE] }, } }, }; + st_it++; } if (last_pool) inode_ops[std::to_string(last_pool)] = last_stat;