]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: put forced open sessions in OPENING then OPEN
authorSage Weil <sage@newdream.net>
Tue, 2 Mar 2010 00:34:17 +0000 (16:34 -0800)
committerSage Weil <sage@newdream.net>
Tue, 2 Mar 2010 00:34:17 +0000 (16:34 -0800)
We use OPENING state to indicate sessions that are being
imported.  Fix get_or_add_open_session() to NOT set the session
state (except to STATE_NEW if new) so that the caller can do
the right thing.  Otherwise, the prepare_force_open_sessions()
can't tell if it just forced open a session (and needs it to be
OPENING) or if it was already open.  Subsequently cap migrations
weren't working if the client didn't already have a session
open.

There is still a bug: if the import aborts, we have an OPENING
session with no actual open client_session message queued.  Maybe
we should have a different state instead of OPENING... IMPORTING?

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

index e7c9c01ceda39e93e1c43aeabae4518f6f7925a9..07ea429dec0ad906eb092cd071178c047d8eae82 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -60,6 +60,8 @@ filestore
   - need an osdmap cache layer?
 
 bugs
+- mds prepare_force_open_sessions, then import aborts.. session is still OPENING but no client_session is sent...
+- multimds: untar kernel, control-z, sync
 - wget mismatch with multiple mds?
 - rm -r failure (on kernel tree)
 - dbench 1, restart mds (may take a few times), dbench will error out.
index e59caae859b76014145e40aee96427c4a8188adc..71f8ee880707c05318a655c4db78d0e1f60c4373 100644 (file)
@@ -313,8 +313,9 @@ version_t Server::prepare_force_open_sessions(map<client_t,entity_inst_t>& cm)
           << " on " << cm.size() << " clients"
           << dendl;
   for (map<client_t,entity_inst_t>::iterator p = cm.begin(); p != cm.end(); ++p) {
-    Session *session = mds->sessionmap.get_or_add_open_session(p->second);
-    if (session->is_closed() || session->is_closing())
+    Session *session = mds->sessionmap.get_or_add_session(p->second);
+    if (session->is_new() ||
+       session->is_closed() || session->is_closing())
       mds->sessionmap.set_state(session, Session::STATE_OPENING);
     mds->sessionmap.touch_session(session);
   }
index 3bc79ed581bd1fdd9e6e12719f084f32e705d432..c24a57adcb2af9e0ef11e5144becab56e26473b4 100644 (file)
@@ -181,7 +181,9 @@ void SessionMap::decode(bufferlist::iterator& p)
     while (!p.end()) {
       entity_inst_t inst;
       ::decode(inst.name, p);
-      Session *s = get_or_add_open_session(inst);
+      Session *s = get_or_add_session(inst);
+      if (s->is_new())
+       set_state(s, Session::STATE_OPEN);
       s->decode(p);
     }
 
index b3bb32da9f8cb6b732db35a13c7a90567a8b0d6b..376acd168b4423a59b29ad65db0312bf52f656cb 100644 (file)
@@ -225,14 +225,13 @@ public:
       return session_map[w];
     return 0;
   }
-  Session* get_or_add_open_session(entity_inst_t i) {
+  Session* get_or_add_session(entity_inst_t i) {
     Session *s;
     if (session_map.count(i.name))
       s = session_map[i.name];
     else
       s = session_map[i.name] = new Session;
     s->inst = i;
-    set_state(s, Session::STATE_OPEN);
     s->last_cap_renew = g_clock.now();
     return s;
   }
@@ -288,8 +287,10 @@ public:
   void open_sessions(map<client_t,entity_inst_t>& client_map) {
     for (map<client_t,entity_inst_t>::iterator p = client_map.begin(); 
         p != client_map.end(); 
-        ++p)
-      get_or_add_open_session(p->second);
+        ++p) {
+      Session *s = get_or_add_session(p->second);
+      set_state(s, Session::STATE_OPEN);
+    }
     version++;
   }
 
index 542e597903689decd645af33235b43f7686c3058..2cc571e1a303cd612eb21f45954163b537bcd652 100644 (file)
@@ -709,7 +709,9 @@ void ESession::replay(MDS *mds)
     mds->sessionmap.projected = ++mds->sessionmap.version;
     assert(mds->sessionmap.version == cmapv);
     if (open) {
-      Session *session = mds->sessionmap.get_or_add_open_session(client_inst);
+      Session *session = mds->sessionmap.get_or_add_session(client_inst);
+      if (session->is_new())
+       mds->sessionmap.set_state(session, Session::STATE_OPEN);
       dout(10) << "session " << session << " state " << session->get_state() << dendl;
     } else {
       Session *session = mds->sessionmap.get_session(client_inst.name);