]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librados, osd: add flags to COPY_FROM
authorSage Weil <sage@inktank.com>
Fri, 13 Dec 2013 21:35:25 +0000 (13:35 -0800)
committerSage Weil <sage@inktank.com>
Wed, 18 Dec 2013 19:26:51 +0000 (11:26 -0800)
If we initiate a COPY_FROM as part of a FLUSH operation, we will need to
set a flag so that the read-side of the copy and join the existing
in-progress operation without taknig additional locks.

Similarly, we need to pass flags from the client indicating whether we
should ignore overlay or cache logic while performing the copy.  These are
used by the promote and flush logic.

Note that none of these flags are exposed through librados (at least not
at this time).

Signed-off-by: Sage Weil <sage@inktank.com>
src/include/rados.h
src/include/rados/librados.hpp
src/librados/librados.cc
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h
src/osd/osd_types.cc
src/osdc/Objecter.h

index 082118ca9e5cd931b6b536014b2346b58c2246ab..2b1a8d3002713ee3214b03d4ac0b394612c8f5c8 100644 (file)
@@ -349,6 +349,7 @@ enum {
        CEPH_OSD_FLAG_IGNORE_CACHE =   0x8000,  /* ignore cache logic */
        CEPH_OSD_FLAG_SKIPRWLOCKS =   0x10000,  /* skip rw locks */
        CEPH_OSD_FLAG_IGNORE_OVERLAY =0x20000,  /* ignore pool overlay */
+       CEPH_OSD_FLAG_FLUSH =         0x40000,  /* this is part of flush */
 };
 
 enum {
@@ -375,6 +376,12 @@ enum {
        CEPH_OSD_CMPXATTR_MODE_U64    = 2
 };
 
+enum {
+       CEPH_OSD_COPY_FROM_FLAG_FLUSH = 1,     /* part of a flush operation */
+       CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY = 2,  /* ignore pool overlay */
+       CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE = 4, /* ignore osd cache logic */
+};
+
 /*
  * an individual object operation.  each may be accompanied by some data
  * payload
@@ -426,6 +433,7 @@ struct ceph_osd_op {
                struct {
                        __le64 snapid;
                        __le64 src_version;
+                       __u8 flags;
                } __attribute__ ((packed)) copy_from;
                struct {
                        struct ceph_timespec stamp;
index 388af64976249d1252551000e0993abcbdcd4756..2ce85310a0254c9e2fd6d5203b064d1819585435 100644 (file)
@@ -300,7 +300,8 @@ namespace librados
      * @param src_ioctx ioctx for the source object
      * @param version current version of the source object
      */
-    void copy_from(const std::string& src, const IoCtx& src_ioctx, uint64_t src_version);
+    void copy_from(const std::string& src, const IoCtx& src_ioctx,
+                  uint64_t src_version);
 
     /**
      * undirty an object
index c0bdebf8527ec794564ea7da2d498b9943fe13e1..dd199abd0ec8e0b1d56369e46a8440b05d64b36d 100644 (file)
@@ -393,7 +393,8 @@ void librados::ObjectWriteOperation::copy_from(const std::string& src,
                                               uint64_t src_version)
 {
   ::ObjectOperation *o = (::ObjectOperation *)impl;
-  o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq, src_ioctx.io_ctx_impl->oloc, src_version);
+  o->copy_from(object_t(src), src_ioctx.io_ctx_impl->snap_seq,
+              src_ioctx.io_ctx_impl->oloc, src_version, 0);
 }
 
 void librados::ObjectWriteOperation::undirty()
index 39046d082861ec2e13c5ab2d7fb62d0d4a34b1b5..d79aaf5e6674dd2d2077baf9fbe819532b84c15d 100644 (file)
@@ -1325,7 +1325,10 @@ dout(10) << __func__ << " " << obc->obs.oi.soid << dendl;
   PromoteCallback *cb = new PromoteCallback(op, obc, temp_target, this);
   object_locator_t oloc(m->get_object_locator());
   oloc.pool = pool.info.tier_of;
-  start_copy(cb, obc, obc->obs.oi.soid, oloc, 0, temp_target);
+  start_copy(cb, obc, obc->obs.oi.soid, oloc, 0,
+            CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY |
+            CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE,
+            temp_target);
 
   assert(obc->is_blocked());
   wait_for_blocked_object(obc->obs.oi.soid, op);
@@ -3791,7 +3794,8 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
          CopyFromCallback *cb = new CopyFromCallback(ctx, temp_target);
          ctx->copy_cb = cb;
          start_copy(cb, ctx->obc, src, src_oloc, src_version,
-                             temp_target);
+                    op.copy_from.flags,
+                    temp_target);
          result = -EINPROGRESS;
        } else {
          // finish
@@ -4507,12 +4511,14 @@ int ReplicatedPG::fill_in_copy_get(bufferlist::iterator& bp, OSDOp& osd_op,
 }
 
 void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc,
-                            hobject_t src, object_locator_t oloc, version_t version,
-                            const hobject_t& temp_dest_oid)
+                             hobject_t src, object_locator_t oloc,
+                             version_t version, unsigned flags,
+                             const hobject_t& temp_dest_oid)
 {
   const hobject_t& dest = obc->obs.oi.soid;
   dout(10) << __func__ << " " << dest
           << " from " << src << " " << oloc << " v" << version
+          << " flags " << flags
           << dendl;
 
   // cancel a previous in-progress copy?
@@ -4523,7 +4529,7 @@ void ReplicatedPG::start_copy(CopyCallback *cb, ObjectContextRef obc,
     cancel_copy(cop, false);
   }
 
-  CopyOpRef cop(new CopyOp(cb, obc, src, oloc, version, temp_dest_oid));
+  CopyOpRef cop(new CopyOp(cb, obc, src, oloc, version, flags, temp_dest_oid));
   copy_ops[dest] = cop;
   ++obc->copyfrom_readside;
 
@@ -4549,10 +4555,19 @@ void ReplicatedPG::_copy_some(ObjectContextRef obc, CopyOpRef cop)
 
   C_Copyfrom *fin = new C_Copyfrom(this, obc->obs.oi.soid,
                                   get_last_peering_reset());
+
+  unsigned flags = 0;
+  if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_FLUSH)
+    flags |= CEPH_OSD_FLAG_FLUSH;
+  if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE)
+    flags |= CEPH_OSD_FLAG_IGNORE_CACHE;
+  if (cop->flags & CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY)
+    flags |= CEPH_OSD_FLAG_IGNORE_OVERLAY;
+
   osd->objecter_lock.Lock();
   tid_t tid = osd->objecter->read(cop->src.oid, cop->oloc, op,
                                  cop->src.snap, NULL,
-                                 CEPH_OSD_FLAG_IGNORE_OVERLAY,
+                                 flags,
                                  new C_OnFinisher(fin,
                                                   &osd->objecter_finisher),
                                  // discover the object version if we don't know it yet
index dff369edf8ddbb265f28932c2f115e63ae772a66..f751e05b3f3e4e83eaa420ebc43ce9c194d4ab3c 100644 (file)
@@ -121,6 +121,7 @@ public:
     ObjectContextRef obc;
     hobject_t src;
     object_locator_t oloc;
+    unsigned flags;
 
     CopyResults *results;
 
@@ -136,9 +137,12 @@ public:
     hobject_t temp_oid;
     object_copy_cursor_t temp_cursor;
 
-    CopyOp(CopyCallback *cb_, ObjectContextRef _obc, hobject_t s, object_locator_t l,
-           version_t v, const hobject_t& dest)
-      : cb(cb_), obc(_obc), src(s), oloc(l),
+    CopyOp(CopyCallback *cb_, ObjectContextRef _obc, hobject_t s,
+          object_locator_t l,
+           version_t v,
+          unsigned f,
+          const hobject_t& dest)
+      : cb(cb_), obc(_obc), src(s), oloc(l), flags(f),
         results(NULL),
        objecter_tid(0),
        rval(-1),
@@ -983,8 +987,8 @@ protected:
    * @param temp_dest_oid: the temporary object to use for large objects
    */
   void start_copy(CopyCallback *cb, ObjectContextRef obc, hobject_t src,
-                 object_locator_t oloc, version_t version,
-                 const hobject_t& temp_dest_oid);
+                 object_locator_t oloc, version_t version, unsigned flags,
+                 const hobject_t& temp_dest_oid);
   void process_copy_chunk(hobject_t oid, tid_t tid, int r);
   void _write_copy_chunk(CopyOpRef cop, ObjectStore::Transaction *t);
   void _copy_some(ObjectContextRef obc, CopyOpRef cop);
