summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-11-20 16:20:02 -0800
committerSage Weil <sage@newdream.net>2009-11-20 16:20:02 -0800
commit83f560cc323a40bd473b7dba37798ad51136be71 (patch)
treea837bcafce975c66624e3057429a9bba77b950f1
parentbf3cd2803cd449a968527e2f5932d1309f38f739 (diff)
downloadceph-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.cc12
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();