From 7a3227e946332c0bdc983201fe4a4e83cfe6fda6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 19 Jun 2019 14:20:32 -0500 Subject: [PATCH] osd/PG: do not queue scrub if PG is not active when unblock - we are scrubbing - we block scrub on an object - we have an interval reset on epoch X - we unblock and queue scrub in epoch X - we finish the reset (we are no longer scrubbing) - we process the PGScrub on epoch X, it is still epoch X, and we are not scrubbing -> assert Fix by not queueing scrub if we are unblocking and the PG is no longer active (because we are mid-way through the peering reset). Fixes: http://tracker.ceph.com/issues/40451 Signed-off-by: Sage Weil --- src/osd/PrimaryLogPG.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index bc104a64c897..2f9e5d498a7f 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -11185,7 +11185,11 @@ void PrimaryLogPG::kick_object_context_blocked(ObjectContextRef obc) if (obc->requeue_scrub_on_unblock) { obc->requeue_scrub_on_unblock = false; - requeue_scrub(); + // only requeue if we are still active: we may be unblocking + // because we are resetting for a new peering interval + if (is_active()) { + requeue_scrub(); + } } } -- 2.47.3