]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix session close races
authorSage Weil <sage@newdream.net>
Thu, 8 Oct 2009 18:45:27 +0000 (11:45 -0700)
committerSage Weil <sage@newdream.net>
Thu, 8 Oct 2009 18:45:27 +0000 (11:45 -0700)
Make sure we don't use a connection's session if it is closed.

Remove session from connection on reset.

src/mon/Monitor.cc
src/mon/Session.h

index d2ca9abb8987b3c673c52ed7f77537475b9c96f7..b736c761e96994193090bdc4e6635a4c2bb4f45c 100644 (file)
@@ -473,6 +473,10 @@ void Monitor::handle_subscribe(MMonSubscribe *m)
   bool reply = false;
 
   Session *s = (Session *)m->get_connection()->get_priv();
+  if (s && s->closed) {
+    s->put();
+    s = NULL;
+  }
   if (!s) {
     s = session_map.new_session(m->get_source_inst());
     m->get_connection()->set_priv(s->get());
@@ -520,6 +524,9 @@ bool Monitor::ms_handle_reset(Connection *con, const entity_addr_t& peer)
   dout(10) << "reset/close on session " << s->inst << dendl;
   session_map.remove_session(s);
   s->put();
+
+  // remove from connection, too.
+  con->set_priv(NULL);
   return true;
 }
 
index 60e2834a442ff9d0160ff96fe4ba74c067f3e9cb..a42d7b37561a87af0ce6767abe2fa04dbbd338c2 100644 (file)
@@ -58,6 +58,7 @@ struct SessionMap {
     s->sub_map.clear();
     s->item.remove_myself();
     s->put();
+    s->closed = true;
   }
 
   Session *new_session(entity_inst_t i) {