]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd,librados: add unset-manifest op
authormyoungwon oh <omwmw@sk.com>
Tue, 15 May 2018 08:36:42 +0000 (17:36 +0900)
committermyoungwon oh <omwmw@sk.com>
Tue, 15 May 2018 08:36:42 +0000 (17:36 +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 959a76d12348e0394b4f50319197ae85f7a61d23..15622c6fb9cef96f9dd23cf596d96a6e189beee2 100644 (file)
@@ -314,6 +314,7 @@ extern int ceph_release_from_features(uint64_t features);
        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")     \
+       f(UNSET_MANIFEST, __CEPH_OSD_OP(WR, DATA, 42),  "unset-manifest")   \
                                                                            \
        /** attrs **/                                                       \
        /* read */                                                          \
index 79fa156034873c9b914a28fc5da380b93769b0db..53e2c4991478dd417240327dc5801f6eb19a2f43 100644 (file)
@@ -474,6 +474,7 @@ namespace librados
     void set_chunk(uint64_t src_offset, uint64_t src_length, const IoCtx& tgt_ioctx,
                    std::string tgt_oid, uint64_t tgt_offset, int flag = 0);
     void tier_promote();
+    void unset_manifest();
 
 
     friend class IoCtx;
index 77bc9ca9ad3bcff32335cc7d261dc31137959e0d..08c4379c4a63cec1c4e1fdfccc3a0656565cf73d 100644 (file)
@@ -633,6 +633,12 @@ void librados::ObjectWriteOperation::tier_promote()
   o->tier_promote();
 }
 
+void librados::ObjectWriteOperation::unset_manifest()
+{
+  ::ObjectOperation *o = &impl->o;
+  o->unset_manifest();
+}
+
 void librados::ObjectWriteOperation::tmap_put(const bufferlist &bl)
 {
   ::ObjectOperation *o = &impl->o;
index 656eff8f17270dc03aaabb121d6d5c8ab5274838..f402e4518df799b7899aa26945190818f4b810f6 100644 (file)
@@ -2420,7 +2420,8 @@ PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_manifest_detail(
     ceph_osd_op& op = osd_op.op;
     if (op.op == CEPH_OSD_OP_SET_REDIRECT ||
        op.op == CEPH_OSD_OP_SET_CHUNK || 
-       op.op == CEPH_OSD_OP_TIER_PROMOTE) {
+       op.op == CEPH_OSD_OP_TIER_PROMOTE ||
+       op.op == CEPH_OSD_OP_UNSET_MANIFEST) {
       return cache_result_t::NOOP;
     }
   }
@@ -6977,6 +6978,59 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
 
       break;
 
+    case CEPH_OSD_OP_UNSET_MANIFEST:
+      ++ctx->num_write;
+      {
+       if (pool.info.is_tier()) {
+         result = -EINVAL;
+         break;
+       }
+       if (!obs.exists) {
+         result = -ENOENT;
+         break;
+       }
+       if (!oi.has_manifest()) {
+         result = -EOPNOTSUPP;
+         break;
+       }
+       if (get_osdmap()->require_osd_release < CEPH_RELEASE_LUMINOUS) {
+         result = -EOPNOTSUPP;
+         break;
+       }
+
+       if (oi.manifest.is_redirect()) {
+         if ((oi.flags & object_info_t::FLAG_REDIRECT_HAS_REFERENCE)) {
+           ctx->register_on_commit(
+             [oi, ctx, this](){
+             object_locator_t target_oloc(oi.manifest.redirect_target);
+             refcount_manifest(ctx->obc, target_oloc, oi.manifest.redirect_target, 
+                               SnapContext(), false, NULL, 0);
+           });
+         }
+       } else if (oi.manifest.is_chunked()) {
+           ctx->register_on_commit(
+             [oi, ctx, this](){
+             for (auto p : oi.manifest.chunk_map) {
+               if (p.second.flags & chunk_info_t::FLAG_HAS_REFERENCE) {
+                 object_locator_t target_oloc(p.second.oid);
+                 refcount_manifest(ctx->obc, target_oloc, p.second.oid, 
+                                   SnapContext(), false, NULL, p.first);
+               }
+             }
+           });
+       } else {
+         assert(0 == "unrecognized manifest type");
+       }
+
+       oi.clear_flag(object_info_t::FLAG_MANIFEST);
+       oi.manifest = object_manifest_t();
+       ctx->delta_stats.num_objects_manifest--;
+       ctx->delta_stats.num_wr++;
+       ctx->modify = true;
+      }
+
+      break;
+
       // -- object attrs --
       
     case CEPH_OSD_OP_SETXATTR:
index b37c5de90a03cb1422eba95e9ee43165bce51b05..466bf49372d308adc5ec0c79bb27836e6864c282 100644 (file)
@@ -1156,6 +1156,10 @@ struct ObjectOperation {
     add_op(CEPH_OSD_OP_TIER_PROMOTE);
   }
 
+  void unset_manifest() {
+    add_op(CEPH_OSD_OP_UNSET_MANIFEST);
+  }
+
   void set_alloc_hint(uint64_t expected_object_size,
                       uint64_t expected_write_size,
                      uint32_t flags) {
index 4b21e8322d17019fc1b27bc78d64bb3651030a58..d14d6ac5508932f3e208774b11047bc540812f36 100644 (file)
@@ -131,6 +131,7 @@ void usage(ostream& out)
 "   set-chunk <object A> <offset> <length> --target-pool <caspool> <target object A> <taget-offset> [--with-reference]\n"
 "                                    convert an object to chunked object\n"
 "   tier-promote <obj-name>         promote the object to the base tier\n"
+"   unset-manifest <obj-name>       unset redirect or chunked object\n"
 "\n"
 "IMPORT AND EXPORT\n"
 "   export [filename]\n"
@@ -3696,6 +3697,19 @@ static int rados_tool_common(const std::map < std::string, std::string > &opts,
           << cpp_strerror(ret) << std::endl;
       goto out;
     }
+  } else if (strcmp(nargs[0], "unset-manifest") == 0) {
+    if (!pool_name || nargs.size() < 2)
+      usage_exit();
+    string oid(nargs[1]);
+
+    ObjectWriteOperation op;
+    op.unset_manifest();
+    ret = io_ctx.operate(oid, &op);
+    if (ret < 0) {
+      cerr << "error unset-manifest " << 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) {