diff options
author | Sage Weil <sage@newdream.net> | 2009-11-23 15:55:35 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-11-24 19:02:06 -0800 |
commit | 05bd3f712fabbeb007efe7f2e9f94fdd01edc12f (patch) | |
tree | 9263447c0f60a48ac1a6ef81177c32c83d9d3db6 | |
parent | e66778b7d63e79c554b42194a34aed1142fb1e95 (diff) | |
download | ceph-05bd3f712fabbeb007efe7f2e9f94fdd01edc12f.tar.gz |
mds: don't renew caps (or touch_session) on closed session
Also assert that we're on the state list before touching.
-rw-r--r-- | src/mds/Server.cc | 16 | ||||
-rw-r--r-- | 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 430b71d2dd7..688853e9ed5 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 06d95893dc2..d383abffb89 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; |