From: Xie Xingguo Date: Sat, 15 Jun 2019 05:31:02 +0000 (+0800) Subject: Merge pull request #28487 from xiexingguo/wip-objecter-pg-mapping-cache X-Git-Tag: v15.1.0~2451 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5ae32b860f90930fe9d94438101273a122d9b4e0;p=ceph-ci.git Merge pull request #28487 from xiexingguo/wip-objecter-pg-mapping-cache osdc/Objecter: pg-mapping cache Reviewed-by: Sage Weil --- 5ae32b860f90930fe9d94438101273a122d9b4e0 diff --cc src/osdc/Objecter.h index be0bedcf602,2ebd3a5ccc0..14819edbd6a --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@@ -1246,8 -1248,64 +1246,64 @@@ private // If this is true, accumulate a set of blacklisted entities // to be drained by consume_blacklist_events. - bool blacklist_events_enabled; + bool blacklist_events_enabled = false; std::set blacklist_events; + struct pg_mapping_t { + epoch_t epoch = 0; + std::vector up; + int up_primary = -1; + std::vector acting; + int acting_primary = -1; + + pg_mapping_t() {} + pg_mapping_t(epoch_t epoch, std::vector up, int up_primary, + std::vector acting, int acting_primary) + : epoch(epoch), up(up), up_primary(up_primary), + acting(acting), acting_primary(acting_primary) {} + }; + std::shared_mutex pg_mapping_lock; + // pool -> pg mapping + std::map> pg_mappings; + + // convenient accessors + bool lookup_pg_mapping(const pg_t& pg, pg_mapping_t* pg_mapping) { + std::shared_lock l{pg_mapping_lock}; + auto it = pg_mappings.find(pg.pool()); + if (it == pg_mappings.end()) + return false; + auto& mapping_array = it->second; + if (pg.ps() >= mapping_array.size()) + return false; + if (mapping_array[pg.ps()].epoch != pg_mapping->epoch) // stale + return false; + *pg_mapping = mapping_array[pg.ps()]; + return true; + } + void update_pg_mapping(const pg_t& pg, pg_mapping_t&& pg_mapping) { + std::lock_guard l{pg_mapping_lock}; + auto& mapping_array = pg_mappings[pg.pool()]; + ceph_assert(pg.ps() < mapping_array.size()); + mapping_array[pg.ps()] = std::move(pg_mapping); + } + void prune_pg_mapping(const mempool::osdmap::map& pools) { + std::lock_guard l{pg_mapping_lock}; + for (auto& pool : pools) { + auto& mapping_array = pg_mappings[pool.first]; + size_t pg_num = pool.second.get_pg_num(); + if (mapping_array.size() != pg_num) { + // catch both pg_num increasing & decreasing + mapping_array.resize(pg_num); + } + } + for (auto it = pg_mappings.begin(); it != pg_mappings.end(); ) { + if (!pools.count(it->first)) { + // pool is gone + pg_mappings.erase(it++); + continue; + } + it++; + } + } public: void maybe_request_map();