From 894eb2af5b3729dfe9f7492f9ab6d8c2042f57ae Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Sep 2015 13:27:49 -0400 Subject: [PATCH] osd: do not resend pg_temp requests Send each pg_temp request once (per mon session); no need to resend everything that is pending every time. Signed-off-by: Sage Weil --- src/osd/OSD.cc | 37 ++++++++++++++++++++++++++++++++++++- src/osd/OSD.h | 8 ++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 5b49ebd4604cb..7501542cec9ef 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -750,7 +750,40 @@ pair OSDService::get_con_osd_hb(int peer, epoch_t f void OSDService::queue_want_pg_temp(pg_t pgid, vector& want) { Mutex::Locker l(pg_temp_lock); - pg_temp_wanted[pgid] = want; + map >::iterator p = pg_temp_pending.find(pgid); + if (p == pg_temp_pending.end() || + p->second != want) { + pg_temp_wanted[pgid] = want; + } +} + +void OSDService::remove_want_pg_temp(pg_t pgid) +{ + Mutex::Locker l(pg_temp_lock); + pg_temp_wanted.erase(pgid); + pg_temp_pending.erase(pgid); +} + +void OSDService::_sent_pg_temp() +{ + for (map >::iterator p = pg_temp_wanted.begin(); + p != pg_temp_wanted.end(); + ++p) + pg_temp_pending[p->first] = p->second; + pg_temp_wanted.clear(); +} + +void OSDService::requeue_pg_temp() +{ + Mutex::Locker l(pg_temp_lock); + // wanted overrides pending. note that remove_want_pg_temp + // clears the item out of both. + unsigned old_wanted = pg_temp_wanted.size(); + unsigned old_pending = pg_temp_pending.size(); + _sent_pg_temp(); + pg_temp_wanted.swap(pg_temp_pending); + dout(10) << __func__ << " " << old_wanted << " + " << old_pending << " -> " + << pg_temp_wanted.size() << dendl; } void OSDService::send_pg_temp() @@ -762,6 +795,7 @@ void OSDService::send_pg_temp() MOSDPGTemp *m = new MOSDPGTemp(osdmap->get_epoch()); m->pg_temp = pg_temp_wanted; monc->send_mon_message(m); + _sent_pg_temp(); } @@ -4380,6 +4414,7 @@ void OSD::ms_handle_connect(Connection *con) // resend everything, it's a new session send_alive(); + service.requeue_pg_temp(); service.send_pg_temp(); requeue_failures(); send_failures(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 7ca705a85f717..35877f41588e1 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -803,11 +803,11 @@ public: // -- pg_temp -- Mutex pg_temp_lock; map > pg_temp_wanted; + map > pg_temp_pending; void queue_want_pg_temp(pg_t pgid, vector& want); - void remove_want_pg_temp(pg_t pgid) { - Mutex::Locker l(pg_temp_lock); - pg_temp_wanted.erase(pgid); - } + void remove_want_pg_temp(pg_t pgid); + void _sent_pg_temp(); + void requeue_pg_temp(); void send_pg_temp(); void queue_for_peering(PG *pg); -- 2.39.5