summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-11-23 15:55:35 -0800
committerSage Weil <sage@newdream.net>2009-11-24 19:02:06 -0800
commit05bd3f712fabbeb007efe7f2e9f94fdd01edc12f (patch)
tree9263447c0f60a48ac1a6ef81177c32c83d9d3db6
parente66778b7d63e79c554b42194a34aed1142fb1e95 (diff)
downloadceph-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.cc16
-rw-r--r--src/mds/SessionMap.h8
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;