From 6554d462059b68ab983c0c8355c465e98ca45440 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) --- src/mon/OSDMonitor.cc | 21 +++++++++++++++++++-- src/mon/OSDMonitor.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 68bcc97639ebe..f0555813bd877 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2247,7 +2247,8 @@ bool OSDMonitor::prepare_alive(MonOpRequestRef op) 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(op, new C_ReplyMap(this, op, m->version)); return true; } @@ -2335,6 +2336,19 @@ bool OSDMonitor::preprocess_pgtemp(MonOpRequestRef op) return true; } +void OSDMonitor::update_up_thru(int from, epoch_t up_thru) +{ + epoch_t old_up_thru = osdmap.get_up_thru(from); + auto 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(MonOpRequestRef op) { op->mark_osdmon_event(__func__); @@ -2362,7 +2376,10 @@ bool OSDMonitor::prepare_pgtemp(MonOpRequestRef op) 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(op, new C_ReplyMap(this, op, m->map_epoch)); return true; } diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 9d4d33d239bf8..4fb1ba40838eb 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -257,6 +257,7 @@ private: bool prepare_boot(MonOpRequestRef op); void _booted(MonOpRequestRef op, bool logit); + void update_up_thru(int from, epoch_t up_thru); bool preprocess_alive(MonOpRequestRef op); bool prepare_alive(MonOpRequestRef op); void _reply_map(MonOpRequestRef op, epoch_t e); -- 2.39.5