]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/scrub: fix assert in PGScrubber::release_range() on interval change 69064/head
authorKefu Chai <k.chai@proxmox.com>
Fri, 22 May 2026 11:01:17 +0000 (19:01 +0800)
committerKefu Chai <k.chai@proxmox.com>
Sat, 23 May 2026 13:06:51 +0000 (21:06 +0800)
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>
src/crimson/osd/scrub/pg_scrubber.cc

index 4945918240a716492f80d7c34bb9824e2eede0ad..128e28671c922853e51061ff687958cde28921f9 100644 (file)
@@ -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();