From 12fd597cc68186b4bfebd12f3ba01147703822d2 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Wed, 25 Aug 2021 10:36:00 +0000 Subject: [PATCH] crimson/osd: implement CEPH_OSD_OP_LIST_WATCHERS. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/ops_executer.cc | 23 +++++++++++++++++++++++ src/crimson/osd/ops_executer.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index c0d2e7f3e9669..56db254911451 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -364,6 +364,25 @@ OpsExecuter::watch_ierrorator::future<> OpsExecuter::do_op_notify( }); } +OpsExecuter::watch_ierrorator::future<> OpsExecuter::do_op_list_watchers( + OSDOp& osd_op, + const ObjectState& os) +{ + logger().debug("{}", __func__); + + obj_list_watch_response_t response; + for (const auto& [key, info] : os.oi.watchers) { + logger().debug("{}: key cookie={}, entity={}", + __func__, key.first, key.second); + assert(key.first == info.cookie); + assert(key.second.is_client()); + response.entries.emplace_back(watch_item_t{ + key.second, info.cookie, info.timeout_seconds, info.addr}); + response.encode(osd_op.outdata, get_message().get_features()); + } + return watch_ierrorator::now(); +} + OpsExecuter::watch_ierrorator::future<> OpsExecuter::do_op_notify_ack( OSDOp& osd_op, const ObjectState& os) @@ -576,6 +595,10 @@ OpsExecuter::execute_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); }, false); + case CEPH_OSD_OP_LIST_WATCHERS: + return do_read_op([this, &osd_op] (auto&, const auto& os) { + return do_op_list_watchers(osd_op, os); + }); case CEPH_OSD_OP_NOTIFY: return do_read_op([this, &osd_op] (auto&, const auto& os) { return do_op_notify(osd_op, os); diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index c84b9b8796529..bc97e1daee5f3 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -196,6 +196,9 @@ private: OSDOp& osd_op, ObjectState& os, ceph::os::Transaction& txn); + watch_ierrorator::future<> do_op_list_watchers( + OSDOp& osd_op, + const ObjectState& os); watch_ierrorator::future<> do_op_notify( OSDOp& osd_op, const ObjectState& os); -- 2.39.5