From dcce611de30ba979260d1973ec35f848f53f928b Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Thu, 5 May 2022 10:36:36 +0800 Subject: [PATCH] crimson/os/seastore/segment_cleaner: cleanup, track available space in open segments Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/segment_cleaner.cc | 16 +++++++--------- src/crimson/os/seastore/segment_cleaner.h | 8 ++++++-- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/crimson/os/seastore/segment_cleaner.cc b/src/crimson/os/seastore/segment_cleaner.cc index 9d8b2b54957ae..edd21b1f5b977 100644 --- a/src/crimson/os/seastore/segment_cleaner.cc +++ b/src/crimson/os/seastore/segment_cleaner.cc @@ -91,7 +91,7 @@ void segments_info_t::reset() count_close = 0; total_bytes = 0; - avail_bytes = 0; + avail_bytes_in_open = 0; } void segments_info_t::add_segment_manager( @@ -123,7 +123,6 @@ void segments_info_t::add_segment_manager( num_empty += nsegments; total_bytes += sm_size; - avail_bytes += sm_size; } void segments_info_t::init_closed( @@ -144,8 +143,6 @@ void segments_info_t::init_closed( ceph_assert(get_journal_head() == JOURNAL_SEQ_NULL); ++num_in_journal; } - ceph_assert(avail_bytes >= get_segment_size()); - avail_bytes -= get_segment_size(); // do not increment count_close; } @@ -172,6 +169,8 @@ void segments_info_t::mark_open( journal_segment_id = segment; ++num_in_journal; } + ceph_assert(segment_info.written_to == 0); + avail_bytes_in_open += get_segment_size(); ++count_open; } @@ -194,7 +193,6 @@ void segments_info_t::mark_empty( ceph_assert(num_in_journal > 0); --num_in_journal; } - avail_bytes += get_segment_size(); ++count_release; } @@ -213,8 +211,8 @@ void segments_info_t::mark_closed( ++num_closed; ceph_assert(get_segment_size() >= segment_info.written_to); auto seg_avail_bytes = get_segment_size() - segment_info.written_to; - ceph_assert(avail_bytes >= seg_avail_bytes); - avail_bytes -= seg_avail_bytes; + ceph_assert(avail_bytes_in_open >= seg_avail_bytes); + avail_bytes_in_open -= seg_avail_bytes; ++count_close; } @@ -242,8 +240,8 @@ void segments_info_t::update_written_to( DEBUG("type={}, offset={}, {}", type, offset, segment_info); ceph_assert(type == segment_info.type); auto avail_deduction = new_written_to - segment_info.written_to; - ceph_assert(avail_bytes >= avail_deduction); - avail_bytes -= avail_deduction; + ceph_assert(avail_bytes_in_open >= avail_deduction); + avail_bytes_in_open -= avail_deduction; segment_info.written_to = new_written_to; } diff --git a/src/crimson/os/seastore/segment_cleaner.h b/src/crimson/os/seastore/segment_cleaner.h index 5b3f617fd6725..edf64097d6290 100644 --- a/src/crimson/os/seastore/segment_cleaner.h +++ b/src/crimson/os/seastore/segment_cleaner.h @@ -139,7 +139,11 @@ public: return total_bytes; } std::size_t get_available_bytes() const { - return avail_bytes; + return num_empty * get_segment_size() + avail_bytes_in_open; + } + std::size_t get_unavailable_bytes() const { + assert(total_bytes >= get_available_bytes()); + return total_bytes - get_available_bytes(); } journal_seq_t get_journal_head() const { if (unlikely(journal_segment_id == NULL_SEG_ID)) { @@ -195,7 +199,7 @@ private: std::size_t count_close; std::size_t total_bytes; - std::size_t avail_bytes; + std::size_t avail_bytes_in_open; }; /** -- 2.39.5