From 120c48340afd32d5c84a638e2b81a74ba3313fe0 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 20 Aug 2020 20:52:11 +0800 Subject: [PATCH] crimson/osd: implement omap-clear op it is tested by test_rados.py:TestIoctx.test_clear_omap, so let's support this op in crimson as well. Signed-off-by: Kefu Chai --- src/crimson/osd/ops_executer.cc | 4 ++++ src/crimson/osd/pg_backend.cc | 24 ++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 6 ++++++ 3 files changed, 34 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index a9e27b39c8546..9616399a95a86 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -560,6 +560,10 @@ OpsExecuter::execute_op(OSDOp& osd_op) return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { return backend.omap_remove_range(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); + }, 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 b87fdba6ee546..827441efddec9 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -1052,6 +1052,30 @@ seastar::future<> PGBackend::omap_remove_range( return seastar::now(); } +PGBackend::omap_clear_ertr::future<> +PGBackend::omap_clear( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) +{ + if (__builtin_expect(stopping, false)) { + throw crimson::common::system_shutdown_exception(); + } + if (!os.exists || os.oi.is_whiteout()) { + logger().debug("{}: object does not exist: {}", os.oi.soid); + return crimson::ct_error::enoent::make(); + } + if (!os.oi.is_omap()) { + return omap_clear_ertr::now(); + } + txn.omap_clear(coll->get_cid(), ghobject_t{os.oi.soid}); + osd_op_params.clean_regions.mark_omap_dirty(); + os.oi.clear_omap_digest(); + os.oi.clear_flag(object_info_t::FLAG_OMAP); + return omap_clear_ertr::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 b650f9095b496..6cad22eeb8937 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -183,6 +183,12 @@ public: ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& trans); + using omap_clear_ertr = crimson::errorator; + omap_clear_ertr::future<> omap_clear( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); virtual void got_rep_op_reply(const MOSDRepOpReply&) {} virtual seastar::future<> stop() = 0; -- 2.39.5