From: Amnon Hanuhov Date: Thu, 29 Jul 2021 13:11:27 +0000 (+0300) Subject: crimson/osd: Add support for CEPH_OSD_OP_OMAPRMKEYS X-Git-Tag: v17.1.0~52^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e816237374f4573c8e7914d3fa202902356eaa6d;p=ceph.git crimson/osd: Add support for CEPH_OSD_OP_OMAPRMKEYS Signed-off-by: Amnon Hanuhov --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 45e8c9373f0a..17388d119a06 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -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); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 293f6841ba9f..e45b935bb323 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -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, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index aec38ba84422..1d7e6219ee5b 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -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; using omap_clear_iertr = ::crimson::interruptible::interruptible_errorator<