]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: update dirfragtree/fragmap according to mds request reply
authorYan, Zheng <zheng.z.yan@intel.com>
Mon, 24 Feb 2014 03:02:23 +0000 (11:02 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Sat, 1 Mar 2014 05:13:26 +0000 (13:13 +0800)
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/client/Client.cc
src/client/Client.h

index 2651e53e99089b0ccaafd24784e58055d31028b4..40e95fb582b2ae126173299de8dbee6ff5786202 100644 (file)
@@ -598,6 +598,15 @@ void Client::update_inode_file_bits(Inode *in,
   }
 }
 
+void Client::_fragmap_remove_non_leaves(Inode *in)
+{
+  for (map<frag_t,int>::iterator p = in->fragmap.begin(); p != in->fragmap.end(); )
+    if (!in->dirfragtree.is_leaf(p->first))
+      in->fragmap.erase(p++);
+    else
+      ++p;
+}
+
 Inode * Client::add_update_inode(InodeStat *st, utime_t from,
                                 MetaSession *session)
 {
@@ -680,7 +689,10 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
   }
 
   // move me if/when version reflects fragtree changes.
-  in->dirfragtree = st->dirfragtree;
+  if (in->dirfragtree != st->dirfragtree) {
+    in->dirfragtree = st->dirfragtree;
+    _fragmap_remove_non_leaves(in);
+  }
 
   if (in->snapid == CEPH_NOSNAP) {
     add_update_cap(in, session, st->cap.cap_id, st->cap.caps, st->cap.seq, st->cap.mseq, inodeno_t(st->cap.realm), st->cap.flags);
@@ -790,7 +802,10 @@ void Client::update_dir_dist(Inode *in, DirStat *dst)
   } else {
     in->fragmap.erase(dst->frag);
   }
-  assert(in->dirfragtree.is_leaf(dst->frag));
+  if (!in->dirfragtree.is_leaf(dst->frag)) {
+    in->dirfragtree.force_to_leaf(cct, dst->frag);
+    _fragmap_remove_non_leaves(in);
+  }
 
   // replicated
   in->dir_replicated = !dst->dist.empty();  // FIXME that's just one frag!
index fb5be31be75512a549529d12f0186e8aaba4e51f..7d9b32b6ae4c56c7c145c508dcdaafbe876daf91 100644 (file)
@@ -547,6 +547,8 @@ private:
   void _closedir(dir_result_t *dirp);
 
   // other helpers
+  void _fragmap_remove_non_leaves(Inode *in)
+
   void _ll_get(Inode *in);
   int _ll_put(Inode *in, int num);
   void _ll_drop_pins();