}
int cls_cxx_map_set_vals(cls_method_context_t hctx,
- const std::map<string,
- bufferlist> *map)
+ const std::map<string, ceph::bufferlist> *map)
{
- return 0;
+ OSDOp op{ CEPH_OSD_OP_OMAPSETVALS };
+ encode(*map, op.indata);
+
+ try {
+ reinterpret_cast<ceph::osd::OpsExecuter*>(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)
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(
//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();
+}
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&) {}