From: myoungwon oh Date: Wed, 6 Dec 2017 06:29:10 +0000 (+0900) Subject: osd,librados: a rados op to promote the object (redirect, chunked) X-Git-Tag: v13.0.2~474^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c6945d036182cb7c10dc3d8d15057dcc421a55ed;p=ceph.git osd,librados: a rados op to promote the object (redirect, chunked) Signed-off-by: Myoungwon Oh --- diff --git a/src/include/rados.h b/src/include/rados.h index b63fca181fb..c89e76059a9 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -313,6 +313,7 @@ extern int ceph_release_from_features(uint64_t features); /* Extensible */ \ f(SET_REDIRECT, __CEPH_OSD_OP(WR, DATA, 39), "set-redirect") \ f(SET_CHUNK, __CEPH_OSD_OP(WR, DATA, 40), "set-chunk") \ + f(TIER_PROMOTE, __CEPH_OSD_OP(WR, DATA, 41), "tier-promote") \ \ /** attrs **/ \ /* read */ \ diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index e6fcfe1f56f..4c32c5febbb 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -473,6 +473,7 @@ namespace librados uint64_t tgt_version); void set_chunk(uint64_t src_offset, uint64_t src_length, const IoCtx& tgt_ioctx, std::string tgt_oid, uint64_t tgt_offset); + void tier_promote(); friend class IoCtx; diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 329b145cd2d..e7f63542544 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -625,6 +625,12 @@ void librados::ObjectWriteOperation::set_chunk(uint64_t src_offset, tgt_ioctx.io_ctx_impl->oloc, object_t(tgt_oid), tgt_offset); } +void librados::ObjectWriteOperation::tier_promote() +{ + ::ObjectOperation *o = &impl->o; + o->tier_promote(); +} + void librados::ObjectWriteOperation::tmap_put(const bufferlist &bl) { ::ObjectOperation *o = &impl->o; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index a1f2c054537..cacc6999d23 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5489,6 +5489,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) case CEPH_OSD_OP_CACHE_PIN: case CEPH_OSD_OP_CACHE_UNPIN: case CEPH_OSD_OP_SET_REDIRECT: + case CEPH_OSD_OP_TIER_PROMOTE: break; default: if (op.op & CEPH_OSD_OP_MODE_WR) @@ -6681,6 +6682,35 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& ops) break; + case CEPH_OSD_OP_TIER_PROMOTE: + ++ctx->num_write; + { + if (pool.info.is_tier()) { + result = -EINVAL; + break; + } + if (!obs.exists) { + result = -ENOENT; + break; + } + if (get_osdmap()->require_osd_release < CEPH_RELEASE_LUMINOUS) { + result = -EOPNOTSUPP; + break; + } + if (!obs.oi.has_manifest()) { + result = 0; + break; + } + + object_locator_t tgt_oloc(obs.oi.soid); + promote_object(ctx->obc, obs.oi.soid, tgt_oloc, ctx->op, NULL); + + dout(10) << "tier-promote oid:" << oi.soid << " manifest: " << obs.oi.manifest << dendl; + result = -EAGAIN; + } + + break; + // -- object attrs -- case CEPH_OSD_OP_SETXATTR: diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index c3861498198..85529081cef 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1152,6 +1152,10 @@ struct ObjectOperation { encode(tgt_offset, osd_op.indata); } + void tier_promote() { + add_op(CEPH_OSD_OP_TIER_PROMOTE); + } + void set_alloc_hint(uint64_t expected_object_size, uint64_t expected_write_size, uint32_t flags) { diff --git a/src/tools/rados/rados.cc b/src/tools/rados/rados.cc index d9863f7b77e..b87b19194dd 100644 --- a/src/tools/rados/rados.cc +++ b/src/tools/rados/rados.cc @@ -128,6 +128,7 @@ void usage(ostream& out) " set redirect target\n" " set-chunk --target-pool \n" " convert an object to chunked object\n" +" tier-promote promote the object to the base tier\n" "\n" "IMPORT AND EXPORT\n" " export [filename]\n" @@ -3580,6 +3581,19 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts, << "tgt_offset: " << tgt_offset << " : " << cpp_strerror(ret) << std::endl; goto out; } + } else if (strcmp(nargs[0], "tier-promote") == 0) { + if (!pool_name || nargs.size() < 2) + usage_exit(); + string oid(nargs[1]); + + ObjectWriteOperation op; + op.tier_promote(); + ret = io_ctx.operate(oid, &op); + if (ret < 0) { + cerr << "error tier-promote " << pool_name << "/" << oid << " : " + << cpp_strerror(ret) << std::endl; + goto out; + } } else if (strcmp(nargs[0], "export") == 0) { // export [filename] if (!pool_name || nargs.size() > 2) {