]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG::promote_object: check scrubber and block if necessary 4162/head
authorSamuel Just <sjust@redhat.com>
Fri, 20 Mar 2015 22:28:15 +0000 (15:28 -0700)
committerSamuel Just <sjust@redhat.com>
Mon, 23 Mar 2015 21:40:59 +0000 (14:40 -0700)
Otherwise, we might attempt to promote into an in-progress scrub
interval causing 11156.  I would have added a return value to
promote_object(), but could not find an existing user which
cared to distinguish the cases, even with a null op passed.
All existing users are in maybe_handle_cache.  The ones which
pass a null op are for promoting the object in parallel
with a proxy -- a case where not actually performing the promote
does not really matter.

Fixes: #11156
Signed-off-by: Samuel Just <sjust@redhat.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 15e1a856e2452766abb837445399d8861fd12316..0f0e95a5c81e542af45db73a984e9cb48f7d1aaf 100644 (file)
@@ -2228,6 +2228,19 @@ void ReplicatedPG::promote_object(ObjectContextRef obc,
     obc = get_object_context(missing_oid, true);
   }
   dout(10) << __func__ << " " << obc->obs.oi.soid << dendl;
+  if (scrubber.write_blocked_by_scrub(obc->obs.oi.soid)) {
+    dout(10) << __func__ << " " << obc->obs.oi.soid
+            << " blocked by scrub" << dendl;
+    if (op) {
+      waiting_for_active.push_back(op);
+      dout(10) << __func__ << " " << obc->obs.oi.soid
+              << " placing op in waiting_for_active" << dendl;
+    } else {
+      dout(10) << __func__ << " " << obc->obs.oi.soid
+              << " no op, dropping on the floor" << dendl;
+    }
+    return;
+  }
 
   PromoteCallback *cb = new PromoteCallback(obc, this);
   object_locator_t my_oloc = oloc;
index 61477b5acbdd4699f9efa03ade1b2b6aaeb73413..0af3cf0d70e9455ff8622f8ae75298682caff330 100644 (file)
@@ -1169,7 +1169,10 @@ protected:
    */
   void do_cache_redirect(OpRequestRef op);
   /**
-   * This function starts up a copy from
+   * This function attempts to start a promote.  Either it succeeds,
+   * or places op on a wait list.  If op is null, failure means that
+   * this is a noop.  If a future user wants to be able to distinguish
+   * these cases, a return value should be added.
    */
   void promote_object(ObjectContextRef obc,            ///< [optional] obc
                      const hobject_t& missing_object, ///< oid (if !obc)