From 40cee8f7f10f4feed3550712ba74e2c45bb9c728 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 26 May 2008 10:27:26 -0700 Subject: [PATCH] mds: set dirty flag when subtree root dirfrag gets scatter --- src/include/types.h | 4 ++++ src/mds/CDir.cc | 3 +-- src/mds/CDir.h | 4 ++++ src/mds/CInode.cc | 12 ++++++++---- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/include/types.h b/src/include/types.h index fcd4633fc73aa..c9d40d899ecb1 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -250,6 +250,10 @@ struct frag_info_t { }; WRITE_CLASS_ENCODER(frag_info_t) +inline bool operator==(const frag_info_t &l, const frag_info_t &r) { + return memcmp(&l, &r, sizeof(l)) == 0; +} + inline ostream& operator<<(ostream &out, const frag_info_t &f) { return out << "f(v" << f.version << " m" << f.mtime diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 3274762726bb8..cb9842f6708d0 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -822,9 +822,8 @@ void CDir::mark_dirty(version_t pv, LogSegment *ls) void CDir::_mark_dirty(LogSegment *ls) { if (!state_test(STATE_DIRTY)) { - state_set(STATE_DIRTY); dout(10) << "mark_dirty (was clean) " << *this << " version " << get_version() << dendl; - get(PIN_DIRTY); + _set_dirty_flag(); assert(ls); } else { dout(10) << "mark_dirty (already dirty) " << *this << " version " << get_version() << dendl; diff --git a/src/mds/CDir.h b/src/mds/CDir.h index 4109113ea7c0a..3eac0af84331c 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -182,6 +182,10 @@ public: bool is_projected() { return get_projected_version() > get_version(); } version_t pre_dirty(version_t min=0); void _mark_dirty(LogSegment *ls); + void _set_dirty_flag() { + state_set(STATE_DIRTY); + get(PIN_DIRTY); + } void mark_dirty(version_t pv, LogSegment *ls); void mark_clean(); diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 886b68e71c8d6..8122f0634ae18 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -603,7 +603,7 @@ void CInode::decode_lock_state(int type, bufferlist& bl) frag_info_t dirstat; ::decode(dirstat, p); if (!is_auth()) - inode.dirstat = dirstat; // ignore inode summaction unless i'm a replica + inode.dirstat = dirstat; // take inode summation if replica __u32 n; ::decode(n, p); while (n--) { @@ -616,9 +616,13 @@ void CInode::decode_lock_state(int type, bufferlist& bl) assert(dir); // i am auth; i had better have this dir open dir->fnode.fragstat = fragstat; } else { - if (dir) { - dir->fnode.accounted_fragstat = fragstat; - // mark dirty? FIXME + if (dir && + !(dir->fnode.accounted_fragstat == fragstat)) { + dout(10) << " setting accounted_fragstat " << fragstat << " and setting dirty bit on " + << *dir << dendl; + fnode_t *pf = dir->get_projected_fnode(); + pf->accounted_fragstat = fragstat; + dir->_set_dirty_flag(); // bit of a hack } } } -- 2.39.5