From 4c780bd7fc6e8a98334ddd049a4969d88a9de49f Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 7 Jun 2016 17:15:05 -0700 Subject: [PATCH] OSDMonitor::prepare_pgtemp: only update up_thru if newer Fixes: http://tracker.ceph.com/issues/16185 Signed-off-by: Samuel Just (cherry picked from commit 5f2bd7b6b28aad96d68444b22c04b8b24564616b) Conflicts: src/mon/OSDMonitor.cc (master uses C++11 "auto" for new_up_thru iterator, replace with explicit type) src/mon/OSDMonitor.h (trivial resolution) --- src/mon/OSDMonitor.cc | 20 ++++++++++++++++++-- src/mon/OSDMonitor.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index a006dbde648ff..ccc62a18224e5 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1974,7 +1974,7 @@ bool OSDMonitor::prepare_alive(MOSDAlive *m) dout(7) << "prepare_alive want up_thru " << m->want << " have " << m->version << " from " << m->get_orig_source_inst() << dendl; - pending_inc.new_up_thru[from] = m->version; // set to the latest map the OSD has + update_up_thru(from, m->version); // set to the latest map the OSD has wait_for_finished_proposal(new C_ReplyMap(this, m, m->version)); return true; } @@ -2076,6 +2076,19 @@ bool OSDMonitor::preprocess_pgtemp(MOSDPGTemp *m) return true; } +void OSDMonitor::update_up_thru(int from, epoch_t up_thru) +{ + epoch_t old_up_thru = osdmap.get_up_thru(from); + map::iterator ut = pending_inc.new_up_thru.find(from); + if (ut != pending_inc.new_up_thru.end()) { + old_up_thru = ut->second; + } + if (up_thru > old_up_thru) { + // set up_thru too, so the osd doesn't have to ask again + pending_inc.new_up_thru[from] = up_thru; + } +} + bool OSDMonitor::prepare_pgtemp(MOSDPGTemp *m) { int from = m->get_orig_source().num(); @@ -2101,7 +2114,10 @@ bool OSDMonitor::prepare_pgtemp(MOSDPGTemp *m) pending_inc.new_primary_temp.count(p->first)) pending_inc.new_primary_temp[p->first] = -1; } - pending_inc.new_up_thru[from] = m->map_epoch; // set up_thru too, so the osd doesn't have to ask again + + // set up_thru too, so the osd doesn't have to ask again + update_up_thru(from, m->map_epoch); + wait_for_finished_proposal(new C_ReplyMap(this, m, m->map_epoch)); return true; } diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index d8a3e1fa4575e..fe9893af46422 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -246,6 +246,7 @@ private: bool prepare_boot(class MOSDBoot *m); void _booted(MOSDBoot *m, bool logit); + void update_up_thru(int from, epoch_t up_thru); bool preprocess_alive(class MOSDAlive *m); bool prepare_alive(class MOSDAlive *m); void _reply_map(PaxosServiceMessage *m, epoch_t e); -- 2.39.5