]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't renew caps (or touch_session) on closed session
authorSage Weil <sage@newdream.net>
Mon, 23 Nov 2009 23:55:35 +0000 (15:55 -0800)
committerSage Weil <sage@newdream.net>
Wed, 25 Nov 2009 03:02:06 +0000 (19:02 -0800)
Also assert that we're on the state list before touching.

src/mds/Server.cc
src/mds/SessionMap.h

index 430b71d2dd7e07033783297a2c0bf8ba281a601f..688853e9ed5eab3ac57812953c0ce41e5bdb0c1e 100644 (file)
@@ -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:
index 06d95893dc24ac9813e718f8461c03f9c8264922..d383abffb89f31ec1c59e2ebb062d3e67b7de1a9 100644 (file)
@@ -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;