From: Sage Weil Date: Mon, 18 Feb 2019 21:30:32 +0000 (-0600) Subject: osd: fix pg split/merge prime during startup X-Git-Tag: v14.1.0~46^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d7ba11550cf9f39152ab37f50cf22849317b12e1;p=ceph.git osd: fix pg split/merge prime during startup The priming of split/merge targets may modify pg_slots, an unordered_map, which means our iterator may become invalid. Put PGs in a temporary set and use that instead. Fixes: http://tracker.ceph.com/issues/36304 Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 9fb35ff8813..47745b48d9d 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3101,12 +3101,17 @@ int OSD::init() service.max_oldest_map = superblock.oldest_map; for (auto& shard : shards) { + // put PGs in a temporary set because we may modify pg_slots + // unordered_map below. + set pgs; for (auto& i : shard->pg_slots) { PGRef pg = i.second->pg; if (!pg) { continue; } - + pgs.insert(pg); + } + for (auto pg : pgs) { pg->lock(); set> new_children; set> merge_pgs;