diff options
author | Sage Weil <sage@newdream.net> | 2009-11-20 16:20:02 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-11-20 16:20:02 -0800 |
commit | 83f560cc323a40bd473b7dba37798ad51136be71 (patch) | |
tree | a837bcafce975c66624e3057429a9bba77b950f1 | |
parent | bf3cd2803cd449a968527e2f5932d1309f38f739 (diff) | |
download | ceph-83f560cc323a40bd473b7dba37798ad51136be71.tar.gz |
mds: fix client purge crash
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.
-rw-r--r-- | src/mds/Server.cc | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/src/mds/Server.cc b/src/mds/Server.cc index a8faa79271e..d08f15fccff 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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(); |