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 <k.chai@proxmox.com>
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();