]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: wake up all pg waiters on activate_map; clean up wake code
authorSage Weil <sage@newdream.net>
Thu, 31 Jul 2008 17:43:40 +0000 (10:43 -0700)
committerSage Weil <sage@newdream.net>
Thu, 31 Jul 2008 18:05:57 +0000 (11:05 -0700)
src/osd/OSD.cc
src/osd/OSD.h

index a72411c84fda4e9d73eb8580827a57bf243609c7..fdb8537de3f99bcca5f4c90e1669e3d2ad14ffe0 100644 (file)
@@ -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<pg_t, list<Message*> >::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);
index 49e9e6ae2b6834c9d453e07e5e98c508913568ca..93f1235205b4048302141822412050763fa2781a 100644 (file)
@@ -289,6 +289,20 @@ private:
                          vector<int>& 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<pg_t, list<Message*> >::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;