From bd6f996787023d747b6f790d16af7368a6dcdc4d Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 27 Nov 2019 17:22:53 +0100 Subject: [PATCH] crimson: implement CEPH_OSD_WATCH_OP_PING. Signed-off-by: Radoslaw Zarzynski --- src/crimson/common/errorator.h | 1 + src/crimson/osd/ops_executer.cc | 27 +++++++++++++++++++++++++-- src/crimson/osd/ops_executer.h | 7 ++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 1824764718dfa..e8a8ab689798f 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -852,6 +852,7 @@ namespace ct_error { using operation_not_supported = ct_error_code; using not_connected = ct_error_code; + using timed_out = ct_error_code; } using stateful_errc = stateful_error_t; diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 8c2ddc9ca70ec..7d7cc400453ee 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -214,6 +214,30 @@ OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch_subop_unwatch( }); } +OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch_subop_ping( + OSDOp& osd_op, + ObjectState& os, + ceph::os::Transaction& txn) +{ + const entity_name_t& entity = get_message().get_reqid().name; + const auto& cookie = osd_op.op.watch.cookie; + const auto key = std::make_pair(cookie, entity); + + // Note: WATCH with PING doesn't cause may_write() to return true, + // so if there is nothing else in the transaction, this is going + // to run do_osd_op_effects, but not write out a log entry */ + if (!os.oi.watchers.count(key)) { + return crimson::ct_error::not_connected::make(); + } + auto it = obc->watchers.find(key); + if (it == std::end(obc->watchers) || !it->second->is_connected()) { + return crimson::ct_error::timed_out::make(); + } + logger().info("found existing watch by {}", entity); + it->second->got_ping(ceph_clock_now()); + return seastar::now(); +} + OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch( OSDOp& osd_op, ObjectState& os, @@ -228,8 +252,7 @@ OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch( case CEPH_OSD_WATCH_OP_RECONNECT: return do_op_watch_subop_reconnect(osd_op, os, txn); case CEPH_OSD_WATCH_OP_PING: - // TODO: implement ping - break; + return do_op_watch_subop_ping(osd_op, os, txn); case CEPH_OSD_WATCH_OP_UNWATCH: return do_op_watch_subop_unwatch(osd_op, os, txn); case CEPH_OSD_WATCH_OP_LEGACY_WATCH: diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 82385ff304803..8f286262550fa 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -49,7 +49,8 @@ class OpsExecuter { using watch_errorator = crimson::errorator< crimson::ct_error::enoent, crimson::ct_error::invarg, - crimson::ct_error::not_connected>; + crimson::ct_error::not_connected, + crimson::ct_error::timed_out>; public: // because OpsExecuter is pretty heavy-weight object we want to ensure @@ -115,6 +116,10 @@ private: class OSDOp& osd_op, class ObjectState& os, ceph::os::Transaction& txn); + watch_errorator::future<> do_op_watch_subop_ping( + class OSDOp& osd_op, + class ObjectState& os, + ceph::os::Transaction& txn); hobject_t &get_target() const { return obc->obs.oi.soid; -- 2.39.5