From: myoungwon oh Date: Thu, 21 Aug 2025 06:03:07 +0000 (+0000) Subject: crimson/os/seastore: correct possible mergeable size for ool extents X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=552499f86b6bf7cdf7f42ecf8e960edf85f56380;p=ceph.git crimson/os/seastore: correct possible mergeable size for ool extents Current implementation only checks a previous ool extent before writing a ool extent. This can miss merge opportunities for extents that are sequential but precede the last OOL extent. This commit fixes this by reporting a correct mergeable size. Signed-off-by: Myoungwon Oh --- diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index be53c9c292c1..b7572a366f97 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -1068,7 +1068,7 @@ RandomBlockOolWriter::do_write( // TODO : allocate a consecutive address based on a transaction if (writes.size() != 0 && - writes.back().offset + writes.back().bp.length() == paddr) { + writes.back().offset + writes.back().get_mergeable_length() == paddr) { // We can write both the currrent extent and the previous one at once // if the extents are located in a row if (writes.back().mergeable_bps.size() == 0) { diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 95378d558e62..d5361359a56a 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -195,6 +195,17 @@ private: ceph::bufferptr bp; RandomBlockManager* rbm; std::list mergeable_bps; + + extent_len_t get_mergeable_length() const { + if (mergeable_bps.size() == 0) { + return bp.length(); + } + extent_len_t len = 0; + for (auto &p : mergeable_bps) { + len += p.length(); + } + return len; + } }; alloc_write_iertr::future<> do_write( Transaction& t,