]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: adjust cap issue sequence to avoid unnecessary file_caps messages
authorSage Weil <sage@newdream.net>
Tue, 29 Jan 2008 05:23:47 +0000 (21:23 -0800)
committerSage Weil <sage@newdream.net>
Tue, 29 Jan 2008 05:23:47 +0000 (21:23 -0800)
src/mds/Locker.cc
src/mds/Server.cc
src/mds/SessionMap.cc
src/mds/SessionMap.h

index 0bb2e6bf5c13a9335453868bf18b154e6a323458..9b0a3dbd1a27b9f8cb94890d57a0e52a57c968b3 100644 (file)
@@ -492,9 +492,6 @@ Capability* Locker::issue_new_caps(CInode *in,
   cap->issue(cap->pending());
   cap->set_last_open();
   
-  // ok, stop suppressing.
-  cap->set_suppress(false);
-
   int now = cap->pending();
   if (before != now &&
       (before & CEPH_CAP_WR) == 0 &&
index a2bbe31153e6fc709a5b53400e9f7219f12ea21f..e4f94b73932248ce79f347a52b5bef718c7b3285 100644 (file)
@@ -579,11 +579,13 @@ void Server::handle_client_request(MClientRequest *req)
 
   // active session?
   Session *session = 0;
-  if (req->get_client_inst().name.is_client() && 
-      !(session = mds->sessionmap.get_session(req->get_client_inst().name))) {
-    dout(5) << "no session for " << req->get_client_inst().name << ", dropping" << dendl;
-    delete req;
-    return;
+  if (req->get_client_inst().name.is_client()) {
+    session = mds->sessionmap.get_session(req->get_client_inst().name);
+    if (!session) {
+      dout(5) << "no session for " << req->get_client_inst().name << ", dropping" << dendl;
+      delete req;
+      return;
+    }
   }
 
   // old mdsmap?
@@ -3861,12 +3863,15 @@ void Server::_do_open(MDRequest *mdr, CInode *cur)
   MClientRequest *req = mdr->client_request;
   int cmode = req->get_open_file_mode();
 
-  // can we issue the caps they want?
-  //version_t fdv = mds->locker->issue_file_data_version(cur);
+  // register new cap
   Capability *cap = mds->locker->issue_new_caps(cur, cmode, mdr->session);
-  if (!cap) return; // can't issue (yet), so wait!
-  
-  dout(12) << "_do_open issuing caps " << cap_string(cap->pending())
+
+  // drop our locks (they may interfere with us issuing new caps)
+  mds->locker->drop_locks(mdr);
+
+  cap->set_suppress(false);  // stop suppressing messages on this cap
+
+  dout(12) << "_do_open issued caps " << cap_string(cap->pending())
           << " for " << req->get_source()
           << " on " << *cur << dendl;
   
index 543fdac06285c53969359fa6d68936e9aa608342..d801eb8debcd978971056924731c76e4a2257a3e 100644 (file)
@@ -28,6 +28,17 @@ void SessionMap::init_inode()
 }
 
 
+void SessionMap::dump()
+{
+  hash<entity_name_t> H;
+  dout(0) << "dump" << dendl;
+  for (hash_map<entity_name_t,Session*>::iterator p = session_map.begin();
+       p != session_map.end();
+       ++p) 
+    dout(0) << p->first << " " << p->second << " hash " << H(p->first) << " addr " << (void*)&p->first << dendl;
+}
+
+
 // ----------------
 // LOAD
 
index 142841eaa6e3d89f56765ee16bfb2727de0f7496..8ff64de5d0687ec02206ac54c61bc23343f79dd3 100644 (file)
@@ -172,6 +172,7 @@ public:
       by_state[s].push_back(&session->session_list_item);
     }
   }
+  void dump();
 
   void get_client_set(set<int>& s) {
     for (hash_map<entity_name_t,Session*>::iterator p = session_map.begin();