From: myoungwon oh Date: Tue, 27 Feb 2018 14:33:22 +0000 (+0900) Subject: librados: add with_reference flag when redirect or chunk is enabled X-Git-Tag: v13.1.0~257^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=12feefc10ad88933b3550d5e9ab1bed3b3daceaa;p=ceph.git librados: add with_reference flag when redirect or chunk is enabled Signed-off-by: Myoungwon Oh --- diff --git a/src/include/rados.h b/src/include/rados.h index c89e76059a98e..959a76d12348e 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -468,6 +468,7 @@ enum { CEPH_OSD_OP_FLAG_FADVISE_WILLNEED = 0x10,/* data will be accessed in the near future */ CEPH_OSD_OP_FLAG_FADVISE_DONTNEED = 0x20,/* data will not be accessed in the near future */ CEPH_OSD_OP_FLAG_FADVISE_NOCACHE = 0x40, /* data will be accessed only once by this client */ + CEPH_OSD_OP_FLAG_WITH_REFERENCE = 0x80, /* need reference couting */ }; #define EOLDSNAPC 85 /* ORDERSNAP flag set; writer has old snapc*/ diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index 5c7befc49e4e1..39d402ce08d4c 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -469,9 +469,9 @@ namespace librados * Set redirect target */ void set_redirect(const std::string& tgt_obj, const IoCtx& tgt_ioctx, - uint64_t tgt_version); + uint64_t tgt_version, int flag = 0); void set_chunk(uint64_t src_offset, uint64_t src_length, const IoCtx& tgt_ioctx, - std::string tgt_oid, uint64_t tgt_offset); + std::string tgt_oid, uint64_t tgt_offset, int flag = 0); void tier_promote(); diff --git a/src/librados/librados.cc b/src/librados/librados.cc index b7315045b191c..7289a021312b6 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -607,22 +607,24 @@ void librados::ObjectReadOperation::cache_evict() void librados::ObjectWriteOperation::set_redirect(const std::string& tgt_obj, const IoCtx& tgt_ioctx, - uint64_t tgt_version) + uint64_t tgt_version, + int flag) { ::ObjectOperation *o = &impl->o; o->set_redirect(object_t(tgt_obj), tgt_ioctx.io_ctx_impl->snap_seq, - tgt_ioctx.io_ctx_impl->oloc, tgt_version); + tgt_ioctx.io_ctx_impl->oloc, tgt_version, flag); } void librados::ObjectWriteOperation::set_chunk(uint64_t src_offset, uint64_t src_length, const IoCtx& tgt_ioctx, string tgt_oid, - uint64_t tgt_offset) + uint64_t tgt_offset, + int flag) { ::ObjectOperation *o = &impl->o; o->set_chunk(src_offset, src_length, - tgt_ioctx.io_ctx_impl->oloc, object_t(tgt_oid), tgt_offset); + tgt_ioctx.io_ctx_impl->oloc, object_t(tgt_oid), tgt_offset, flag); } void librados::ObjectWriteOperation::tier_promote() diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index d2507dcb6b5ec..e7733c98694a6 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1134,22 +1134,24 @@ struct ObjectOperation { * Extensible tier */ void set_redirect(object_t tgt, snapid_t snapid, object_locator_t tgt_oloc, - version_t tgt_version) { + version_t tgt_version, int flag) { OSDOp& osd_op = add_op(CEPH_OSD_OP_SET_REDIRECT); osd_op.op.copy_from.snapid = snapid; osd_op.op.copy_from.src_version = tgt_version; encode(tgt, osd_op.indata); encode(tgt_oloc, osd_op.indata); + set_last_op_flags(flag); } void set_chunk(uint64_t src_offset, uint64_t src_length, object_locator_t tgt_oloc, - object_t tgt_oid, uint64_t tgt_offset) { + object_t tgt_oid, uint64_t tgt_offset, int flag) { OSDOp& osd_op = add_op(CEPH_OSD_OP_SET_CHUNK); encode(src_offset, osd_op.indata); encode(src_length, osd_op.indata); encode(tgt_oloc, osd_op.indata); encode(tgt_oid, osd_op.indata); encode(tgt_offset, osd_op.indata); + set_last_op_flags(flag); } void tier_promote() { diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index 78feb4c38d650..de4427b59b3a5 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -126,9 +126,9 @@ void usage(ostream& out) " listwatchers list the watchers of this object\n" " set-alloc-hint \n" " set allocation hint for an object\n" -" set-redirect --target-pool \n" +" set-redirect --target-pool [--with-reference]\n" " set redirect target\n" -" set-chunk --target-pool \n" +" set-chunk --target-pool [--with-reference]\n" " convert an object to chunked object\n" " tier-promote promote the object to the base tier\n" "\n" @@ -1725,6 +1725,7 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, bool omap_key_valid = false; std::string omap_key; std::string omap_key_pretty; + bool with_reference = false; Rados rados; IoCtx io_ctx; @@ -1940,6 +1941,10 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, omap_key_pretty = "(binary key)"; } } + i = opts.find("with-reference"); + if (i != opts.end()) { + with_reference = true; + } // open rados ret = rados.init_with_context(g_ceph_context); @@ -3597,7 +3602,11 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, } ObjectWriteOperation op; - op.set_redirect(target_obj, target_ctx, 0); + if (with_reference) { + op.set_redirect(target_obj, target_ctx, 0, CEPH_OSD_OP_FLAG_WITH_REFERENCE); + } else { + op.set_redirect(target_obj, target_ctx, 0); + } ret = io_ctx.operate(nargs[1], &op); if (ret < 0) { cerr << "error set-redirect " << pool_name << "/" << nargs[1] << " => " << target << "/" << target_obj << ": " << cpp_strerror(ret) << std::endl; @@ -3643,7 +3652,11 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, IoCtx target_ctx; ret = rados.ioctx_create(target, target_ctx); ObjectWriteOperation op; - op.set_chunk(offset, length, target_ctx, tgt_oid, tgt_offset); + if (with_reference) { + op.set_chunk(offset, length, target_ctx, tgt_oid, tgt_offset, CEPH_OSD_OP_FLAG_WITH_REFERENCE); + } else { + op.set_chunk(offset, length, target_ctx, tgt_oid, tgt_offset); + } ret = io_ctx.operate(nargs[1], &op); if (ret < 0) { cerr << "error set-chunk " << pool_name << "/" << nargs[1] << " " << " offset " << offset @@ -3908,6 +3921,8 @@ int main(int argc, const char **argv) opts["with-clones"] = "true"; } else if (ceph_argparse_witharg(args, i, &val, "--omap-key-file", (char*)NULL)) { opts["omap-key-file"] = val; + } else if (ceph_argparse_flag(args, i, "--with-reference", (char*)NULL)) { + opts["with-reference"] = "true"; } else { if (val[0] == '-') usage_exit();