From 7aef5444b86cb72c2eddfd05b402e73fddec23b5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 27 Apr 2011 10:00:30 -0700 Subject: [PATCH] mds: merge accounted_* stats Signed-off-by: Sage Weil --- src/mds/CDir.cc | 22 ++++++++++++++++++++-- src/mds/mdstypes.h | 7 +++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 8493c9e2791..c718145b0f7 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -853,6 +853,10 @@ void CDir::merge(list& subs, list& waiters, bool replay) { dout(10) << "merge " << subs << dendl; + // see if _any_ of the source frags have stale fragstat or rstat + int stale_rstat = 0; + int stale_fragstat = 0; + for (list::iterator p = subs.begin(); p != subs.end(); p++) { CDir *dir = *p; dout(10) << " subfrag " << dir->get_frag() << " " << *dir << dendl; @@ -875,11 +879,21 @@ void CDir::merge(list& subs, list& waiters, bool replay) if (dir->get_version() > get_version()) set_version(dir->get_version()); - if (fnode.fragstat.version == 0) + // *stat versions + if (fnode.fragstat.version < dir->fnode.fragstat.version) fnode.fragstat.version = dir->fnode.fragstat.version; - if (fnode.rstat.version == 0) + if (fnode.rstat.version < dir->fnode.rstat.version) fnode.rstat.version = dir->fnode.rstat.version; + if (dir->fnode.accounted_fragstat.version != dir->fnode.fragstat.version) + stale_fragstat = 1; + if (dir->fnode.accounted_rstat.version != dir->fnode.rstat.version) + stale_rstat = 1; + + // sum accounted_* + fnode.accounted_fragstat.add(dir->fnode.accounted_fragstat); + fnode.accounted_rstat.add(dir->fnode.accounted_rstat, 1); + // merge state state_set(dir->get_state() & MASK_STATE_FRAGMENT_KEPT); dir_auth = dir->dir_auth; @@ -888,6 +902,10 @@ void CDir::merge(list& subs, list& waiters, bool replay) inode->close_dirfrag(dir->get_frag()); } + // offset accounted_* version by -1 if any source frag was stale + fnode.accounted_fragstat.version = fnode.fragstat.version - stale_fragstat; + fnode.accounted_rstat.version = fnode.rstat.version - stale_rstat; + init_fragment_pins(); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index ffc738f4b3b..a88ceac4b16 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -140,6 +140,13 @@ struct frag_info_t : public scatter_info_t { nsubdirs += cur.nsubdirs - acc.nsubdirs; } + void add(const frag_info_t& other) { + if (other.mtime > mtime) + mtime = other.mtime; + nfiles += other.nfiles; + nsubdirs += other.nsubdirs; + } + void encode(bufferlist &bl) const { __u8 v = 1; ::encode(v, bl); -- 2.47.3