From 60acfdd102f0abb33874d24fd51119fcb53c8762 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 22 May 2026 19:01:17 +0800 Subject: [PATCH] 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 --- src/crimson/osd/scrub/pg_scrubber.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/crimson/osd/scrub/pg_scrubber.cc b/src/crimson/osd/scrub/pg_scrubber.cc index 4945918240a7..128e28671c92 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(); -- 2.47.3