From: Sage Weil Date: Mon, 26 May 2008 17:27:26 +0000 (-0700) Subject: mds: set dirty flag when subtree root dirfrag gets scatter X-Git-Tag: v0.3~170^2~60 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=40cee8f7f10f4feed3550712ba74e2c45bb9c728;p=ceph.git mds: set dirty flag when subtree root dirfrag gets scatter --- diff --git a/src/include/types.h b/src/include/types.h index fcd4633fc73a..c9d40d899ecb 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 3274762726bb..cb9842f6708d 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 4109113ea7c0..3eac0af84331 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 886b68e71c8d..8122f0634ae1 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 } } }