From: John Spray Date: Wed, 9 Apr 2014 10:17:30 +0000 (+0100) Subject: mds: Add EMetaBlob::get_dentries X-Git-Tag: v0.82~48^2~35 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=220f9c96a3a8ff4dccd893b4fb7fe3a680242a8c;p=ceph.git mds: Add EMetaBlob::get_dentries For tools that would like to know which dentries are touched by a metablob, without understanding its internal format. Signed-off-by: John Spray --- diff --git a/src/mds/events/EMetaBlob.h b/src/mds/events/EMetaBlob.h index 9e001d9b0b7..7fb7d67615b 100644 --- a/src/mds/events/EMetaBlob.h +++ b/src/mds/events/EMetaBlob.h @@ -315,6 +315,8 @@ private: void decode(bufferlist::iterator& bl); void get_inodes(std::set &inodes); void get_paths(std::vector &paths); + void get_dentries(std::map > &dentries); + void dump(Formatter *f) const; static void generate_test_instances(list& ls); // soft stateadd diff --git a/src/mds/journal.cc b/src/mds/journal.cc index b98676fd87a..83e2f665efb 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -850,8 +850,46 @@ void EMetaBlob::get_inodes( } +/** + * Get a map of dirfrag to set of dentries in that dirfrag which are + * touched in this operation. + */ +void EMetaBlob::get_dentries(std::map > &dentries) +{ + for (std::map::iterator i = lump_map.begin(); i != lump_map.end(); ++i) { + inodeno_t const dir_ino = i->first.ino; + dirlump &dl = i->second; + dirfrag_t &df = i->first; + + // Get all bits + dl._decode_bits(); + list > &fb_list = dl.get_dfull(); + list &nb_list = dl.get_dnull(); + list &rb_list = dl.get_dremote(); + + // For all bits, store dentry + for (list >::const_iterator + iter = fb_list.begin(); iter != fb_list.end(); ++iter) { + dentries[df].insert((*iter)->dn); + + } + for (list::const_iterator + iter = nb_list.begin(); iter != nb_list.end(); ++iter) { + dentries[df].insert(iter->dn); + } + for (list::const_iterator + iter = rb_list.begin(); iter != rb_list.end(); ++iter) { + dentries[df].insert(iter->dn); + } + } +} + + /** + * Calculate all paths that we can infer are touched by this metablob. Only uses + * information local to this metablob so it may only be the path within the + * subtree. * * This is not const because the contained dirlump and 'bit' objects * are modified by being decoded.