From 6435c6c278b173ceebea4726ff6291d389ddf6a0 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 13 Aug 2019 14:59:51 +0200 Subject: [PATCH] crimson/osd: dissect pg listing implementation from OpsExecuter. Additionally improve const-correctness for PGBackend. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/ops_executer.cc | 44 ++++++++++++++++++++++++--------- src/crimson/osd/ops_executer.h | 14 +++++++---- src/crimson/osd/pg.h | 3 +++ 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 0ddfbd550db..56065d38b1b 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -161,7 +161,7 @@ static inline std::unique_ptr get_pgls_filter( static seastar::future pgls_filter( const PGLSFilter& filter, - PGBackend& backend, + const PGBackend& backend, const hobject_t& sobj) { if (const auto xattr = filter.get_xattr(); !xattr.empty()) { @@ -190,7 +190,7 @@ static seastar::future pgls_filter( static seastar::future do_pgnls_common( const hobject_t& pg_start, const hobject_t& pg_end, - PGBackend& backend, + const PGBackend& backend, const hobject_t& lower_bound, const std::string& nspace, const uint64_t limit, @@ -268,7 +268,10 @@ static seastar::future do_pgnls_common( }); } -seastar::future<> OpsExecuter::do_pgnls(OSDOp& osd_op) +static seastar::future<> do_pgnls( + const PG& pg, + const std::string& nspace, + OSDOp& osd_op) { hobject_t lower_bound; try { @@ -279,14 +282,23 @@ seastar::future<> OpsExecuter::do_pgnls(OSDOp& osd_op) const auto pg_start = pg.get_pgid().pgid.get_hobj_start(); const auto pg_end = \ pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num()); - return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(), osd_op.op.pgls.count, nullptr /* no filter */) + return do_pgnls_common(pg_start, + pg_end, + pg.get_backend(), + lower_bound, + nspace, + osd_op.op.pgls.count, + nullptr /* no filter */) .then([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now(); }); } -seastar::future<> OpsExecuter::do_pgnls_filtered(OSDOp& osd_op) +static seastar::future<> do_pgnls_filtered( + const PG& pg, + const std::string& nspace, + OSDOp& osd_op) { std::string cname, mname, type; auto bp = osd_op.indata.cbegin(); @@ -311,12 +323,16 @@ seastar::future<> OpsExecuter::do_pgnls_filtered(OSDOp& osd_op) __func__, cname, mname, type, lower_bound, static_cast(filter.get())); return seastar::do_with(std::move(filter), - [this, &osd_op, lower_bound=std::move(lower_bound)](auto&& filter) { + [&, lower_bound=std::move(lower_bound)](auto&& filter) { const auto pg_start = pg.get_pgid().pgid.get_hobj_start(); - const auto pg_end = \ - pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num()); - return do_pgnls_common(pg_start, pg_end, backend, lower_bound, os->oi.soid.get_namespace(), - osd_op.op.pgls.count, filter.get()) + const auto pg_end = pg.get_pgid().pgid.get_hobj_end(pg.get_pool().info.get_pg_num()); + return do_pgnls_common(pg_start, + pg_end, + pg.get_backend(), + lower_bound, + nspace, + osd_op.op.pgls.count, + filter.get()) .then([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now(); @@ -367,9 +383,13 @@ OpsExecuter::do_osd_op(OSDOp& osd_op) return backend.setxattr(os, osd_op, txn); }); case CEPH_OSD_OP_PGNLS_FILTER: - return do_pgnls_filtered(osd_op); + return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) { + return do_pgnls_filtered(pg, nspace, osd_op); + }); case CEPH_OSD_OP_PGNLS: - return do_pgnls(osd_op); + return do_pg_op([&osd_op] (const auto& pg, const auto& nspace) { + return do_pgnls(pg, nspace, osd_op); + }); case CEPH_OSD_OP_DELETE: return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) { return backend.remove(os, txn); diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index d8c66dc7900..3e8564570df 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -39,22 +39,19 @@ class OpsExecuter { size_t num_read = 0; ///< count read ops size_t num_write = 0; ///< count update ops - seastar::future<> do_pgnls(OSDOp& osd_op); - seastar::future<> do_pgnls_filtered(OSDOp& osd_op); - seastar::future<> do_op_call(class OSDOp& osd_op); template auto do_const_op(Func&& f) { // TODO: pass backend as read-only - return std::forward(f)(backend, const_cast(*os)); + return std::forward(f)(backend, std::as_const(*os)); } template auto do_read_op(Func&& f) { ++num_read; // TODO: pass backend as read-only - return std::forward(f)(backend, const_cast(*os)); + return do_const_op(std::forward(f)); } template @@ -63,6 +60,13 @@ class OpsExecuter { return std::forward(f)(backend, *os, txn); } + // PG operations are being provided with pg instead of os. + template + auto do_pg_op(Func&& f) { + return std::forward(f)(std::as_const(pg), + std::as_const(os->oi.soid.get_namespace())); + } + public: OpsExecuter(PGBackend::cached_os_t os, PG& pg) : os(std::move(os)), pg(pg), backend(pg.get_backend()) { diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index dbf9df18cbb..542cb7912a3 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -84,6 +84,9 @@ public: PGBackend& get_backend() { return *backend; } + const PGBackend& get_backend() const { + return *backend; + } // EpochSource epoch_t get_osdmap_epoch() const final { -- 2.47.3