]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: early_reply infrastructure
authorSage Weil <sage@newdream.net>
Mon, 22 Dec 2008 21:48:40 +0000 (13:48 -0800)
committerSage Weil <sage@newdream.net>
Tue, 23 Dec 2008 19:45:22 +0000 (11:45 -0800)
src/mds/CInode.cc
src/mds/CInode.h
src/mds/Server.cc
src/mds/Server.h
src/messages/MClientReply.h

index ac9903156251f26e7a109221f31315953f3d65b0..78f549de373fba21bb0fb84f1634e0b5fb2d0622 100644 (file)
@@ -1275,12 +1275,16 @@ void CInode::decode_snap_blob(bufferlist& snapbl)
 }
 
 
-bool CInode::encode_inodestat(bufferlist& bl, snapid_t snapid)
+bool CInode::encode_inodestat(bufferlist& bl, snapid_t snapid, bool projected)
 {
   bool valid = true;
 
   // pick a version!
-  inode_t *i = &inode;
+  inode_t *i;
+  if (projected)
+    i = get_projected_inode();
+  else 
+    i = &inode;
   bufferlist xbl;
   if (snapid && is_multiversion()) {
 
index af3f79c07e5ab9ebb5c690bab2bf935c485e0f3a..396b382469941ec33b26ae64c2d302a8452a7b63 100644 (file)
@@ -419,7 +419,7 @@ private:
   
 
   // for giving to clients
-  bool encode_inodestat(bufferlist& bl, snapid_t snapid=CEPH_NOSNAP);
+  bool encode_inodestat(bufferlist& bl, snapid_t snapid=CEPH_NOSNAP, bool projected=false);
 
 
   // -- locks --
index 863e6808ba78f8ab102f9caac317c213b9117767..62572eabc62a6b9310994a1c7cd05a7313670ff5 100644 (file)
@@ -502,6 +502,28 @@ void Server::reply_request(MDRequest *mdr, int r, CInode *tracei, CDentry *trace
 }
 
 
+void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
+{
+  MClientRequest *req = mdr->client_request;
+  entity_inst_t client_inst = req->get_orig_source_inst();
+  if (client_inst.name.is_mds())
+    return;
+
+  MClientReply *reply = new MClientReply(mdr->client_request, 0);
+  reply->set_unsafe();
+
+  dout(10) << "early_reply " << reply->get_result() 
+          << " (" << strerror(-reply->get_result())
+          << ") " << *req << dendl;
+
+  snapid_t snapid = CEPH_NOSNAP;
+  CInode *snapdiri = 0;
+  if (tracei || tracedn)
+    set_trace_dist(mdr->session, reply, tracei, tracedn, snapid, snapdiri, true);
+
+  messenger->send_message(reply, client_inst);
+}
+
 /*
  * send given reply
  * include a trace to tracei
@@ -613,7 +635,8 @@ void Server::encode_null_lease(bufferlist& bl)
  * trace is in reverse order (i.e. root inode comes last)
  */
 void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
-                           snapid_t snapid, CInode *snapdiri)
+                           snapid_t snapid, CInode *snapdiri,
+                           bool projected)
 {
   // inode, dentry, dir, ..., inode
   bufferlist bl;
@@ -635,7 +658,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
 
  inode:
   numi++;
-  if (in->encode_inodestat(bl, snapid))
+  if (in->encode_inodestat(bl, snapid, projected))
     lmask = mds->locker->issue_client_lease(in, client, bl, now, session);
   else {
     lmask = CEPH_STAT_MASK_INODE; // immutable bits
@@ -663,12 +686,18 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
     dout(10) << " snapdiri at pos " << snapdirpos << dendl;
   }
 
-  if (!dn)
-    dn = in->get_parent_dn();
+  if (!dn) {
+    if (projected)
+      dn = in->get_projected_parent_dn();
+    else
+      dn = in->get_parent_dn();
+  }
   if (!dn) 
     goto done;
 
  dentry:
+  projected = false;
+
   ::encode(dn->get_name(), bl);
   if (snapid == CEPH_NOSNAP)
     lmask = mds->locker->issue_client_lease(dn, client, bl, now, session);
index e08d268a0bfe81126410ce739f05e327f5b83f03..93774693a934f4114c7edcc25c89f2cf0a5f1acf 100644 (file)
@@ -75,10 +75,12 @@ public:
   void handle_client_request(MClientRequest *m);
 
   void dispatch_client_request(MDRequest *mdr);
+  void early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn);
   void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
   void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
   void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
-                     snapid_t snapid, CInode *snapdiri);
+                     snapid_t snapid, CInode *snapdiri,
+                     bool projected = false);
 
   void encode_empty_dirstat(bufferlist& bl);
   void encode_infinite_lease(bufferlist& bl);
index e50a0855140c0fdf37cd8a6f0b3e152fc16d857f..bfabd4a4ec167c42fa631b4327704361e28d88b4 100644 (file)
@@ -190,6 +190,8 @@ public:
   void set_file_caps_mseq(capseq_t s) { st.file_caps_mseq = s; }
   //void set_file_data_version(uint64_t v) { st.file_data_version = v; }
 
+  void set_unsafe() { st.safe = 0; }
+
   MClientReply() {}
   MClientReply(MClientRequest *req, int result = 0) : 
     Message(CEPH_MSG_CLIENT_REPLY) {