]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: clear sessions_waiting_on_map on shutdown 2081/head
authorSage Weil <sage@inktank.com>
Mon, 7 Jul 2014 23:06:49 +0000 (16:06 -0700)
committerSage Weil <sage@inktank.com>
Mon, 7 Jul 2014 23:17:47 +0000 (16:17 -0700)
Wake up these ops and drop the Session refs on shutdown.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/OSD.cc
src/osd/OSD.h

index 0087e9b57a9f7c49a6852cbe68955a4432329ad4..597678722e6aaf1fdce28899f360b1c932149d84 100644 (file)
@@ -1626,7 +1626,9 @@ int OSD::shutdown()
   cct->_conf->set_val("debug_filestore", "100");
   cct->_conf->set_val("debug_ms", "100");
   cct->_conf->apply_changes(NULL);
-  
+
+  dispatch_sessions_waiting_on_map();
+
   // Shutdown PGs
   {
     RWLock::RLocker l(pg_map_lock);
@@ -4981,6 +4983,10 @@ void OSD::dispatch_session_waiting(Session *session, OSDMapRef osdmap)
 
 void OSD::ms_fast_dispatch(Message *m)
 {
+  if (service.is_stopping()) {
+    m->put();
+    return;
+  }
   OpRequestRef op = op_tracker.create_request<OpRequest>(m);
   OSDMapRef nextmap = service.get_nextmap_reserved();
   Session *session = static_cast<Session*>(m->get_connection()->get_priv());
@@ -6249,16 +6255,7 @@ void OSD::consume_map()
   service.await_reserved_maps();
   service.publish_map(osdmap);
 
-  set<Session*> sessions_to_check;
-  get_sessions_waiting_for_map(&sessions_to_check);
-  for (set<Session*>::iterator i = sessions_to_check.begin();
-       i != sessions_to_check.end();
-       sessions_to_check.erase(i++)) {
-    (*i)->session_dispatch_lock.Lock();
-    dispatch_session_waiting(*i, osdmap);
-    (*i)->session_dispatch_lock.Unlock();
-    (*i)->put();
-  }
+  dispatch_sessions_waiting_on_map();
 
   // remove any PGs which we no longer host from the waiting_for_pg list
   set<spg_t> pgs_to_delete;
index 6a5b5fb718e88c8ccb168a1c9486098d68248b07..1926b42d74a98e40eb9c3980bc912153c6be1ce0 100644 (file)
@@ -1179,6 +1179,18 @@ public:
       session_waiting_for_map.erase(i);
     }
   }
+  void dispatch_sessions_waiting_on_map() {
+    set<Session*> sessions_to_check;
+    get_sessions_waiting_for_map(&sessions_to_check);
+    for (set<Session*>::iterator i = sessions_to_check.begin();
+        i != sessions_to_check.end();
+        sessions_to_check.erase(i++)) {
+      (*i)->session_dispatch_lock.Lock();
+      dispatch_session_waiting(*i, osdmap);
+      (*i)->session_dispatch_lock.Unlock();
+      (*i)->put();
+    }
+  }
 
 private:
   /**