]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Make use of find_ino_peers
authorGreg Farnum <gregory.farnum@dreamhost.com>
Fri, 1 Apr 2011 00:25:52 +0000 (17:25 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Sun, 17 Apr 2011 04:02:45 +0000 (21:02 -0700)
Previously we just had to give up on ESTALE. Now
we can attempt to recover!

Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/mds/Server.cc

index bc55a7cdab25d780f761f630e88d5f926e6f423e..4596175a8fcd839a9e93a0248548d5e08b7c649a 100644 (file)
@@ -1763,6 +1763,21 @@ CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, file
   return dir;
 }
 
+class C_MDS_TryFindInode : public Context {
+  Server *server;
+  MDRequest *mdr;
+public:
+  C_MDS_TryFindInode(Server *s, MDRequest *r) : server(s), mdr(r) {
+    mdr->get();
+  }
+  virtual void finish(int r) {
+    if (r == -ESTALE) // :( find_ino_peers failed
+      server->reply_request(mdr, r);
+    else
+      server->dispatch_client_request(mdr);
+    mdr->put();
+  }
+};
 
 /* If this returns null, the request has been handled
  * as appropriate: forwarded on, or the client's been replied to */
@@ -1787,6 +1802,9 @@ CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n,
   if (r < 0) {  // error
     if (r == -ENOENT && n == 0 && mdr->dn[n].size()) {
       reply_request(mdr, r, NULL, mdr->dn[n][mdr->dn[n].size()-1]);
+    } else if (r == -ESTALE) {
+      Context *c = new C_MDS_TryFindInode(this, mdr);
+      mdcache->find_ino_peers(refpath.get_ino(), c);
     } else {
       reply_request(mdr, r);
     }