]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: Add support for CEPH_OSD_OP_OMAPRMKEYS
authorAmnon Hanuhov <ahanukov@redhat.com>
Thu, 29 Jul 2021 13:11:27 +0000 (16:11 +0300)
committerAmnon Hanuhov <AmnonSWE@gmail.com>
Fri, 14 Jan 2022 12:13:14 +0000 (14:13 +0200)
Signed-off-by: Amnon Hanuhov <ahanukov@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 45e8c9373f0a983f3b681ace6d7051f44577ee45..17388d119a069951133a61ebb7908f644df56146 100644 (file)
@@ -604,6 +604,14 @@ OpsExecuter::execute_op(OSDOp& osd_op)
     return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.omap_remove_range(os, osd_op, txn, delta_stats);
     }, true);
+  case CEPH_OSD_OP_OMAPRMKEYS:
+    /** TODO: Implement supports_omap()
+    if (!pg.get_pool().info.supports_omap()) {
+      return crimson::ct_error::operation_not_supported::make();
+    }*/
+    return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
+      return backend.omap_remove_key(os, osd_op, txn);
+    }, true);
   case CEPH_OSD_OP_OMAPCLEAR:
     return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.omap_clear(os, osd_op, txn, *osd_op_params, delta_stats);
index 293f6841ba9f003b3553529f98ea88a7b96e2ddf..e45b935bb323f2adf837f5091440839a9f4494f0 100644 (file)
@@ -1309,6 +1309,26 @@ PGBackend::interruptible_future<> PGBackend::omap_remove_range(
   return seastar::now();
 }
 
+PGBackend::interruptible_future<> PGBackend::omap_remove_key(
+  ObjectState& os,
+  const OSDOp& osd_op,
+  ceph::os::Transaction& txn)
+{
+  ceph::bufferlist to_rm_bl;
+  try {
+    auto p = osd_op.indata.cbegin();
+    decode_str_set_to_bl(p, &to_rm_bl);
+  } catch (buffer::error& e) {
+    throw crimson::osd::invalid_argument{};
+  }
+  txn.omap_rmkeys(coll->get_cid(), ghobject_t{os.oi.soid}, to_rm_bl);
+  // TODO:
+  // ctx->clean_regions.mark_omap_dirty();
+  // ctx->delta_stats.num_wr++;
+  os.oi.clear_omap_digest();
+  return seastar::now();
+}
+
 PGBackend::omap_clear_iertr::future<>
 PGBackend::omap_clear(
   ObjectState& os,
index aec38ba84422581019a4bd7a952d1e09b42c2557..1d7e6219ee5bfb4612382e213c0941dec06796a1 100644 (file)
@@ -273,6 +273,10 @@ public:
     const OSDOp& osd_op,
     ceph::os::Transaction& trans,
     object_stat_sum_t& delta_stats);
+  interruptible_future<> omap_remove_key(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& trans);
   using omap_clear_ertr = crimson::errorator<crimson::ct_error::enoent>;
   using omap_clear_iertr =
     ::crimson::interruptible::interruptible_errorator<