From: Kefu Chai Date: Fri, 22 May 2026 11:01:17 +0000 (+0800) Subject: crimson/scrub: fix assert in PGScrubber::release_range() on interval change X-Git-Tag: v21.0.1~149^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=60acfdd102f0abb33874d24fd51119fcb53c8762;p=ceph.git crimson/scrub: fix assert in PGScrubber::release_range() on interval change when an interval change occurs while ScrubReserveRange is still waiting to acquire background_process_lock, ChunkState::exit() calls release_range() but blocked is not yet set. this triggers ceph_assert(blocked) in release_range(). fix by checking if blocked is set before asserting. if blocked is not set, the range was never reserved, so release_range() is a no-op. ScrubReserveRange's finally block handles lock cleanup in this case. Fixes: https://tracker.ceph.com/issues/76752 Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/scrub/pg_scrubber.cc b/src/crimson/osd/scrub/pg_scrubber.cc index 4945918240a..128e28671c9 100644 --- a/src/crimson/osd/scrub/pg_scrubber.cc +++ b/src/crimson/osd/scrub/pg_scrubber.cc @@ -184,7 +184,10 @@ void PGScrubber::reserve_range(const hobject_t &start, const hobject_t &end) void PGScrubber::release_range() { LOG_PREFIX(PGScrubber::release_range); - ceph_assert(blocked); + if (!blocked) { + DEBUGDPP("range not reserved, skipping", pg); + return; + } DEBUGDPP("blocked: {}", pg, *blocked); pg.background_process_lock.unlock(); blocked->p.set_value();