From: Luis Henriques Date: Fri, 15 Nov 2019 10:03:41 +0000 (+0000) Subject: osd: add new 'copy-from2' operation X-Git-Tag: v15.1.0~335^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dcd6a99ef9f5afaef11ab755f05675be502e9d3b;p=ceph-ci.git osd: add new 'copy-from2' operation 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 --- diff --git a/src/include/rados.h b/src/include/rados.h index 5fc54cfbda8..acd8cdc59bb 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -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, }; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 0aa36d41c0a..3761d812ba2 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5665,6 +5665,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& 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& 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& 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; diff --git a/src/osd/osd_op_util.cc b/src/osd/osd_op_util.cc index f1aaf61e710..626779843c7 100644 --- a/src/osd/osd_op_util.cc +++ b/src/osd/osd_op_util.cc @@ -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(); } }