From 281504340958f9cdc5ea6737739379726c77a44c Mon Sep 17 00:00:00 2001 From: Adam Kupczyk Date: Thu, 23 Dec 2021 13:26:17 +0100 Subject: [PATCH] os/bluestore/bluefs: Modify _update_logger_stats Extract updating of num files and log size from _update_logger_stats and put it exactly where modification happens. It allows to escape problem of taking nodes.lock and log.lock. Signed-off-by: Adam Kupczyk --- src/os/bluestore/BlueFS.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/os/bluestore/BlueFS.cc b/src/os/bluestore/BlueFS.cc index 8fcac1a24fd0c..d6d0f5f71b251 100644 --- a/src/os/bluestore/BlueFS.cc +++ b/src/os/bluestore/BlueFS.cc @@ -384,13 +384,8 @@ void BlueFS::_shutdown_logger() delete logger; } -//AK - TODO - locking needed but not certain void BlueFS::_update_logger_stats() { - // we must be holding the lock - logger->set(l_bluefs_num_files, nodes.file_map.size()); - logger->set(l_bluefs_log_bytes, log.writer->file->fnode.size); - if (alloc[BDEV_WAL]) { logger->set(l_bluefs_wal_total_bytes, _get_total(BDEV_WAL)); logger->set(l_bluefs_wal_used_bytes, _get_used(BDEV_WAL)); @@ -929,7 +924,8 @@ int BlueFS::mount() dout(10) << __func__ << " log write pos set to 0x" << std::hex << log.writer->pos << std::dec << dendl; - + // update log size + logger->set(l_bluefs_log_bytes, log.writer->file->fnode.size); return 0; out: @@ -1672,6 +1668,8 @@ int BlueFS::_replay(bool noop, bool to_stdout) } } } + // reflect file count in logger + logger->set(l_bluefs_num_files, nodes.file_map.size()); dout(10) << __func__ << " done" << dendl; return 0; @@ -1980,6 +1978,8 @@ BlueFS::FileRef BlueFS::_get_file(uint64_t ino) if (p == nodes.file_map.end()) { FileRef f = ceph::make_ref(); nodes.file_map[ino] = f; + // track files count in logger + logger->set(l_bluefs_num_files, nodes.file_map.size()); dout(30) << __func__ << " ino " << ino << " = " << f << " (new)" << dendl; return f; @@ -2013,6 +2013,7 @@ void BlueFS::_drop_link_D(FileRef file) vselector->sub_usage(file->vselector_hint, file->fnode); log.t.op_file_remove(file->fnode.ino); nodes.file_map.erase(file->fnode.ino); + logger->set(l_bluefs_num_files, nodes.file_map.size()); file->deleted = true; std::lock_guard dl(dirty.lock); @@ -2965,6 +2966,7 @@ int BlueFS::_flush_and_sync_log_LD(uint64_t want_seq) _flush_and_sync_log_core(available_runway); _flush_bdev(log.writer); + logger->set(l_bluefs_log_bytes, log.writer->file->fnode.size); //now log.lock is no longer needed log.lock.unlock(); @@ -3004,6 +3006,7 @@ int BlueFS::_flush_and_sync_log_jump_D(uint64_t jump_to, _clear_dirty_set_stable_D(seq); _release_pending_allocations(to_release); + logger->set(l_bluefs_log_bytes, log.writer->file->fnode.size); _update_logger_stats(); return 0; } @@ -3677,6 +3680,7 @@ int BlueFS::open_for_write( dir->file_map[string{filename}] = file; ++file->refs; create = true; + logger->set(l_bluefs_num_files, nodes.file_map.size()); } else { // overwrite existing file? file = q->second; @@ -3965,6 +3969,7 @@ int BlueFS::lock_file(std::string_view dirname, std::string_view filename, file->fnode.mtime = ceph_clock_now(); nodes.file_map[ino_last] = file; dir->file_map[string{filename}] = file; + logger->set(l_bluefs_num_files, nodes.file_map.size()); ++file->refs; log.t.op_file_update(file->fnode); log.t.op_dir_link(dirname, filename, file->fnode.ino); -- 2.39.5