]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: only encode_cap_releases once per request.
authorGreg Farnum <gregf@hq.newdream.net>
Mon, 22 Nov 2010 16:50:32 +0000 (08:50 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Mon, 22 Nov 2010 17:09:01 +0000 (09:09 -0800)
Accomplish this by making a list of cap releases in the (permanent)
MetaRequest, and then copying that into the (potentially-temporary)
MClientRequest.

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

index e591ba75bad0db815c98b12993403664e35c90cf..8935cf605996cecdcffc8fe3af47c0ec0141fadd 100644 (file)
@@ -1036,7 +1036,7 @@ int Client::make_request(MetaRequest *request,
   return r;
 }
 
-int Client::encode_inode_release(Inode *in, MClientRequest *req,
+int Client::encode_inode_release(Inode *in, MetaRequest *req,
                         int mds, int drop,
                         int unless, int force)
 {
@@ -1068,14 +1068,14 @@ int Client::encode_inode_release(Inode *in, MClientRequest *req,
     rel.wanted = caps->wanted;
     rel.dname_len = 0;
     rel.dname_seq = 0;
-    req->releases.push_back(MClientRequest::Release(rel,""));
+    req->cap_releases.push_back(MClientRequest::Release(rel,""));
   }
   dout(25) << "encode_inode_release exit(in:" << *in << ") released:"
           << released << dendl;
   return released;
 }
 
-void Client::encode_dentry_release(Dentry *dn, MClientRequest *req,
+void Client::encode_dentry_release(Dentry *dn, MetaRequest *req,
                           int mds, int drop, int unless)
 {
   dout(20) << "encode_dentry_release enter(dn:"
@@ -1084,7 +1084,7 @@ void Client::encode_dentry_release(Dentry *dn, MClientRequest *req,
                                      mds, drop, unless, 1);
   if (released && dn->lease_mds == mds) {
     dout(25) << "preemptively releasing dn to mds" << dendl;
-    MClientRequest::Release& rel = req->releases.back();
+    MClientRequest::Release& rel = req->cap_releases.back();
     rel.item.dname_len = dn->name.length();
     rel.item.dname_seq = dn->lease_seq;
     rel.dname = dn->name;
@@ -1100,26 +1100,26 @@ void Client::encode_dentry_release(Dentry *dn, MClientRequest *req,
  * Additionally, if you set any *drop member, you'd better have
  * set the corresponding dentry!
  */
-void Client::encode_cap_releases(MetaRequest *req, MClientRequest *m, int mds) {
+void Client::encode_cap_releases(MetaRequest *req, int mds) {
   dout(20) << "encode_cap_releases enter (req: "
           << req << ", mds: " << mds << ")" << dendl;
   if (req->inode_drop && req->inode)
-    encode_inode_release(req->inode, m,
+    encode_inode_release(req->inode, req,
                         mds, req->inode_drop,
                         req->inode_unless);
   
   if (req->old_inode_drop && req->old_inode)
-    encode_inode_release(req->old_inode, m,
+    encode_inode_release(req->old_inode, req,
                         mds, req->old_inode_drop,
                         req->old_inode_unless);
   
   if (req->dentry_drop && req->dentry)
-    encode_dentry_release(req->dentry, m,
+    encode_dentry_release(req->dentry, req,
                          mds, req->dentry_drop,
                          req->dentry_unless);
   
   if (req->old_dentry_drop && req->old_dentry)
-    encode_dentry_release(req->old_dentry, m,
+    encode_dentry_release(req->old_dentry, req,
                          mds, req->old_dentry_drop,
                          req->old_dentry_unless);
   dout(25) << "encode_cap_releases exit (req: "
@@ -1194,7 +1194,9 @@ void Client::send_request(MetaRequest *request, int mds)
     r->set_replayed_op();
   r->set_mdsmap_epoch(mdsmap->get_epoch());
 
-  encode_cap_releases(request, r, mds);
+  if (request->cap_releases.empty())
+    encode_cap_releases(request, mds);
+  r->releases = request->cap_releases;
 
   if (request->mds == -1) {
     request->sent_stamp = g_clock.now();
index 860e9f82d5d91bdff39e8f879350c7de73b29760..7ac9c750fc71fc7329090f8fca4905df4b95a29f 100644 (file)
@@ -37,6 +37,7 @@ enum {
 #include "msg/Messenger.h"
 
 #include "messages/MClientReply.h"
+#include "messages/MClientRequest.h"
 
 #include "include/types.h"
 #include "include/lru.h"
@@ -113,6 +114,7 @@ struct MetaRequest {
   int old_inode_drop, old_inode_unless;
   int dentry_drop, dentry_unless;
   int old_dentry_drop, old_dentry_unless;
+  vector<MClientRequest::Release> cap_releases;
   Inode *inode;
   Inode *old_inode;
   Dentry *dentry; //associated with path
@@ -828,11 +830,11 @@ public:
                   //MClientRequest *req, int uid, int gid,
                   Inode **ptarget = 0,
                   int use_mds=-1, bufferlist *pdirbl=0);
-  void encode_cap_releases(MetaRequest *request, MClientRequest *m, int mds);
-  int encode_inode_release(Inode *in, MClientRequest *req,
+  void encode_cap_releases(MetaRequest *request, int mds);
+  int encode_inode_release(Inode *in, MetaRequest *req,
                           int mds, int drop,
                           int unless,int force=0);
-  void encode_dentry_release(Dentry *dn, MClientRequest *req,
+  void encode_dentry_release(Dentry *dn, MetaRequest *req,
                             int mds, int drop, int unless);
   int choose_target_mds(MetaRequest *req);
   void connect_mds_targets(int mds);