From c5c452365d49cd28e555725e9b017fb01774344e Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Fri, 30 Jun 2023 12:33:35 +0800 Subject: [PATCH] crimson/osd: put snapmapper's key-value pairs into dedicated objs Otherwise, PG::read_log_and_missing() will meet those key-values and won't know what to do with them. This is modeling what the classic osd is doing Signed-off-by: Xuehan Xu (cherry picked from commit e56e90857d6849c6045cc3edef896baffe70b6af) --- src/crimson/osd/pg.cc | 14 ++++++++++++-- src/crimson/osd/pg.h | 16 ++++++++++++++-- src/crimson/osd/shard_services.cc | 21 +++++++++++---------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 54c8101cd115b..f5541da96194d 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -136,7 +136,7 @@ PG::PG( osdriver( &shard_services.get_store(), coll_ref, - pgid.make_pgmeta_oid()), + make_snapmapper_oid()), snap_mapper( this->shard_services.get_cct(), &osdriver, @@ -596,7 +596,7 @@ void PG::schedule_renew_lease(epoch_t last_peering_reset, ceph::timespan delay) } -void PG::init( +seastar::future<> PG::init( int role, const vector& newup, int new_up_primary, const vector& newacting, int new_acting_primary, @@ -607,6 +607,16 @@ void PG::init( peering_state.init( role, newup, new_up_primary, newacting, new_acting_primary, history, pi, t); + assert(coll_ref); + return shard_services.get_store().exists( + get_collection_ref(), make_snapmapper_oid() + ).safe_then([&t, this](bool existed) { + if (!existed) { + t.touch(coll_ref->get_cid(), make_snapmapper_oid()); + } + }, + ::crimson::ct_error::assert_all{"unexpected eio"} + ); } seastar::future<> PG::read_state(crimson::os::FuturizedStore::Shard* store) diff --git a/src/crimson/osd/pg.h b/src/crimson/osd/pg.h index e103d3bb5eec1..0552d49f2ad49 100644 --- a/src/crimson/osd/pg.h +++ b/src/crimson/osd/pg.h @@ -41,6 +41,8 @@ #include "crimson/osd/object_context_loader.h" #include "crimson/osd/scrub/pg_scrubber.h" +#define SNAPMAPPER_OID "snapmapper" + class MQuery; class OSDMap; class PGBackend; @@ -471,7 +473,7 @@ public: } /// initialize created PG - void init( + seastar::future<> init( int role, const std::vector& up, int up_primary, @@ -647,12 +649,22 @@ public: private: OSDriver osdriver; SnapMapper snap_mapper; - + ghobject_t make_snapmapper_oid() const { + return ghobject_t(hobject_t( + sobject_t( + object_t(SNAPMAPPER_OID), + 0), + std::string(), + pgid.ps(), + pgid.pool(), + std::string())); + } public: // PeeringListener void publish_stats_to_osd() final; void clear_publish_stats() final; pg_stat_t get_stats() const; + private: std::optional pg_stats; diff --git a/src/crimson/osd/shard_services.cc b/src/crimson/osd/shard_services.cc index 604c045eb9b86..d34ee1977c60d 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -671,17 +671,17 @@ seastar::future> ShardServices::handle_pg_create_info( pg_shard_t(local_state.whoami, info->pgid.shard), acting); - PeeringCtx rctx; + std::unique_ptr rctx = std::make_unique(); create_pg_collection( - rctx.transaction, + rctx->transaction, info->pgid, info->pgid.get_split_bits(pp->get_pg_num())); init_pg_ondisk( - rctx.transaction, + rctx->transaction, info->pgid, pp); - pg->init( + return pg->init( role, up, up_primary, @@ -689,12 +689,13 @@ seastar::future> ShardServices::handle_pg_create_info( acting_primary, info->history, info->past_intervals, - rctx.transaction); - - return start_operation( - pg, *this, get_map()->get_epoch(), std::move(rctx), true - ).second.then([pg=pg] { - return seastar::make_ready_future>(pg); + rctx->transaction + ).then([this, pg=pg, rctx=std::move(rctx)] { + return start_operation( + pg, *this, get_map()->get_epoch(), std::move(*rctx), true + ).second.then([pg=pg] { + return seastar::make_ready_future>(pg); + }); }); }); }); -- 2.39.5