From 135ed7eb65e410d907b8156f00debf6f41eb44e4 Mon Sep 17 00:00:00 2001 From: Amnon Hanuhov Date: Wed, 27 May 2020 12:58:20 +0300 Subject: [PATCH] crimson/osd: Implement CEPH_OSD_OP_OMAPRMKEYRANGE Signed-off-by: Amnon Hanuhov --- src/crimson/osd/ops_executer.cc | 9 +++++++++ src/crimson/osd/pg_backend.cc | 22 +++++++++++++++++++++- src/crimson/osd/pg_backend.h | 4 ++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index d2fb4a6aef9..739b7c65e33 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -768,6 +768,15 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { return backend.omap_set_header(os, osd_op, txn); }, true); + case CEPH_OSD_OP_OMAPRMKEYRANGE: +#if 0 + if (!pg.get_pool().info.supports_omap()) { + return crimson::ct_error::operation_not_supported::make(); + } +#endif + return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { + return backend.omap_remove_range(os, osd_op, txn); + }, true); // watch/notify case CEPH_OSD_OP_WATCH: diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 60311d7a759..494d0ea024e 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -699,12 +699,32 @@ seastar::future<> PGBackend::omap_set_header( txn.omap_setheader(coll->get_cid(), ghobject_t{os.oi.soid}, osd_op.indata); //TODO: //ctx->clean_regions.mark_omap_dirty(); - //ctx->delta_stats.num_wr++; + //ctx->delta_stats.num_wr++; os.oi.set_flag(object_info_t::FLAG_OMAP); os.oi.clear_omap_digest(); return seastar::now(); } +seastar::future<> PGBackend::omap_remove_range( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& txn) +{ + std::string key_begin, key_end; + try { + auto p = osd_op.indata.cbegin(); + decode(key_begin, p); + decode(key_end, p); + } catch (buffer::error& e) { + throw crimson::osd::invalid_argument{}; + } + txn.omap_rmkeyrange(coll->get_cid(), ghobject_t{os.oi.soid}, key_begin, key_end); + //TODO: + //ctx->delta_stats.num_wr++; + os.oi.clear_omap_digest(); + return seastar::now(); +} + seastar::future PGBackend::stat( CollectionRef c, const ghobject_t& oid) const diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 55704302deb..894654debda 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -141,6 +141,10 @@ public: ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& trans); + seastar::future<> omap_remove_range( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); virtual void got_rep_op_reply(const MOSDRepOpReply&) {} virtual seastar::future<> stop() = 0; -- 2.47.3