]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: Only connect to offload targets if the mds goes down.
authorGreg Farnum <gregf@hq.newdream.net>
Mon, 5 Oct 2009 06:32:11 +0000 (23:32 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 5 Oct 2009 22:48:09 +0000 (15:48 -0700)
src/client/Client.cc
src/client/Client.h

index cbd4ee368ef5faae6e1376cf05cd32dc050f5a10..601b609230dd877df8c5707e5bd296f9328f2075 100644 (file)
@@ -778,28 +778,25 @@ int Client::choose_target_mds(MetaRequest *req)
 }
 
 
-void Client::check_mds_sessions()
-{
-  for (map<int,MDSSession>::iterator p = mds_sessions.begin();
-       p != mds_sessions.end();
-       p++) {
-    int mds = p->first;
-    MDSSession &s = p->second;
-    if (!s.requests.empty()) {
-      const MDSMap::mds_info_t& info = mdsmap->get_mds_info(mds);
-      for (set<int>::const_iterator q = info.export_targets.begin();
-          q != info.export_targets.end();
-          q++) {
-       if (mds_sessions.count(*q) == 0 && waiting_for_session.count(mds) == 0) {
-         dout(10) << "check_mds_sessions opening mds" << mds
-                  << " export target mds" << *q << dendl;
-         messenger->send_message(new MClientSession(CEPH_SESSION_REQUEST_OPEN),
-                                 mdsmap->get_inst(*q));
-         waiting_for_session[*q].size();
-       }
+void Client::connect_mds_targets(int mds)
+{
+  //this function shouldn't be called unless we lost a connection
+  assert (mds_sessions.count(mds));
+  MDSSession &s = mds_sessions[mds];
+  if (!s.requests.empty()) {
+    const MDSMap::mds_info_t& info = mdsmap->get_mds_info(mds);
+    for (set<int>::const_iterator q = info.export_targets.begin();
+        q != info.export_targets.end();
+        q++) {
+      if (mds_sessions.count(*q) == 0 && waiting_for_session.count(mds) == 0) {
+       dout(10) << "check_mds_sessions opening mds" << mds
+                << " export target mds" << *q << dendl;
+       messenger->send_message(new MClientSession(CEPH_SESSION_REQUEST_OPEN),
+                               mdsmap->get_inst(*q));
+       waiting_for_session[*q].size();
       }
     }
-  }  
+  }
 }
 
 int Client::make_request(MetaRequest *request, 
@@ -896,9 +893,6 @@ int Client::make_request(MetaRequest *request,
     // send request.
     send_request(request, mds);
 
-    // make sure we have needed mds sessions open
-    check_mds_sessions();
-
     // wait for signal
     dout(20) << "awaiting reply|forward|kick on " << &cond << dendl;
     request->kick = false;
@@ -1357,8 +1351,6 @@ void Client::handle_mds_map(MMDSMap* m)
   delete oldmap;
   delete m;
 
-  check_mds_sessions();
-
   monclient->sub_got("mdsmap", mdsmap->get_epoch());
 }
 
@@ -1410,6 +1402,9 @@ void Client::send_reconnect(int mds)
     // reset my cap seq number
     mds_sessions[mds].seq = 0;
 
+    //connect to the mds' offload targets
+    connect_mds_targets(mds);
+    //make sure unsafe requests get saved
     resend_unsafe_requests(mds);
   } else {
     dout(10) << " i had no session with this mds" << dendl;
index 4c0c39dfeafd305f38a143a386bd24396e7529f4..690cd306c71e69a01727e83a85bb2fa9d5032414 100644 (file)
@@ -868,7 +868,7 @@ public:
   void encode_dentry_release(Dentry *dn, MClientRequest *req,
                             int mds, int drop, int unless);
   int choose_target_mds(MetaRequest *req);
-  void check_mds_sessions();
+  void connect_mds_targets(int mds);
   void send_request(MetaRequest *request, int mds);
   void kick_requests(int mds, bool signal);
   void handle_client_request_forward(MClientRequestForward *reply);