]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: specify number of dentries want in mds request
authorSage Weil <sage@newdream.net>
Tue, 24 Mar 2009 21:34:37 +0000 (14:34 -0700)
committerSage Weil <sage@newdream.net>
Thu, 26 Mar 2009 20:10:10 +0000 (13:10 -0700)
Let the client inform the MDS whether it wants dentry linkage info
(i.e., whether it holds the directory i_mutex).

src/client/Client.cc
src/include/ceph_fs.h
src/kernel/mds_client.c
src/mds/Server.cc
src/mds/Server.h
src/messages/MClientRequest.h

index f595a820c2963fa36ed1f5bb393d1d71d2397caa..1f7998112a7bfb50b3c21e987b0272556665d37a 100644 (file)
@@ -964,6 +964,7 @@ void Client::send_request(MetaRequest *request, int mds)
     r->copy_payload(request->request_payload);
     r->decode_payload();
     r->set_retry_attempt(request->retry_attempt);
+    r->set_num_dentries_wanted(1);
   }
   request->request = 0;
 
index fc49addffe3fbee3440a1ffbedf3501ae0182835..79b0ae1031d3a08e750a8d1ac4ab2e8b1934c5b0 100644 (file)
@@ -44,7 +44,7 @@
 #define CEPH_MDS_PROTOCOL     7 /* cluster internal */
 #define CEPH_MON_PROTOCOL     4 /* cluster internal */
 #define CEPH_OSDC_PROTOCOL    6 /* public/client */
-#define CEPH_MDSC_PROTOCOL   12 /* public/client */
+#define CEPH_MDSC_PROTOCOL   13 /* public/client */
 #define CEPH_MONC_PROTOCOL    9 /* public/client */
 
 
@@ -819,8 +819,9 @@ union ceph_mds_request_args {
 struct ceph_mds_request_head {
        ceph_tid_t tid, oldest_client_tid;
        ceph_epoch_t mdsmap_epoch; /* on client */
-       __le32 num_fwd;
        __le32 retry_attempt;  /* REQUEST_REPLAY if replay */
+       __le16 num_fwd;
+       __le16 num_dentries_wanted;
        __le64 mds_wants_replica_in_dirino;
        __le32 op;
        __le32 caller_uid, caller_gid;
index 7ac8eb7455a998a421d62d368b5352c5674e8c5e..5d307f42cc4f932eb5c38f496c961fc42e2b9d02 100644 (file)
@@ -1074,6 +1074,8 @@ static int __prepare_send_request(struct ceph_mds_client *mdsc,
        rhead->oldest_client_tid = cpu_to_le64(__get_oldest_tid(mdsc));
        rhead->num_fwd = cpu_to_le32(req->r_num_fwd);
 
+       rhead->num_dentries_wanted = req->r_locked_dir ? 1:0;
+
        if (req->r_last_inode)
                rhead->ino = cpu_to_le64(ceph_ino(req->r_last_inode));
        else
index c453229e625a0d3c66680fc6fc3a300495fd2b08..c9a1349695cedd94a948585fcbb9d6f9a956443b 100644 (file)
@@ -574,7 +574,8 @@ void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
   CInode *snapdiri = 0;
   if (tracei || tracedn)
     set_trace_dist(mdr->session, reply, tracei, tracedn, snapid, snapdiri, mdr,
-                  mdr->client_request->is_replay());
+                  mdr->client_request->is_replay(),
+                  mdr->client_request->get_num_dentries_wanted());
 
   messenger->send_message(reply, client_inst);
 
@@ -644,6 +645,7 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei,
   Session *session = mdr->session;
   bool did_early_reply = mdr->did_early_reply;
   entity_inst_t client_inst = req->get_orig_source_inst();
+  int num_dentries_wanted = req->get_num_dentries_wanted();
   mdcache->request_finish(mdr);
   mdr = 0;
 
@@ -655,7 +657,7 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei,
     // send reply, with trace, and possible leases
     if (!did_early_reply &&   // don't issue leases if we sent an earlier reply already
        (tracei || tracedn)) 
-      set_trace_dist(session, reply, tracei, tracedn, snapid, snapdiri, mdr, is_replay);
+      set_trace_dist(session, reply, tracei, tracedn, snapid, snapdiri, mdr, is_replay, num_dentries_wanted);
     messenger->send_message(reply, client_inst);
   }
   
@@ -701,7 +703,7 @@ void Server::encode_null_lease(bufferlist& bl)
  */
 void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
                            snapid_t snapid, CInode *snapdiri,
-                           MDRequest *mdr, bool is_replay)
+                           MDRequest *mdr, bool is_replay, int num_dentries_wanted)
 {
   // inode, dentry, dir, ..., inode
   bufferlist bl;
@@ -710,7 +712,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
   __u16 numi = 0, numdn = 0;
   __s16 snapdirpos = -1;
 
-  bool single_segment = g_conf.mds_short_reply_trace;  // do a single segment: [inode, ] dentry, dir.
+  //bool single_segment = g_conf.mds_short_reply_trace;  // do a single segment: [inode, ] dentry, dir.
 
   // choose lease duration
   utime_t now = g_clock.now();
@@ -758,9 +760,6 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
     dout(10) << "set_trace_dist snapdiri at pos " << snapdirpos << dendl;
   }
 
-  if (single_segment && numdn)
-    goto done;
-
   if (!dn) {
     dn = in->get_projected_parent_dn();
     if (dn && !dn->use_projected(client, mdr))
@@ -772,6 +771,9 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C
     goto done;
 
  dentry:
+  if (numdn >= num_dentries_wanted)
+    goto done;
+
   dout(15) << "set_trace_dist " << *dn << dendl;
 
   ::encode(dn->get_name(), bl);
index 7f7715ff83f7f66da606b2f19de9424c5a469dac..fbb69d9dffb81ce5097570be43a64e71600ac5b6 100644 (file)
@@ -90,7 +90,7 @@ public:
   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,
-                     MDRequest *mdr, bool is_replay);
+                     MDRequest *mdr, bool is_replay, int num_dentries_wanted);
 
   void encode_empty_dirstat(bufferlist& bl);
   void encode_infinite_lease(bufferlist& bl);
index 58e39851b4de63cc3e838a5f80ec88db5e6ba8d1..4e9705b9c495e0c41b2b192a091f7a8eccf79d49 100644 (file)
@@ -116,7 +116,8 @@ public:
   void set_caller_gid(unsigned g) { head.caller_gid = g; }
   void set_mds_wants_replica_in_dirino(inodeno_t dirino) { 
     head.mds_wants_replica_in_dirino = dirino; }
-  
+  void set_num_dentries_wanted(int n) { head.num_dentries_wanted = n; }
+    
   tid_t get_tid() { return head.tid; }
   tid_t get_oldest_client_tid() { return head.oldest_client_tid; }
   int get_num_fwd() { return head.num_fwd; }
@@ -131,7 +132,9 @@ public:
   filepath& get_filepath2() { return path2; }
 
   inodeno_t get_mds_wants_replica_in_dirino() { 
-    return inodeno_t(head.mds_wants_replica_in_dirino); }
+    return inodeno_t(head.mds_wants_replica_in_dirino);
+  }
+  int get_num_dentries_wanted() { return head.num_dentries_wanted; }
 
   void decode_payload() {
     bufferlist::iterator p = payload.begin();