From: Kefu Chai Date: Tue, 25 Apr 2017 14:24:46 +0000 (+0800) Subject: osd/PGMonitor: always update pgmap with latest osdmap X-Git-Tag: v12.0.3~248^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F14777%2Fhead;p=ceph.git osd/PGMonitor: always update pgmap with latest osdmap without this change, we always update the pgmap with the latest osdmap in PGMonitor::check_osd_map(), but assign pending_inc.osdmap_epoch with the epoch passed to PGMonitor::check_osd_map(), even if the osdmap could be be much newer than "epoch". for example, we could end up with an MOSDPGCreate with an ancient epoch, but carrying some creating pgs whose pools do not exist in osdmap of that ancient epoch yet. this happens when RetryCheckOSDMap is involved. Fixes: http://tracker.ceph.com/issues/19398 Signed-off-by: Kefu Chai --- diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index b972ade7f07..f7464c3458e 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -866,6 +866,8 @@ void PGMonitor::check_osd_map(epoch_t epoch) set need_check_down_pg_osds; // apply latest map(s) + const OSDMap& osdmap = mon->osdmon()->osdmap; + epoch = std::max(epoch, osdmap.get_epoch()); for (epoch_t e = pg_map.last_osdmap_epoch+1; e <= epoch; e++) { @@ -881,7 +883,6 @@ void PGMonitor::check_osd_map(epoch_t epoch) &last_osd_report, &pg_map, &pending_inc); } - const OSDMap& osdmap = mon->osdmon()->osdmap; assert(pg_map.last_osdmap_epoch < epoch); pending_inc.osdmap_epoch = epoch; PGMapUpdater::update_creating_pgs(osdmap, pg_map, &pending_inc);