]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add LOOKUPINO op
authorSage Weil <sage.weil@dreamhost.com>
Fri, 1 Apr 2011 16:09:55 +0000 (09:09 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Fri, 1 Apr 2011 16:09:55 +0000 (09:09 -0700)
This just looks up a single ino (instead of the ino + dirino/hash
LOOKUPHASH business).

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/include/ceph_fs.h
src/include/ceph_strings.cc
src/mds/Server.cc
src/mds/Server.h

index 68cb70aa0e5a117120493e9efece71d0d8024a5c..3718bb421f1a92a8fdff8e35abab233809dfcf36 100644 (file)
@@ -321,6 +321,7 @@ enum {
        CEPH_MDS_OP_GETATTR    = 0x00101,
        CEPH_MDS_OP_LOOKUPHASH = 0x00102,
        CEPH_MDS_OP_LOOKUPPARENT = 0x00103,
+       CEPH_MDS_OP_LOOKUPINO  = 0x00104,
 
        CEPH_MDS_OP_SETXATTR   = 0x01105,
        CEPH_MDS_OP_RMXATTR    = 0x01106,
index f5fe1257b1eb8beeca80fc8a4e56bb83b67184ca..ecc7ac03e8a47311c99354ad90b7c944af205516 100644 (file)
@@ -124,6 +124,7 @@ const char *ceph_mds_op_name(int op)
        case CEPH_MDS_OP_LOOKUP:  return "lookup";
        case CEPH_MDS_OP_LOOKUPHASH:  return "lookuphash";
        case CEPH_MDS_OP_LOOKUPPARENT:  return "lookupparent";
+       case CEPH_MDS_OP_LOOKUPINO:  return "lookupino";
        case CEPH_MDS_OP_GETATTR:  return "getattr";
        case CEPH_MDS_OP_SETXATTR: return "setxattr";
        case CEPH_MDS_OP_SETATTR: return "setattr";
index 99ab9c35289f0b72f41a9d5d74079057dbb7dfb7..f91cbfe94a0ccc0bb881b9e7b79ee55a1b6c1602 100644 (file)
@@ -1125,6 +1125,10 @@ void Server::dispatch_client_request(MDRequest *mdr)
     handle_client_lookup_hash(mdr);
     break;
 
+  case CEPH_MDS_OP_LOOKUPINO:
+    handle_client_lookup_ino(mdr);
+    break;
+
     // inodes ops.
   case CEPH_MDS_OP_LOOKUP:
   case CEPH_MDS_OP_LOOKUPSNAP:
@@ -2073,13 +2077,14 @@ void Server::handle_client_lookup_hash(MDRequest *mdr)
       reply_request(mdr, -ESTALE);
       return;
     }
+    if (!in && !dirino) {
+      dout(10) << " no dirino, looking up ino " << ino << " directly" << dendl;
+      _lookup_ino(mdr);
+      return;
+    }
   }
   if (!in) {
     // try the directory
-    if (!dirino) {
-      _lookup_hash_ino(mdr);
-      return;
-    }
     CInode *diri = mdcache->get_inode(dirino);
     if (!diri) {
       mdcache->find_ino_peers(dirino,
@@ -2161,40 +2166,66 @@ void Server::_lookup_hash_3(MDRequest *mdr, int r)
     dispatch_client_request(mdr);
     return;
   }
-  _lookup_hash_ino(mdr);
   dout(10) << "_lookup_hash_3 " << mdr << " trying the ino itself" << dendl;
+  _lookup_ino(mdr);
 }
 
-struct C_MDS_LookupHashIno2 : public Context {
+/***************/
+
+struct C_MDS_LookupIno2 : public Context {
   Server *server;
   MDRequest *mdr;
-  C_MDS_LookupHashIno2(Server *s, MDRequest *r) : server(s), mdr(r) {}
+  C_MDS_LookupIno2(Server *s, MDRequest *r) : server(s), mdr(r) {}
   void finish(int r) {
-    server->_lookup_hash_ino_2(mdr, r);
+    server->_lookup_ino_2(mdr, r);
   }
 };
 
-void Server::_lookup_hash_ino(MDRequest *mdr)
+/* This function DOES clean up the mdr before returning*/
+/*
+ * filepath:  ino
+ */
+void Server::handle_client_lookup_ino(MDRequest *mdr)
+{
+  MClientRequest *req = mdr->client_request;
+
+  inodeno_t ino = req->get_filepath().get_ino();
+  CInode *in = mdcache->get_inode(ino);
+  if (in && in->state_test(CInode::STATE_PURGING)) {
+    reply_request(mdr, -ESTALE);
+    return;
+  }
+  if (!in) {
+    _lookup_ino(mdr);
+    return;
+  }
+
+  dout(10) << "reply to lookup_ino " << *in << dendl;
+  MClientReply *reply = new MClientReply(req, 0);
+  reply_request(mdr, reply, in, in->get_parent_dn());
+}
+
+void Server::_lookup_ino(MDRequest *mdr)
 {
   inodeno_t ino = mdr->client_request->get_filepath().get_ino();
-  dout(10) << "_lookup_hash_ino " << mdr << " checking peers for ino " << ino << dendl;
+  dout(10) << "_lookup_ino " << mdr << " checking peers for ino " << ino << dendl;
   mdcache->find_ino_peers(ino,
-                         new C_MDS_LookupHashIno2(this, mdr), -1);
+                         new C_MDS_LookupIno2(this, mdr), -1);
 }
 
-struct C_MDS_LookupHashIno3 : public Context {
+struct C_MDS_LookupIno3 : public Context {
   Server *server;
   MDRequest *mdr;
-  C_MDS_LookupHashIno3(Server *s, MDRequest *r) : server(s), mdr(r) {}
+  C_MDS_LookupIno3(Server *s, MDRequest *r) : server(s), mdr(r) {}
   void finish(int r) {
-    server->_lookup_hash_ino_3(mdr, r);
+    server->_lookup_ino_3(mdr, r);
   }
 };
 
-void Server::_lookup_hash_ino_2(MDRequest *mdr, int r)
+void Server::_lookup_ino_2(MDRequest *mdr, int r)
 {
   inodeno_t ino = mdr->client_request->get_filepath().get_ino();
-  dout(10) << "_lookup_hash_ino_2 " << mdr << " checked peers for ino " << ino
+  dout(10) << "_lookup_ino_2 " << mdr << " checked peers for ino " << ino
           << " and got r=" << r << dendl;
   if (r == 0) {
     dispatch_client_request(mdr);
@@ -2202,13 +2233,13 @@ void Server::_lookup_hash_ino_2(MDRequest *mdr, int r)
   }
 
   // okay fine, maybe it's a directory though...
-  mdcache->find_ino_dir(ino, new C_MDS_LookupHashIno3(this, mdr));
+  mdcache->find_ino_dir(ino, new C_MDS_LookupIno3(this, mdr));
 }
 
-void Server::_lookup_hash_ino_3(MDRequest *mdr, int r)
+void Server::_lookup_ino_3(MDRequest *mdr, int r)
 {
   inodeno_t ino = mdr->client_request->get_filepath().get_ino();
-  dout(10) << "_lookup_hash_ino_3 " << mdr << " checked dir obj for ino " << ino
+  dout(10) << "_lookup_ino_3 " << mdr << " checked dir obj for ino " << ino
           << " and got r=" << r << dendl;
   if (r == 0) {
     dispatch_client_request(mdr);
index 684dea8288f181a3b96666b0d0436b2c1b8acd30..bbe8c05d0bbe52cf82d095648979d75f3468e0d9 100644 (file)
@@ -139,9 +139,10 @@ public:
   void handle_client_lookup_hash(MDRequest *mdr);
   void _lookup_hash_2(MDRequest *mdr, int r);
   void _lookup_hash_3(MDRequest *mdr, int r);
-  void _lookup_hash_ino(MDRequest *mdr);
-  void _lookup_hash_ino_2(MDRequest *mdr, int r);
-  void _lookup_hash_ino_3(MDRequest *mdr, int r);
+  void handle_client_lookup_ino(MDRequest *mdr);
+  void _lookup_ino(MDRequest *mdr);
+  void _lookup_ino_2(MDRequest *mdr, int r);
+  void _lookup_ino_3(MDRequest *mdr, int r);
   void handle_client_readdir(MDRequest *mdr);
   void handle_client_file_setlock(MDRequest *mdr);
   void handle_client_file_readlock(MDRequest *mdr);