From d28ec40a9538d3e598d2265f8b932dc85f086cf9 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 27 Aug 2019 17:23:37 +0200 Subject: [PATCH] crimson/osd: add support for CEPH_OSD_OP_OMAPSETVALS. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/objclass.cc | 13 ++++++++++--- src/crimson/osd/ops_executer.cc | 8 ++++++++ src/crimson/osd/pg_backend.cc | 28 ++++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 4 ++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index e238b7107a8..a3fdb5e43d8 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -323,10 +323,17 @@ int cls_cxx_map_set_val(cls_method_context_t hctx, } int cls_cxx_map_set_vals(cls_method_context_t hctx, - const std::map *map) + const std::map *map) { - return 0; + OSDOp op{ CEPH_OSD_OP_OMAPSETVALS }; + encode(*map, op.indata); + + try { + reinterpret_cast(hctx)->do_osd_op(op).get(); + return 0; + } catch (ceph::osd::error& e) { + return -e.code().value(); + } } int cls_cxx_map_clear(cls_method_context_t hctx) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 387b521503e..d2cae201fb3 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -416,6 +416,14 @@ OpsExecuter::do_osd_op(OSDOp& osd_op) return do_read_op([&osd_op] (auto& backend, const auto& os) { return backend.omap_get_vals_by_keys(os, osd_op); }); + case CEPH_OSD_OP_OMAPSETVALS: + if (!pg.get_pool().info.supports_omap()) { + throw ceph::osd::operation_not_supported{}; + } + return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { + return backend.omap_set_vals(os, osd_op, txn); + }); + default: logger().warn("unknown op {}", ceph_osd_op_name(op.op)); throw std::runtime_error( diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 8291fa416b6..2d28ab90815 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -522,3 +522,31 @@ seastar::future<> PGBackend::omap_get_vals_by_keys( //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10); //ctx->delta_stats.num_rd++; } + +seastar::future<> PGBackend::omap_set_vals( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& txn) +{ + maybe_create_new_object(os, txn); + + ceph::bufferlist to_set_bl; + try { + auto p = osd_op.indata.cbegin(); + decode_str_str_map_to_bl(p, &to_set_bl); + } catch (buffer::error&) { + throw ceph::osd::invalid_argument{}; + } + + txn.omap_setkeys(coll->get_cid(), ghobject_t{os.oi.soid}, to_set_bl); + + // TODO: + //ctx->clean_regions.mark_omap_dirty(); + + // TODO: + //ctx->delta_stats.num_wr++; + //ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10); + os.oi.set_flag(object_info_t::FLAG_OMAP); + os.oi.clear_omap_digest(); + return seastar::now(); +} diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index b4553157f98..9fdfb0f1b81 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -92,6 +92,10 @@ public: seastar::future<> omap_get_vals_by_keys( const ObjectState& os, OSDOp& osd_op) const; + seastar::future<> omap_set_vals( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans); virtual void got_rep_op_reply(const MOSDRepOpReply&) {} -- 2.39.5