]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: add new 'copy-from2' operation
authorLuis Henriques <lhenriques@suse.com>
Fri, 15 Nov 2019 10:03:41 +0000 (10:03 +0000)
committerLuis Henriques <lhenriques@suse.com>
Wed, 4 Dec 2019 11:09:51 +0000 (11:09 +0000)
The new 'copy-from2' is very similar to the original 'copy-from'
operation.  The differences are:

 - It validates the flags and return an error if there are invalid bits
   set in it;
 - It processes a new 'copy-from' flag (*_TRUNCATE_SEQ) which allows a
   client to send 2 extra parameters, truncate_seq and truncate_size.
   These will be used for the destination object instead of simply being
   copied from the source object.

Signed-off-by: Luis Henriques <lhenriques@suse.com>
src/include/rados.h
src/osd/PrimaryLogPG.cc
src/osd/osd_op_util.cc

index 5fc54cfbda8981dfb1d83411f773d1de91e20de2..acd8cdc59bb324c628ed2f035af6ce85d4a6f436 100644 (file)
@@ -297,6 +297,7 @@ extern const char *ceph_osd_state_name(int s);
                                                                            \
        /* tiering */                                                       \
        f(COPY_FROM,    __CEPH_OSD_OP(WR, DATA, 26),    "copy-from")        \
+       f(COPY_FROM2,   __CEPH_OSD_OP(WR, DATA, 45),    "copy-from2")       \
        /* was copy-get-classic */                                      \
        f(UNDIRTY,      __CEPH_OSD_OP(WR, DATA, 28),    "undirty")          \
        f(ISDIRTY,      __CEPH_OSD_OP(RD, DATA, 29),    "isdirty")          \
@@ -509,9 +510,17 @@ enum {
        CEPH_OSD_COPY_FROM_FLAG_MAP_SNAP_CLONE = 8, /* map snap direct to
                                                     * cloneid */
        CEPH_OSD_COPY_FROM_FLAG_RWORDERED = 16, /* order with write */
-       CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ = 32, /* send truncate_{seq,size} */
+       CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ = 32, /* use provided truncate_{seq,size} (copy-from2 only) */
 };
 
+#define CEPH_OSD_COPY_FROM_FLAGS                       \
+       (CEPH_OSD_COPY_FROM_FLAG_FLUSH |                \
+        CEPH_OSD_COPY_FROM_FLAG_IGNORE_OVERLAY |       \
+        CEPH_OSD_COPY_FROM_FLAG_IGNORE_CACHE |         \
+        CEPH_OSD_COPY_FROM_FLAG_MAP_SNAP_CLONE |       \
+        CEPH_OSD_COPY_FROM_FLAG_RWORDERED |            \
+        CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ)
+
 enum {
        CEPH_OSD_TMAP2OMAP_NULLOK = 1,
 };
index 0aa36d41c0aa36f7425394cbda80e6de4dff67e8..3761d812ba277d8c6eb3af2a7f806d2beba0c785 100644 (file)
@@ -5665,6 +5665,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
     case CEPH_OSD_OP_CACHE_TRY_FLUSH:
     case CEPH_OSD_OP_UNDIRTY:
     case CEPH_OSD_OP_COPY_FROM:  // we handle user_version update explicitly
+    case CEPH_OSD_OP_COPY_FROM2:
     case CEPH_OSD_OP_CACHE_PIN:
     case CEPH_OSD_OP_CACHE_UNPIN:
     case CEPH_OSD_OP_SET_REDIRECT:
@@ -7662,6 +7663,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
       break;
 
     case CEPH_OSD_OP_COPY_FROM:
+    case CEPH_OSD_OP_COPY_FROM2:
       ++ctx->num_write;
       result = 0;
       {
@@ -7672,12 +7674,20 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        bool have_truncate = false;
        snapid_t src_snapid = (uint64_t)op.copy_from.snapid;
        version_t src_version = op.copy_from.src_version;
+
+       if ((op.op == CEPH_OSD_OP_COPY_FROM2) &&
+           (op.copy_from.flags & ~CEPH_OSD_COPY_FROM_FLAGS)) {
+         dout(20) << "invalid copy-from2 flags 0x"
+                 << std::hex << (int)op.copy_from.flags << std::dec << dendl;
+         result = -EINVAL;
+         break;
+       }
        try {
          decode(src_name, bp);
          decode(src_oloc, bp);
          // check if client sent us truncate_seq and truncate_size
-         if ((op.copy_from.flags & CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ) &&
-             !bp.end()) {
+         if ((op.op == CEPH_OSD_OP_COPY_FROM2) &&
+             (op.copy_from.flags & CEPH_OSD_COPY_FROM_FLAG_TRUNCATE_SEQ)) {
            decode(truncate_seq, bp);
            decode(truncate_size, bp);
            have_truncate = true;
index f1aaf61e710384a7156ae33bae7dc20c302f7c0e..626779843c76964474b18ec0f211f1c1ded57b9c 100644 (file)
@@ -136,7 +136,8 @@ int OpInfo::set_from_op(
             (iter->op.op != CEPH_OSD_OP_RMXATTR) &&
             (iter->op.op != CEPH_OSD_OP_STARTSYNC) &&
             (iter->op.op != CEPH_OSD_OP_COPY_GET) &&
-            (iter->op.op != CEPH_OSD_OP_COPY_FROM)) {
+            (iter->op.op != CEPH_OSD_OP_COPY_FROM) &&
+            (iter->op.op != CEPH_OSD_OP_COPY_FROM2)) {
           set_promote();
         }
       }