From dd80173fa0c951020b53a00587e76f4329955852 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 27 Nov 2019 22:47:47 +0100 Subject: [PATCH] crimson: implement CEPH_OSD_OP_NOTIFY. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/ops_executer.cc | 38 +++++++++++++++++++++++++++++++++ src/crimson/osd/ops_executer.h | 3 +++ 2 files changed, 41 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 7d7cc400453..b3dfbe294d3 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -263,6 +263,40 @@ OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch( return crimson::ct_error::invarg::make(); } +OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_notify( + OSDOp& osd_op, + const ObjectState& os) +{ + if (!os.exists) { + return crimson::ct_error::enoent::make(); + } + return with_effect_on_obc(notify_info_t{}, + [&] (auto& ctx) { + try { + auto bp = osd_op.indata.cbegin(); + uint32_t ver; // obsolete + ceph::decode(ver, bp); + ceph::decode(ctx.timeout, bp); + ceph::decode(ctx.bl, bp); + } catch (const buffer::error&) { + ctx.timeout = 0; + } + if (!ctx.timeout) { + using crimson::common::local_conf; + ctx.timeout = local_conf()->osd_default_notify_timeout; + } + // FIXME + ctx.notify_id = 42; //osd->get_next_id(get_osdmap_epoch()); + ctx.cookie = osd_op.op.notify.cookie; + // return our unique notify id to the client + ceph::encode(ctx.notify_id, osd_op.outdata); + return seastar::now(); + }, + [] (auto&& ctx, ObjectContextRef obc) { + return seastar::now(); + }); +} + static inline std::unique_ptr get_pgls_filter( const std::string& type, bufferlist::const_iterator& iter) @@ -598,6 +632,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { return do_op_watch(osd_op, os, txn); }); + case CEPH_OSD_OP_NOTIFY: + return do_read_op([this, &osd_op] (auto&, const auto& os) { + return do_op_notify(osd_op, os); + }); default: logger().warn("unknown op {}", ceph_osd_op_name(op.op)); diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 8f286262550..617db0ac427 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -120,6 +120,9 @@ private: class OSDOp& osd_op, class ObjectState& os, ceph::os::Transaction& txn); + watch_errorator::future<> do_op_notify( + class OSDOp& osd_op, + const class ObjectState& os); hobject_t &get_target() const { return obc->obs.oi.soid; -- 2.39.5