From: Matan Breizman Date: Wed, 22 Nov 2023 08:31:05 +0000 (+0000) Subject: crimson/osd: incremental maps groundwork X-Git-Tag: v19.3.0~273^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=42a6221e4d7f4b2882fbda6fa8eddb107adcdd11;p=ceph.git crimson/osd: incremental maps groundwork Note: * no actual users are added yet. * load_inc_map returns erroartor since we should handle inc maps reading errors (not-fatal). Signed-off-by: Matan Breizman --- diff --git a/src/crimson/osd/osd_meta.cc b/src/crimson/osd/osd_meta.cc index 06d6932bc54f..551229a4c6eb 100644 --- a/src/crimson/osd/osd_meta.cc +++ b/src/crimson/osd/osd_meta.cc @@ -12,7 +12,6 @@ #include "osd/OSDMap.h" using std::string; -using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator; void OSDMeta::create(ceph::os::Transaction& t) { @@ -25,11 +24,22 @@ void OSDMeta::store_map(ceph::os::Transaction& t, t.write(coll->get_cid(), osdmap_oid(e), 0, m.length(), m); } +void OSDMeta::store_inc_map(ceph::os::Transaction& t, + epoch_t e, const bufferlist& m) +{ + t.write(coll->get_cid(), inc_osdmap_oid(e), 0, m.length(), m); +} + void OSDMeta::remove_map(ceph::os::Transaction& t, epoch_t e) { t.remove(coll->get_cid(), osdmap_oid(e)); } +void OSDMeta::remove_inc_map(ceph::os::Transaction& t, epoch_t e) +{ + t.remove(coll->get_cid(), inc_osdmap_oid(e)); +} + seastar::future OSDMeta::load_map(epoch_t e) { return store.read(coll, @@ -41,6 +51,13 @@ seastar::future OSDMeta::load_map(epoch_t e) })); } +read_errorator::future OSDMeta::load_inc_map(epoch_t e) +{ + return store.read(coll, + osdmap_oid(e), 0, 0, + CEPH_OSD_OP_FLAG_FADVISE_WILLNEED); +} + void OSDMeta::store_superblock(ceph::os::Transaction& t, const OSDSuperblock& superblock) { @@ -122,6 +139,12 @@ ghobject_t OSDMeta::osdmap_oid(epoch_t epoch) return ghobject_t(hobject_t(sobject_t(object_t(name), 0))); } +ghobject_t OSDMeta::inc_osdmap_oid(epoch_t epoch) +{ + string name = fmt::format("inc_osdmap.{}", epoch); + return ghobject_t(hobject_t(sobject_t(object_t(name), 0))); +} + ghobject_t OSDMeta::final_pool_info_oid(int64_t pool) { string name = fmt::format("final_pool_{}", pool); diff --git a/src/crimson/osd/osd_meta.h b/src/crimson/osd/osd_meta.h index 2363671e330d..506007e397d6 100644 --- a/src/crimson/osd/osd_meta.h +++ b/src/crimson/osd/osd_meta.h @@ -19,6 +19,8 @@ namespace crimson::os { class FuturizedStore; } +using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator; + /// metadata shared across PGs, or put in another way, /// metadata not specific to certain PGs. class OSDMeta { @@ -40,8 +42,13 @@ public: void store_map(ceph::os::Transaction& t, epoch_t e, const bufferlist& m); + void store_inc_map(ceph::os::Transaction& t, + epoch_t e, const bufferlist& m); void remove_map(ceph::os::Transaction& t, epoch_t e); + void remove_inc_map(ceph::os::Transaction& t, epoch_t e); + seastar::future load_map(epoch_t e); + read_errorator::future load_inc_map(epoch_t e); void store_superblock(ceph::os::Transaction& t, const OSDSuperblock& sb); @@ -60,6 +67,7 @@ public: std::map&); private: static ghobject_t osdmap_oid(epoch_t epoch); + static ghobject_t inc_osdmap_oid(epoch_t epoch); static ghobject_t final_pool_info_oid(int64_t pool); static ghobject_t superblock_oid(); }; diff --git a/src/crimson/osd/shard_services.cc b/src/crimson/osd/shard_services.cc index 5e50e740fd3e..9d9efb8945a6 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -379,6 +379,14 @@ void OSDSingletonState::store_map_bl( map_bl_cache.insert(e, std::move(bl)); } +void OSDSingletonState::store_inc_map_bl( + ceph::os::Transaction& t, + epoch_t e, bufferlist&& bl) +{ + meta_coll->store_inc_map(t, e, bl); + inc_map_bl_cache.insert(e, std::move(bl)); +} + seastar::future OSDSingletonState::load_map_bl( epoch_t e) { @@ -394,6 +402,21 @@ seastar::future OSDSingletonState::load_map_bl( } } +read_errorator::future OSDSingletonState::load_inc_map_bl( + epoch_t e) +{ + if (std::optional found = inc_map_bl_cache.find(e); found) { + logger().debug("{} inc map.{} found in cache", __func__, e); + return read_errorator::make_ready_future(*found); + } else { + logger().debug("{} loading inc map.{} from disk", __func__, e); + return meta_coll->load_inc_map(e).safe_then([this, e](auto&& bl) { + inc_map_bl_cache.insert(e, bl); + return seastar::make_ready_future(std::move(bl)); + }, read_errorator::pass_further{}); + } +} + seastar::future> OSDSingletonState::load_map_bls( epoch_t first, epoch_t last) diff --git a/src/crimson/osd/shard_services.h b/src/crimson/osd/shard_services.h index 37993a4f6795..62f0080e2a7b 100644 --- a/src/crimson/osd/shard_services.h +++ b/src/crimson/osd/shard_services.h @@ -218,6 +218,7 @@ class OSDSingletonState : public md_config_obs_t { friend class OSD; using cached_map_t = OSDMapService::cached_map_t; using local_cached_map_t = OSDMapService::local_cached_map_t; + using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator; public: OSDSingletonState( @@ -236,6 +237,7 @@ private: SharedLRU osdmaps; SimpleLRU map_bl_cache; + SimpleLRU inc_map_bl_cache; cached_map_t osdmap; cached_map_t &get_osdmap() { return osdmap; } @@ -319,9 +321,12 @@ private: seastar::future> load_map(epoch_t e); seastar::future load_map_bl(epoch_t e); seastar::future> + read_errorator::future load_inc_map_bl(epoch_t e); load_map_bls(epoch_t first, epoch_t last); void store_map_bl(ceph::os::Transaction& t, epoch_t e, bufferlist&& bl); + void store_inc_map_bl(ceph::os::Transaction& t, + epoch_t e, bufferlist&& bl); seastar::future<> store_maps(ceph::os::Transaction& t, epoch_t start, Ref m); void trim_maps(ceph::os::Transaction& t, OSDSuperblock& superblock);