From 5efda112f2229d41c95e03ed19ee4c2ace1078ad Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 24 Nov 2008 13:23:53 -0800 Subject: [PATCH] mds: rejournal using EUpdate instead of EOpen if no caps in check_inode_max_size Using EOpen on non-open files is imprecise. More importantly, if it is a snapped inode, the EOpen replay code won't be able to look up the ino and will throw an assertion. So, use EUpdate instead to record the new info when necessary. --- src/mds/Locker.cc | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 2603adf4ffc57..6d3e0909318c8 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -932,18 +932,31 @@ bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size) pi->rstat.rbytes = new_size; } - EOpen *le = new EOpen(mds->mdlog); + // use EOpen if the file is still open; otherwise, use EUpdate. + // this is just an optimization to push open files forward into + // newer log segments. + LogEvent *le; + EMetaBlob *metablob; + if (in->is_any_caps()) { + EOpen *eo = new EOpen(mds->mdlog); + eo->add_ino(in->ino()); + metablob = &eo->metablob; + le = eo; + mut->ls->open_files.push_back(&in->xlist_open_file); + } else { + EUpdate *eu = new EUpdate(mds->mdlog, "check_inode_max_size"); + metablob = &eu->metablob; + le = eu; + } if (forceupdate) { // FIXME if/when we do max_size nested accounting - mdcache->predirty_journal_parents(mut, &le->metablob, in, 0, PREDIRTY_PRIMARY); + mdcache->predirty_journal_parents(mut, metablob, in, 0, PREDIRTY_PRIMARY); // no cow, here! CDentry *parent = in->get_projected_parent_dn(); - le->metablob.add_primary_dentry(parent, true, in, in->get_projected_inode()); + metablob->add_primary_dentry(parent, true, in, in->get_projected_inode()); } else { - le->metablob.add_dir_context(in->get_parent_dir()); - mdcache->journal_dirty_inode(mut, &le->metablob, in); + metablob->add_dir_context(in->get_parent_dir()); + mdcache->journal_dirty_inode(mut, metablob, in); } - le->add_ino(in->ino()); - mut->ls->open_files.push_back(&in->xlist_open_file); mds->mdlog->submit_entry(le, new C_Locker_FileUpdate_finish(this, in, mut, true)); file_wrlock_force(&in->filelock, mut); // wrlock for duration of journal mut->auth_pin(in); -- 2.39.5