]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: try find_ino_peers for lookuphash requests
authorSage Weil <sage.weil@dreamhost.com>
Thu, 31 Mar 2011 22:46:41 +0000 (15:46 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Thu, 31 Mar 2011 23:07:10 +0000 (16:07 -0700)
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/Server.cc
src/mds/Server.h

index 452526f5bbfc6c1ed2b594cfe898e734f90a7ff2..01a5ada29a7c6e544e1d682e23f77954eea6d451 100644 (file)
@@ -2042,6 +2042,15 @@ void Server::handle_client_lookup_parent(MDRequest *mdr)
   reply_request(mdr, 0, in, dn);  // reply
 }
 
+struct C_MDS_LookupHash : public Context {
+  Server *server;
+  MDRequest *mdr;
+  C_MDS_LookupHash(Server *s, MDRequest *r) : server(s), mdr(r) {}
+  void finish(int r) {
+    server->_lookup_hash(mdr, r);
+  }
+};
+
 /* This function DOES clean up the mdr before returning*/
 void Server::handle_client_lookup_hash(MDRequest *mdr)
 {
@@ -2055,7 +2064,12 @@ void Server::handle_client_lookup_hash(MDRequest *mdr)
   if (!in) {
     // try the directory
     CInode *diri = mdcache->get_inode(req->get_filepath2().get_ino());
-    if (!diri || diri->state_test(CInode::STATE_PURGING)) {
+    if (!diri) {
+      mdcache->find_ino_peers(req->get_filepath2().get_ino(),
+                             new C_MDS_LookupHash(this, mdr), -1);
+      return;
+    }
+    if (diri->state_test(CInode::STATE_PURGING)) {
       reply_request(mdr, -ESTALE);
       return;
     }
@@ -2099,6 +2113,17 @@ void Server::handle_client_lookup_hash(MDRequest *mdr)
   reply_request(mdr, reply, in, in->get_parent_dn());
 }
 
+void Server::_lookup_hash(MDRequest *mdr, int r)
+{
+  dout(10) << "_lookup_hash " << mdr << " r=" << r << dendl;
+  if (r < 0) {
+    reply_request(mdr, r);
+    return;
+  }
+
+  dispatch_client_request(mdr);
+}
+
 
 /* This function takes responsibility for the passed mdr*/
 void Server::handle_client_open(MDRequest *mdr)
index d9b87632cef2f19f98fba00f3cb471a6d6204039..104d559a9afe4df692172f1925055e46075d57db 100644 (file)
@@ -137,6 +137,7 @@ public:
   void handle_client_stat(MDRequest *mdr);
   void handle_client_lookup_parent(MDRequest *mdr);
   void handle_client_lookup_hash(MDRequest *mdr);
+  void _lookup_hash(MDRequest *mdr, int r);
   void handle_client_readdir(MDRequest *mdr);
   void handle_client_file_setlock(MDRequest *mdr);
   void handle_client_file_readlock(MDRequest *mdr);