From 9b26de3f3653d38dcdfc5b97874089f19d2a59d7 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 20 Nov 2014 14:27:39 -0800 Subject: [PATCH] ReplicatedPG: fail a non-blocking flush if the object is being scrubbed Fixes: #8011 Backport: firefly, giant Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index bfceffa50f2..b559770db0c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -6614,6 +6614,19 @@ int ReplicatedPG::try_flush_mark_clean(FlushOpRef fop) return -EBUSY; } + if (!fop->blocking && scrubber.write_blocked_by_scrub(oid)) { + if (fop->op) { + dout(10) << __func__ << " blocked by scrub" << dendl; + requeue_op(fop->op); + requeue_ops(fop->dup_ops); + return -EAGAIN; // will retry + } else { + osd->logger->inc(l_osd_tier_try_flush_fail); + cancel_flush(fop, false); + return -ECANCELED; + } + } + // successfully flushed; can we clear the dirty bit? // try to take the lock manually, since we don't // have a ctx yet.