]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd,librados: a rados op to promote the object (redirect, chunked)
authormyoungwon oh <omwmw@sk.com>
Wed, 6 Dec 2017 06:29:10 +0000 (15:29 +0900)
committermyoungwon oh <omwmw@sk.com>
Fri, 12 Jan 2018 05:38:11 +0000 (14:38 +0900)
Signed-off-by: Myoungwon Oh <omwmw@sk.com>
src/include/rados.h
src/include/rados/librados.hpp
src/librados/librados.cc
src/osd/PrimaryLogPG.cc
src/osdc/Objecter.h
src/tools/rados/rados.cc

index b63fca181fbc15f566e12e7f82318a5c9bdb8126..c89e76059a98ea54d012b3a32d6295f628b920f6 100644 (file)
@@ -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 */                                                          \
index e6fcfe1f56ff1ac0d82d192c0b48918970d97e83..4c32c5febbb0aa05a38cb3135dbb2d1d3e73abc6 100644 (file)
@@ -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;
index 329b145cd2da2fb65bdb0f4f7d4248a0139333e5..e7f6354254476e4a26ced7761319542850b6f305 100644 (file)
@@ -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;
index a1f2c054537e50a5490c382b5ba6b4f4f9e8082c..cacc6999d2373d181b23daa37b3e32c06a6fabb2 100644 (file)
@@ -5489,6 +5489,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& 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<OSDOp>& 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:
index c386149819819e3a7253417f2f280679d9114d9f..85529081cefd85cc952b1cb379a2c93a3baf6908 100644 (file)
@@ -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) {
index d9863f7b77e5ad84b3227846ba1a6cc70a36b1ed..b87b19194dd214b833cd7bcd2379eb18808cdb9a 100644 (file)
@@ -128,6 +128,7 @@ void usage(ostream& out)
 "                                    set redirect target\n"
 "   set-chunk <object A> <offset> <length> --target-pool <caspool> <target object A> <taget-offset>\n"
 "                                    convert an object to chunked object\n"
+"   tier-promote <obj-name>         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) {