From 1763a879e352c203c04860a369762b7fd9f7a8cf Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Sat, 12 Jan 2019 15:01:54 +0800 Subject: [PATCH] osd/OSDMap: potential access violation fix Seems we'll continue to access the iterator after it is invalidated by the __erase__ method. Also this is more efficient considering there could be some extreme ec-pool (e.g., 8 + 2) consumers.. Fixes: http://tracker.ceph.com/issues/37881 Signed-off-by: xie xingguo (cherry picked from commit df2e01f496dbc2b38800b1792082c540094d7b02) --- src/osd/OSDMap.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index a78fd3240efcf..5aebd951e66c2 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -4044,17 +4044,17 @@ int OSDMap::calc_pg_upmaps( map pmap; int ruleno = tmp.crush->find_rule(i.second.get_crush_rule(), - i.second.get_type(), - i.second.get_size()); + i.second.get_type(), + i.second.get_size()); tmp.crush->get_rule_weight_osd_map(ruleno, &pmap); ldout(cct,30) << __func__ << " pool " << i.first << " ruleno " << ruleno << dendl; for (auto p : pmap) { - auto adjusted_weight = tmp.get_weightf(p.first) * p.second; + auto adjusted_weight = tmp.get_weightf(p.first) * p.second; if (adjusted_weight == 0) { continue; } - osd_weight[p.first] += adjusted_weight; - osd_weight_total += adjusted_weight; + osd_weight[p.first] += adjusted_weight; + osd_weight_total += adjusted_weight; } } for (auto& i : osd_weight) { @@ -4155,6 +4155,7 @@ int OSDMap::calc_pg_upmaps( pending_inc->old_pg_upmap_items.insert(pg); ++num_changed; restart = true; + break; } } } -- 2.39.5