From d7ba11550cf9f39152ab37f50cf22849317b12e1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 18 Feb 2019 15:30:32 -0600 Subject: [PATCH] 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 --- src/osd/OSD.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 9fb35ff88132..47745b48d9d0 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; -- 2.47.3