From 963b8d8617d4303f6f1450b8eeae5302cbfe64c8 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 28 Apr 2017 04:47:18 +0800 Subject: [PATCH] mon/OSDMonitor: do not alter the "created" epoch of a pg Fixes: http://tracker.ceph.com/issues/19787 Signed-off-by: Kefu Chai --- src/mon/OSDMonitor.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 212195ffd1fad..cf069c6b4b052 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -3192,7 +3192,7 @@ void OSDMonitor::update_creating_pgs() for (auto& pg : creating_pgs.pgs) { int acting_primary = -1; auto pgid = pg.first; - auto& created = pg.second.first; + auto mapped = pg.second.first; mapping.get(pgid, nullptr, nullptr, nullptr, &acting_primary); // check the previous creating_pgs, look for the target to whom the pg was // previously mapped @@ -3200,15 +3200,14 @@ void OSDMonitor::update_creating_pgs() const auto last_acting_primary = pgs_by_epoch.first; for (auto& pgs: pgs_by_epoch.second) { if (pgs.second.count(pgid)) { - if (last_acting_primary != acting_primary) { + if (last_acting_primary == acting_primary) { + mapped = pgs.first; + } else { dout(20) << __func__ << " " << pgid << " " << " acting_primary:" << last_acting_primary << " -> " << acting_primary << dendl; // note epoch if the target of the create message changed. - // creating_pgs is updated here instead of in - // scan_for_creating_pgs() because we don't have the updated pg - // mapping by then. - created = mapping.get_epoch(); + mapped = mapping.get_epoch(); } break; } @@ -3216,7 +3215,7 @@ void OSDMonitor::update_creating_pgs() } dout(10) << __func__ << " will instruct osd." << acting_primary << " to create " << pgid << dendl; - new_pgs_by_osd_epoch[acting_primary][created].insert(pgid); + new_pgs_by_osd_epoch[acting_primary][mapped].insert(pgid); } creating_pgs_by_osd_epoch = std::move(new_pgs_by_osd_epoch); creating_pgs_epoch = mapping.get_epoch(); -- 2.39.5