]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: kick waiters for an mds session to open on mds recovery
authorSage Weil <sage@inktank.com>
Wed, 7 Nov 2012 12:40:55 +0000 (04:40 -0800)
committerSage Weil <sage@inktank.com>
Wed, 7 Nov 2012 12:42:01 +0000 (04:42 -0800)
We already kicked waiters for request, but we need to kick waiters on open
too (e.g., a client trying to mount).

Signed-off-by: Sage Weil <sage@inktank.com>
src/client/Client.cc

index 48dfc50b7c85338dcc0bf3ec8f08ee018cc130ed..08841d129cfc971cf51738918a362c3f3ae2c187 100644 (file)
@@ -1098,6 +1098,9 @@ int Client::make_request(MetaRequest *request,
        ldout(cct, 10) << "waiting for session to mds." << mds << " to open" << dendl;
        cond.Wait(client_lock);
       }
+
+      if (mds_sessions.count(mds) == 0)
+       continue;
     }
 
     // send request.
@@ -1632,6 +1635,20 @@ void Client::handle_mds_map(MMDSMap* m)
   ls.swap(waiting_for_mdsmap);
   signal_cond_list(ls);
 
+  map<int,list<Cond*> >::iterator p = waiting_for_session.begin();
+  while (p != waiting_for_session.end()) {
+    int oldstate = oldmap->get_state(p->first);
+    int newstate = mdsmap->get_state(p->first);
+    if (newstate >= MDSMap::STATE_ACTIVE &&
+       oldstate < MDSMap::STATE_ACTIVE) {
+      ldout(cct, 20) << "kick_opening_mds_session mds." << p->first << dendl;
+      signal_cond_list(p->second);
+      waiting_for_session.erase(p++);
+    } else {
+      p++;
+    }
+  }
+
   delete oldmap;
   m->put();