]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
uclient: Only make the MClientRequest in send_request itself.
authorGreg Farnum <gregf@hq.newdream.net>
Mon, 21 Sep 2009 20:46:37 +0000 (13:46 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 22 Sep 2009 20:02:50 +0000 (13:02 -0700)
Add a few more functions to MetaRequest so we can use those in choose_mds.

src/client/Client.cc
src/client/Client.h

index 48965964dd539c793de088792780e2c8d6cd9dfa..8ecd4800ba1c1ddc4764bb06d6a3e36e76a53a5a 100644 (file)
@@ -689,7 +689,7 @@ Inode* Client::insert_trace(MetaRequest *request, utime_t from, int mds)
 
 // -------
 
-int Client::choose_target_mds(MClientRequest *req) 
+int Client::choose_target_mds(MetaRequest *req) 
 {
   int mds = 0;
     
@@ -794,10 +794,6 @@ int Client::make_request(MetaRequest *request,
   else
     request->set_oldest_client_tid(tid); // this one is the oldest.
 
-  // -- make request --
-  MClientRequest *req = make_request_from_Meta(request);
-  request->request = req;
-
   // hack target mds?
   if (use_mds >= 0)
     request->resend_mds = use_mds;
@@ -815,7 +811,7 @@ int Client::make_request(MetaRequest *request,
       request->resend_mds = -1;
       dout(10) << "target resend_mds specified as mds" << mds << dendl;
     } else {
-      mds = choose_target_mds(req);
+      mds = choose_target_mds(request);
       if (mds >= 0) {
        dout(10) << "chose target mds" << mds << " based on hierarchy" << dendl;
       } else {
@@ -1050,20 +1046,16 @@ void Client::handle_client_session(MClientSession *m)
 void Client::send_request(MetaRequest *request, int mds)
 {
   MClientRequest *r = request->request;
-  if (!r) {
-    // make a new one
-    dout(10) << "send_request rebuilding request " << request->get_tid()
-            << " for mds" << mds << dendl;
-    r = make_request_from_Meta(request);
-    r->set_dentry_wanted();
-    if (request->got_unsafe)
-      r->set_replayed_op();
-    request->request = r;
-  }
-  else
-    request->retry_attempt++;
-  if (!r->releases.size())
-    encode_cap_releases(request, mds);
+  // make the request
+  dout(10) << "send_request rebuilding request " << request->get_tid()
+          << " for mds" << mds << dendl;
+  r = make_request_from_Meta(request);
+  r->set_dentry_wanted();
+  if (request->got_unsafe)
+    r->set_replayed_op();
+
+  request->request = r;
+  encode_cap_releases(request, mds);
   request->request = 0;
 
   r->set_mdsmap_epoch(mdsmap->get_epoch());
index 2c8c3e7d27e3e520f270f3ae38bfedfb7efa5507..41285db626a88fcbe6d5201c65cc58eb9ca12ad0 100644 (file)
@@ -187,6 +187,29 @@ struct MetaRequest {
   tid_t get_tid() { return head.tid; }
   filepath& get_filepath() { return path; }
   filepath& get_filepath2() { return path2; }
+
+  bool is_write() {
+    return
+      (head.op & CEPH_MDS_OP_WRITE) || 
+      (head.op == CEPH_MDS_OP_OPEN && !(head.args.open.flags & (O_CREAT|O_TRUNC))) ||
+      (head.op == CEPH_MDS_OP_CREATE && !(head.args.open.flags & (O_CREAT|O_TRUNC)));
+  }
+  bool can_forward() {
+    if (is_write() ||
+       head.op == CEPH_MDS_OP_OPEN ||   // do not forward _any_ open request.
+       head.op == CEPH_MDS_OP_CREATE)   // do not forward _any_ open request.
+      return false;
+    return true;
+  }
+  bool auth_is_best() {
+    if (is_write()) 
+      return true;
+    if (head.op == CEPH_MDS_OP_OPEN ||
+       head.op == CEPH_MDS_OP_CREATE ||
+       head.op == CEPH_MDS_OP_READDIR) 
+      return true;
+    return false;    
+  }
 };
 
 
@@ -843,7 +866,7 @@ public:
                           int unless,int force=0);
   void encode_dentry_release(Dentry *dn, MClientRequest *req,
                             int mds, int drop, int unless);
-  int choose_target_mds(MClientRequest *req);
+  int choose_target_mds(MetaRequest *req);
   void send_request(MetaRequest *request, int mds);
   void kick_requests(int mds, bool signal);
   void handle_client_request_forward(MClientRequestForward *reply);