]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix client purge crash
authorSage Weil <sage@newdream.net>
Sat, 21 Nov 2009 00:20:02 +0000 (16:20 -0800)
committerSage Weil <sage@newdream.net>
Sat, 21 Nov 2009 00:20:02 +0000 (16:20 -0800)
set_state moves the session to the per-session lists; do
this _before_ remove_session (which removes the session
entirely).  Otherwise we fail an assert when deleting
the session:

mds/SessionMap.h: In function 'virtual Session::~Session()':
mds/SessionMap.h:141: FAILED assert(!session_list_item.is_on_xlist())
 1: ./cmds(_Z18__ceph_assert_failPKcS0_iS0_+0x36) [0x97fc87]
 2: ./cmds(_ZN7SessionD0Ev+0x47) [0x73d817]
 3: ./cmds(_ZN16RefCountedObject3putEv+0xdb) [0x712c3b]
 4: ./cmds(_ZN10ConnectionD0Ev+0x3a) [0x713f88]
 5: ./cmds(_ZN10Connection3putEv+0x3d) [0x71294b]
 6: ./cmds(_ZN15SimpleMessenger4PipeD1Ev+0x7f) [0x7130e1]
 7: ./cmds(_ZN15SimpleMessenger6reaperEv+0x228) [0x7048ba]
 8: ./cmds(_ZN15SimpleMessenger4waitEv+0x28) [0x7059dc]
 9: ./cmds(main+0x305) [0x6f9345]
 10: /lib/libc.so.6(__libc_start_main+0xe6) [0x7f2091e715c6]
 11: ./cmds [0x6f8e39]
 NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.

src/mds/Server.cc

index a8faa79271ec685c6e2ab2b21c4b565749ef3334..d08f15fccff4c60e4e7e50042a9e80a6bd2ba75d 100644 (file)
@@ -287,8 +287,8 @@ void Server::_session_logged(Session *session, bool open, version_t pv, interval
       mds->messenger->send_message(new MClientSession(CEPH_SESSION_CLOSE), session->inst);
     else if (session->is_stale_closing())
       mds->messenger->mark_down(session->inst.addr); // kill connection
-    mds->sessionmap.remove_session(session);
     mds->sessionmap.set_state(session, Session::STATE_CLOSED);
+    mds->sessionmap.remove_session(session);
 
     session->clear();
   } else {
@@ -399,7 +399,6 @@ void Server::find_idle_sessions()
     Session *session = mds->sessionmap.get_oldest_session(Session::STATE_STALE);
     if (!session) break;
     assert(session->is_stale());
-    dout(20) << "oldest stale session is " << session->inst << dendl;
     if (session->last_cap_renew >= cutoff) {
       dout(20) << "oldest stale session is " << session->inst << " and sufficiently new (" 
               << session->last_cap_renew << ")" << dendl;
@@ -589,15 +588,6 @@ void Server::reconnect_tick()
         p++) {
       Session *session = mds->sessionmap.get_session(entity_name_t::CLIENT(p->v));
       dout(1) << "reconnect gave up on " << session->inst << dendl;
-
-      /* no, we need to respect g_conf.mds_session_autoclose
-      // since we are reconnecting, cheat a bit and don't project anything.
-      mds->sessionmap.projected++;
-      mds->sessionmap.version++;
-      mdlog->submit_entry(new ESession(session->inst, false, mds->sessionmap.version));
-      mds->messenger->mark_down(session->inst.addr);
-      */
-
       failed_reconnects++;
     }
     client_reconnect_gather.clear();