]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: factor clone check out of evict op code
authorSage Weil <sage@inktank.com>
Mon, 20 Jan 2014 22:30:48 +0000 (14:30 -0800)
committerSage Weil <sage@inktank.com>
Sun, 16 Feb 2014 06:09:38 +0000 (22:09 -0800)
Move the check for clones into a helper so that we will be able to use in
other places where we need to evict.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 895816cc17678f2e7ab3f5ffcce54bc0e8949a1c..c40ea9a57eb26a8323860dda77c7a671c1907a80 100644 (file)
@@ -3139,23 +3139,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          break;
        }
        if (soid.snap == CEPH_NOSNAP) {
-         // verify that all clones have been evicted
-         dout(20) << __func__ << " verifying clones are absent "
-                  << ctx->new_snapset << dendl;
-         result = 0;
-         for (vector<snapid_t>::iterator p = ctx->new_snapset.clones.begin();
-              p != ctx->new_snapset.clones.end();
-              ++p) {
-           hobject_t clone_oid = soid;
-           clone_oid.snap = *p;
-           ObjectContextRef clone_obc = get_object_context(clone_oid, false);
-           if (clone_obc && clone_obc->obs.exists) {
-             dout(10) << __func__ << " cannot evict head before clone "
-                      << clone_oid << dendl;
-             result = -EBUSY;
-             break;
-           }
-         }
+         result = _verify_no_head_clones(soid, ssc->snapset);
          if (result < 0)
            break;
        }
@@ -4340,6 +4324,27 @@ int ReplicatedPG::_get_tmap(OpContext *ctx, bufferlist *header, bufferlist *vals
   return 0;
 }
 
+int ReplicatedPG::_verify_no_head_clones(const hobject_t& soid,
+                                       const SnapSet& ss)
+{
+  // verify that all clones have been evicted
+  dout(20) << __func__ << " verifying clones are absent "
+          << ss << dendl;
+  for (vector<snapid_t>::const_iterator p = ss.clones.begin();
+       p != ss.clones.end();
+       ++p) {
+    hobject_t clone_oid = soid;
+    clone_oid.snap = *p;
+    ObjectContextRef clone_obc = get_object_context(clone_oid, false);
+    if (clone_obc && clone_obc->obs.exists) {
+      dout(10) << __func__ << " cannot evict head before clone "
+              << clone_oid << dendl;
+      return -EBUSY;
+    }
+  }
+  return 0;
+}
+
 inline int ReplicatedPG::_delete_head(OpContext *ctx, bool no_whiteout)
 {
   SnapSet& snapset = ctx->new_snapset;
index fe4a3bebeab8d9288982601fd474d80994c76f39..f29362299422be238303bdbf2491b587c420fc4c 100644 (file)
@@ -1183,6 +1183,8 @@ private:
     boost::statechart::result react(const SnapTrim&);
   };
 
+  int _verify_no_head_clones(const hobject_t& soid,
+                            const SnapSet& ss);
   int _delete_head(OpContext *ctx, bool no_whiteout);
   int _rollback_to(OpContext *ctx, ceph_osd_op& op);
 public: