]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: Receive inline data pushed from mds
authorLi Wang <liwang@ubuntukylin.com>
Fri, 20 Dec 2013 09:42:41 +0000 (17:42 +0800)
committerYunchuan Wen <yunchuanwen@ubuntukylin.com>
Mon, 27 Jan 2014 07:24:59 +0000 (15:24 +0800)
Signed-off-by: Yunchuan Wen <yunchuanwen@ubuntukylin.com>
Signed-off-by: Li Wang <liwang@ubuntukylin.com>
src/client/Client.cc
src/client/Client.h

index db050b94d8958bba06f8172f248e6ede009b1b20..dcadacb062c0071c9f12441815e2233830c7fc13 100644 (file)
@@ -494,6 +494,8 @@ void Client::update_inode_file_bits(Inode *in,
                                    uint64_t time_warp_seq, utime_t ctime,
                                    utime_t mtime,
                                    utime_t atime,
+                                   version_t inline_version,
+                                   bufferlist& inline_data,
                                    int issued)
 {
   bool warn = false;
@@ -504,6 +506,11 @@ void Client::update_inode_file_bits(Inode *in,
           << " local " << in->time_warp_seq << dendl;
   uint64_t prior_size = in->size;
 
+  if (inline_version > in->inline_version) {
+    in->inline_data = inline_data;
+    in->inline_version = inline_version;
+  }
+
   if (truncate_seq > in->truncate_seq ||
       (truncate_seq == in->truncate_seq && size > in->size)) {
     ldout(cct, 10) << "size " << in->size << " -> " << size << dendl;
@@ -520,6 +527,13 @@ void Client::update_inode_file_bits(Inode *in,
        _invalidate_inode_cache(in, truncate_size, prior_size - truncate_size, true);
       }
     }
+
+    // truncate inline data
+    if (in->inline_version < CEPH_INLINE_NONE) {
+      uint32_t len = in->inline_data.length();
+      if (size < len)
+        in->inline_data.splice(size, len - size);
+    }
   }
   if (truncate_seq >= in->truncate_seq &&
       in->truncate_size != truncate_size) {
@@ -654,6 +668,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from, MetaSession *sessi
   
     update_inode_file_bits(in, st->truncate_seq, st->truncate_size, st->size,
                           st->time_warp_seq, st->ctime, st->mtime, st->atime,
+                          st->inline_version, st->inline_data,
                           issued);
   }
 
@@ -3529,7 +3544,9 @@ void Client::handle_cap_trunc(MetaSession *session, Inode *in, MClientCaps *m)
   issued |= implemented;
   update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(),
                          m->get_size(), m->get_time_warp_seq(), m->get_ctime(),
-                         m->get_mtime(), m->get_atime(), issued);
+                         m->get_mtime(), m->get_atime(),
+                         m->inline_version, m->inline_data,
+                         issued);
   m->put();
 }
 
@@ -3679,7 +3696,8 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, MClient
     in->xattr_version = m->head.xattr_version;
   }
   update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(), m->get_size(),
-                        m->get_time_warp_seq(), m->get_ctime(), m->get_mtime(), m->get_atime(), issued);
+                        m->get_time_warp_seq(), m->get_ctime(), m->get_mtime(), m->get_atime(),
+                        m->inline_version, m->inline_data, issued);
 
   // max_size
   if (cap == in->auth_cap &&
index 649bacc5ba69461a03e08551715709051424c0b9..95b3d12320404c3076742d59e30e8ac488d04b39 100644 (file)
@@ -508,6 +508,7 @@ protected:
   void update_inode_file_bits(Inode *in,
                              uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
                              uint64_t time_warp_seq, utime_t ctime, utime_t mtime, utime_t atime,
+                             version_t inline_version, bufferlist& inline_data,
                              int issued);
   Inode *add_update_inode(InodeStat *st, utime_t ttl, MetaSession *session);
   Dentry *insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dlease,