From e816237374f4573c8e7914d3fa202902356eaa6d Mon Sep 17 00:00:00 2001 From: Amnon Hanuhov Date: Thu, 29 Jul 2021 16:11:27 +0300 Subject: [PATCH] crimson/osd: Add support for CEPH_OSD_OP_OMAPRMKEYS Signed-off-by: Amnon Hanuhov --- src/crimson/osd/ops_executer.cc | 8 ++++++++ src/crimson/osd/pg_backend.cc | 20 ++++++++++++++++++++ src/crimson/osd/pg_backend.h | 4 ++++ 3 files changed, 32 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 45e8c9373f0..17388d119a0 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 293f6841ba9..e45b935bb32 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 aec38ba8442..1d7e6219ee5 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< -- 2.47.3