]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: insert_trace cleanup, and derive ttl from MClientReply
authorSage Weil <sage@newdream.net>
Tue, 25 Mar 2008 04:24:14 +0000 (21:24 -0700)
committerSage Weil <sage@newdream.net>
Tue, 25 Mar 2008 04:24:14 +0000 (21:24 -0700)
src/client/Client.cc
src/client/Client.h
src/messages/MClientReply.h

index 4ce4811f4d49939c6d444baeaf74c9694fe80633..4235fe9b95cfd09087c994479071fd6cab7f3a12 100644 (file)
@@ -397,7 +397,7 @@ Inode* Client::insert_inode(Dir *dir, InodeStat *st, const string& dname, utime_
 
   // save the mask
   dn->inode->mask = st->mask;
-  dn->inode->ttl = ttl;
+  if (ttl > dn->inode->ttl) dn->inode->ttl = ttl;
   
   // or do we have newer size/mtime from writing?
   if (dn->inode->file_wr_size > dn->inode->inode.size)
@@ -453,12 +453,10 @@ void Client::update_dir_dist(Inode *in, DirStat *dst)
  *
  * insert a trace from a MDS reply into the cache.
  */
-Inode* Client::insert_trace(MClientReply *reply)
+Inode* Client::insert_trace(MClientReply *reply, utime_t ttl)
 {
   Inode *cur = root;
   utime_t now = g_clock.real_now();
-  utime_t ttl = now;
-  ttl += 60.0;  /* FIXME ASKJSDFJKDFJKDFSJK*/
 
   dout(10) << "insert_trace got " << reply->get_trace_in().size() << " inodes" << dendl;
 
@@ -479,7 +477,7 @@ Inode* Client::insert_trace(MClientReply *reply)
         inode_map[root->inode.ino] = root;
        root->dir_auth = 0;
       }
-      cur->ttl = ttl;
+      if (ttl > cur->ttl) cur->ttl = ttl;
       cur->mask = (*pin)->mask;
     } else {
       // not root.
@@ -627,8 +625,7 @@ int Client::choose_target_mds(MClientRequest *req)
 
 
 
-MClientReply *Client::make_request(MClientRequest *req,
-                                   int use_mds)  // this param is purely for debug hacking
+MClientReply *Client::make_request(MClientRequest *req, Inode **ppin, int use_mds)
 {
   // time the call
   utime_t start = g_clock.real_now();
@@ -664,7 +661,7 @@ MClientReply *Client::make_request(MClientRequest *req,
   request.idempotent = req->is_idempotent();
 
   // hack target mds?
-  if (use_mds)
+  if (use_mds >= 0)
     request.resend_mds = use_mds;
 
   // set up wait cond
@@ -747,6 +744,15 @@ MClientReply *Client::make_request(MClientRequest *req,
   mds_requests.erase(tid);
 
 
+  // insert trace
+  if (reply->get_result() >= 0) {
+    utime_t ttl = request.sent_stamp;
+    ttl += 1000.0 * (float)reply->get_lease_duration_ms();
+    Inode *in = insert_trace(reply, ttl);
+    if (ppin)
+      *ppin = in;
+  }
+
   // -- log times --
   if (client_logger) {
     utime_t lat = g_clock.real_now();
@@ -839,6 +845,9 @@ void Client::send_request(MetaRequest *request, int mds)
 
   r->set_mdsmap_epoch(mdsmap->get_epoch());
 
+  if (request->mds.empty())
+    request->sent_stamp = g_clock.now();
+
   dout(10) << "send_request " << *r << " to mds" << mds << dendl;
   messenger->send_message(r, mdsmap->get_inst(mds));
   
@@ -1737,10 +1746,8 @@ int Client::_link(const char *existing, const char *newname)
   req->set_caller_uid(getuid());
   req->set_caller_gid(getgid());
   
-  MClientReply *reply = make_request(req, utime);
+  MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  
-  insert_trace(reply);
   delete reply;
   dout(10) << "link result is " << res << dendl;
 
@@ -1784,7 +1791,6 @@ int Client::_unlink(const char *path)
       unlink(dn);
     }
   }
-  insert_trace(reply);
   delete reply;
   dout(10) << "unlink result is " << res << dendl;
 
@@ -1829,7 +1835,6 @@ int Client::_rename(const char *from, const char *to)
       unlink(dn);
     }
   }
-  insert_trace(reply);
   delete reply;
   dout(10) << "rename result is " << res << dendl;
 
@@ -1868,7 +1873,6 @@ int Client::_mkdir(const char *path, mode_t mode)
    
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);
   delete reply;
   dout(10) << "mkdir result is " << res << dendl;
 
@@ -1912,7 +1916,6 @@ int Client::_rmdir(const char *path)
       unlink(dn);
     }
   }
-  insert_trace(reply);  
   delete reply;
 
   trim_cache();
@@ -1948,7 +1951,6 @@ int Client::_symlink(const char *target, const char *link)
    
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  //FIXME assuming trace of link, not of target
   delete reply;
 
   trim_cache();
