From 05bd3f712fabbeb007efe7f2e9f94fdd01edc12f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 23 Nov 2009 15:55:35 -0800 Subject: [PATCH] mds: don't renew caps (or touch_session) on closed session Also assert that we're on the state list before touching. --- src/mds/Server.cc | 16 ++++++++++------ src/mds/SessionMap.h | 8 ++++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 430b71d2dd7e0..688853e9ed5ea 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -202,13 +202,17 @@ void Server::handle_client_session(MClientSession *m) break; case CEPH_SESSION_REQUEST_RENEWCAPS: - mds->sessionmap.touch_session(session); - if (session->is_stale()) { - mds->sessionmap.set_state(session, Session::STATE_OPEN); - mds->locker->resume_stale_caps(session); + if (session->is_closed()) { + dout(10) << "ignoring renewcaps on clsoed session" << dendl; + } else { + mds->sessionmap.touch_session(session); + if (session->is_stale()) { + mds->sessionmap.set_state(session, Session::STATE_OPEN); + mds->locker->resume_stale_caps(session); + } + mds->messenger->send_message(new MClientSession(CEPH_SESSION_RENEWCAPS, m->get_seq()), + session->inst); } - mds->messenger->send_message(new MClientSession(CEPH_SESSION_RENEWCAPS, m->get_seq()), - session->inst); break; case CEPH_SESSION_REQUEST_CLOSE: diff --git a/src/mds/SessionMap.h b/src/mds/SessionMap.h index 06d95893dc24a..d383abffb89f3 100644 --- a/src/mds/SessionMap.h +++ b/src/mds/SessionMap.h @@ -224,8 +224,12 @@ public: s->put(); } void touch_session(Session *session) { - by_state[session->state].push_back(&session->session_list_item); - session->last_cap_renew = g_clock.now(); + if (session->session_list_item.is_on_xlist()) { + by_state[session->state].push_back(&session->session_list_item); + session->last_cap_renew = g_clock.now(); + } else { + assert(0); // hrm, should happen? + } } Session *get_oldest_session(int state) { if (by_state[state].empty()) return 0; -- 2.39.5