From: Yan, Zheng Date: Mon, 24 Feb 2014 03:02:23 +0000 (+0800) Subject: client: update dirfragtree/fragmap according to mds request reply X-Git-Tag: v0.79~179^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cdbe413c2988db8609ca30d64779299ae657e5ec;p=ceph.git client: update dirfragtree/fragmap according to mds request reply Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 2651e53e9908..40e95fb582b2 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -598,6 +598,15 @@ void Client::update_inode_file_bits(Inode *in, } } +void Client::_fragmap_remove_non_leaves(Inode *in) +{ + for (map::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! diff --git a/src/client/Client.h b/src/client/Client.h index fb5be31be755..7d9b32b6ae4c 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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();