@@ -1999,7 +2001,6 @@ int Client::_do_lstat(filepath &fpath, int mask, Inode **in)
   int res = 0;
 
   Dentry *dn = lookup(fpath);
-  inode_t inode;
   utime_t now = g_clock.real_now();
 
   if (dn) {
@@ -2018,7 +2019,6 @@ int Client::_do_lstat(filepath &fpath, int mask, Inode **in)
       now <= dn->inode->ttl &&
       ((mask & ~CEPH_STAT_MASK_INODE) || now <= dn->inode->ttl) &&
       ((dn->inode->mask & mask) == mask)) {
-    inode = dn->inode->inode;
     dout(10) << "lstat cache hit w/ sufficient mask, valid until " << dn->inode->ttl << dendl;
     
     //if (g_conf.client_cache_stat_ttl == 0)
@@ -2030,19 +2030,10 @@ int Client::_do_lstat(filepath &fpath, int mask, Inode **in)
     req->head.args.stat.mask = mask;
     req->set_filepath(fpath);
 
-    MClientReply *reply = make_request(req);
+    MClientReply *reply = make_request(req, in);
     res = reply->get_result();
     dout(10) << "lstat res is " << res << dendl;
-    if (res == 0) {
-      //Transfer information from reply to stbuf
-      inode = reply->get_inode();
-      
-      //Update metadata cache
-      *in = insert_trace(reply);
-    }
-
     delete reply;
-
     if (res != 0) 
       *in = 0;     // not a success.
   }
@@ -2172,7 +2163,6 @@ int Client::_chmod(const char *path, mode_t mode)
   
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   delete reply;
 
   trim_cache();
@@ -2209,7 +2199,6 @@ int Client::_chown(const char *path, uid_t uid, gid_t gid)
 
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   delete reply;
   dout(10) << "chown result is " << res << dendl;
 
@@ -2245,7 +2234,6 @@ int Client::_utimes(const char *path, utime_t mtime, utime_t atime)
 
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   delete reply;
 
   dout(3) << "utimes(\"" << path << "\", " << mtime << ", " << atime << ") = " << res << dendl;
@@ -2285,7 +2273,6 @@ int Client::_mknod(const char *path, mode_t mode, dev_t rdev)
    
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
 
   delete reply;
 
@@ -2441,7 +2428,6 @@ int Client::_readdir_get_frag(DirResult *dirp)
   
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   inodeno_t ino = reply->get_ino();
   
   // did i get directory inode?
@@ -2671,7 +2657,6 @@ int Client::_open(const char *path, int flags, mode_t mode, Fh **fhp)
   MClientReply *reply = make_request(req);
   assert(reply);
 
-  insert_trace(reply);  
   int result = reply->get_result();
 
   // success?
@@ -3207,7 +3192,6 @@ int Client::_truncate(const char *file, off_t length)
   
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   delete reply;
 
   dout(3) << "truncate(\"" << file << "\", " << length << ") = " << res << dendl;
@@ -3238,7 +3222,6 @@ int Client::_ftruncate(Fh *fh, off_t length)
   
   MClientReply *reply = make_request(req);
   int res = reply->get_result();
-  insert_trace(reply);  
   delete reply;
 
   dout(3) << "ftruncate(\"" << fh << "\", " << length << ") = " << res << dendl;
index de585ec1d8f3dd285ea9b33fd0ec6edccd40c02d..44e34f7b3481fde811c015369258ad3471c64282 100644 (file)
@@ -446,6 +446,7 @@ public:
     MClientRequest *request;    
     bufferlist request_payload;  // in case i have to retry
 
+    utime_t  sent_stamp;
     bool     idempotent;         // is request idempotent?
     set<int> mds;                // who i am asking
     int      resend_mds;         // someone wants you to (re)send the request here
@@ -475,7 +476,7 @@ public:
   };
   map<tid_t,StatfsRequest*> statfs_requests;
   
-  MClientReply *make_request(MClientRequest *req, int use_auth=-1);
+  MClientReply *make_request(MClientRequest *req, Inode **ppin=0, int use_mds=-1);
   int choose_target_mds(MClientRequest *req);
   void send_request(MetaRequest *request, int mds);
   void kick_requests(int mds);
@@ -695,7 +696,7 @@ protected:
   // metadata cache
   Inode* insert_inode(Dir *dir, InodeStat *in_info, const string& dn, utime_t ttl);
   void update_dir_dist(Inode *in, DirStat *st);
-  Inode* insert_trace(MClientReply *reply);
+  Inode* insert_trace(MClientReply *reply, utime_t ttl);
 
   // ----------------------
   // fs ops.
index 17a240ada9101043c4b24ebfac192fa6d7c80c53..aae51316093a711afed4df588199c475c31dc90d 100644 (file)
@@ -207,6 +207,7 @@ class MClientReply : public Message {
   //void set_file_data_version(uint64_t v) { st.file_data_version = v; }
 
   void set_lease_duration_ms(int ms) { st.lease_duration_ms = cpu_to_le32(ms); }
+  int get_lease_duration_ms() { return le32_to_cpu(st.lease_duration_ms); }
 
   MClientReply() : dir_dir(0) {}
   MClientReply(MClientRequest *req, int result = 0) :