From 3152d6518c766b08d7614b92dc2abcbb411dd0db Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Jul 2008 10:43:40 -0700 Subject: [PATCH] osd: wake up all pg waiters on activate_map; clean up wake code --- src/osd/OSD.cc | 25 +++++++------------------ src/osd/OSD.h | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a72411c84fda4..fdb8537de3f99 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -755,12 +755,7 @@ void OSD::activate_pg(pg_t pgid, epoch_t epoch) } // wake up _all_ pg waiters; raw pg -> actual pg mapping may have shifted - for (hash_map >::iterator p = waiting_for_pg.begin(); - p != waiting_for_pg.end(); - p++) - take_waiters(p->second); - waiting_for_pg.clear(); - + wake_all_pg_waiters(); // finishers? finished_lock.Lock(); @@ -1828,6 +1823,8 @@ void OSD::activate_map(ObjectStore::Transaction& t) logger->set("numpg", pg_map.size()); + wake_all_pg_waiters(); // the pg mapping may have shifted + update_heartbeat_peers(); } @@ -2056,10 +2053,8 @@ void OSD::kick_pg_split_queue() t.collection_setattr(pg->info.pgid, "info", (char*)&pg->info, sizeof(pg->info)); pg->write_log(t); - if (waiting_for_pg.count(pg->info.pgid)) { - take_waiters(waiting_for_pg[pg->info.pgid]); - waiting_for_pg.erase(pg->info.pgid); - } + wake_pg_waiters(pg->info.pgid); + pg->peer(t, query_map, &info_map); pg->update_stats(); pg->unlock(); @@ -2191,10 +2186,7 @@ void OSD::handle_pg_create(MOSDPGCreate *m) PG *pg = try_create_pg(pgid, t); if (pg) { created++; - if (waiting_for_pg.count(pgid)) { - take_waiters(waiting_for_pg[pgid]); - waiting_for_pg.erase(pgid); - } + wake_pg_waiters(pg->info.pgid); pg->peer(t, query_map, &info_map); pg->update_stats(); pg->unlock(); @@ -2340,10 +2332,7 @@ void OSD::handle_pg_notify(MOSDPGNotify *m) dout(10) << *pg << " is new" << dendl; // kick any waiters - if (waiting_for_pg.count(pgid)) { - take_waiters(waiting_for_pg[pgid]); - waiting_for_pg.erase(pgid); - } + wake_pg_waiters(pg->info.pgid); } else { // already had it. am i (still) the primary? pg = _lookup_lock_pg(pgid); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 49e9e6ae2b683..93f1235205b40 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -289,6 +289,20 @@ private: vector& last); void activate_pg(pg_t pgid, epoch_t epoch); + void wake_pg_waiters(pg_t pgid) { + if (waiting_for_pg.count(pgid)) { + take_waiters(waiting_for_pg[pgid]); + waiting_for_pg.erase(pgid); + } + } + void wake_all_pg_waiters() { + for (hash_map >::iterator p = waiting_for_pg.begin(); + p != waiting_for_pg.end(); + p++) + take_waiters(p->second); + waiting_for_pg.clear(); + } + class C_Activate : public Context { OSD *osd; pg_t pgid; -- 2.39.5