index 6b1228253827d11098f5fd68c9ff8fd78f06a9d1..def1e3f7055aa29a30fc0057ed11c0f9ab5a5592 100644 (file)
@@ -38,6 +38,7 @@ const char *ceph_osd_flag_name(unsigned flag)
   case CEPH_OSD_FLAG_IGNORE_CACHE: return "ignore_cache";
   case CEPH_OSD_FLAG_SKIPRWLOCKS: return "skiprwlocks";
   case CEPH_OSD_FLAG_IGNORE_OVERLAY: return "ignore_overlay";
+  case CEPH_OSD_FLAG_FLUSH: return "flush";
   default: return "???";
   }
 }
index 704e4127a4bc6a1e0a0ab682791bff0d8bd39c76..301811e77936943589ee473a093a67513958b9e8 100644 (file)
@@ -860,10 +860,12 @@ struct ObjectOperation {
     osd_op.op.snap.snapid = snapid;
   }
 
-  void copy_from(object_t src, snapid_t snapid, object_locator_t src_oloc, version_t src_version) {
+  void copy_from(object_t src, snapid_t snapid, object_locator_t src_oloc,
+                version_t src_version, unsigned flags) {
     OSDOp& osd_op = add_op(CEPH_OSD_OP_COPY_FROM);
     osd_op.op.copy_from.snapid = snapid;
     osd_op.op.copy_from.src_version = src_version;
+    osd_op.op.copy_from.flags = flags;
     ::encode(src, osd_op.indata);
     ::encode(src_oloc, osd_op.indata);
   }