From cdbe413c2988db8609ca30d64779299ae657e5ec Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Mon, 24 Feb 2014 11:02:23 +0800 Subject: [PATCH] client: update dirfragtree/fragmap according to mds request reply Signed-off-by: Yan, Zheng --- src/client/Client.cc | 19 +++++++++++++++++-- src/client/Client.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2651e53e990..40e95fb582b 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 fb5be31be75..7d9b32b6ae4 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(); -- 2.47.3