From 32408e9094871a1e3307932b32ad1442cdab5998 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 21 Feb 2024 14:37:13 +0800 Subject: [PATCH] crimson/osd/pg: filter out snapmapper objects when doing pgls/pgnls Signed-off-by: Xuehan Xu --- src/crimson/osd/ops_executer.cc | 37 ++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index f03827b03d6b45..44882fc793dd38 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -1173,7 +1173,8 @@ static PG::interruptible_future do_pgnls_common( const hobject_t& lower_bound, const std::string& nspace, const uint64_t limit, - const PGLSFilter* const filter) + const PGLSFilter* const filter, + const PG &pg) { if (!(lower_bound.is_min() || lower_bound.is_max() || @@ -1183,9 +1184,16 @@ static PG::interruptible_future do_pgnls_common( } return backend.list_objects(lower_bound, limit).then_interruptible( - [&backend, filter, nspace](auto&& ret) + [&backend, filter, nspace, &pg](auto&& ret) -> PG::interruptible_future, hobject_t>> { auto& [objects, next] = ret; + auto is_snapmapper = [&pg](const hobject_t &obj) { + if (obj == pg.make_snapmapper_oid().hobj) { + return false; + } else { + return true; + } + }; auto in_my_namespace = [&nspace](const hobject_t& obj) { using crimson::common::local_conf; if (obj.get_namespace() == local_conf()->osd_hit_set_namespace) { @@ -1213,7 +1221,8 @@ static PG::interruptible_future do_pgnls_common( } }; - auto range = objects | boost::adaptors::filtered(in_my_namespace) + auto range = objects | boost::adaptors::filtered(is_snapmapper) + | boost::adaptors::filtered(in_my_namespace) | boost::adaptors::transformed(to_pglsed); logger().debug("do_pgnls_common: finishing the 1st stage of pgls"); return seastar::when_all_succeed(std::begin(range), @@ -1270,7 +1279,8 @@ static PG::interruptible_future<> do_pgnls( lower_bound, nspace, osd_op.op.pgls.count, - nullptr /* no filter */) + nullptr /* no filter */, + pg) .then_interruptible([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now(); @@ -1314,7 +1324,8 @@ static PG::interruptible_future<> do_pgnls_filtered( lower_bound, nspace, osd_op.op.pgls.count, - filter.get()) + filter.get(), + pg) .then_interruptible([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now(); @@ -1329,7 +1340,8 @@ static PG::interruptible_future do_pgls_common( const hobject_t& lower_bound, const std::string& nspace, const uint64_t limit, - const PGLSFilter* const filter) + const PGLSFilter* const filter, + const PG &pg) { if (!(lower_bound.is_min() || lower_bound.is_max() || @@ -1340,12 +1352,15 @@ static PG::interruptible_future do_pgls_common( using entries_t = decltype(pg_ls_response_t::entries); return backend.list_objects(lower_bound, limit).then_interruptible( - [&backend, filter, nspace](auto&& ret) { + [&backend, filter, nspace, &pg](auto&& ret) { auto& [objects, next] = ret; return PG::interruptor::when_all( PG::interruptor::map_reduce(std::move(objects), - [&backend, filter, nspace](const hobject_t& obj) + [&backend, filter, nspace, &pg](const hobject_t& obj) -> PG::interruptible_future{ + if (obj == pg.make_snapmapper_oid().hobj) { + return seastar::make_ready_future(); + } if (obj.get_namespace() == nspace) { if (filter) { return pgls_filter(*filter, backend, obj); @@ -1399,7 +1414,8 @@ static PG::interruptible_future<> do_pgls( lower_bound, nspace, osd_op.op.pgls.count, - nullptr /* no filter */) + nullptr /* no filter */, + pg) .then_interruptible([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now(); @@ -1443,7 +1459,8 @@ static PG::interruptible_future<> do_pgls_filtered( lower_bound, nspace, osd_op.op.pgls.count, - filter.get()) + filter.get(), + pg) .then_interruptible([&osd_op](bufferlist bl) { osd_op.outdata = std::move(bl); return seastar::now();