From: Sage Weil Date: Mon, 26 May 2008 06:06:44 +0000 (-0700) Subject: mds: scatter writebehind cleanup. X-Git-Tag: v0.3~170^2~61 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=01af201198e519eb8abcdb4d4cef4908cf8b1ccc;p=ceph.git mds: scatter writebehind cleanup. --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index cb85ee26aafd..886b68e71c8d 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -656,13 +656,20 @@ void CInode::finish_scatter_gather_update(int type) { // adjust summation assert(is_auth()); - inode.dirstat.version++; + inode_t *pi = get_projected_inode(); + dout(20) << " orig dirstat " << pi->dirstat << dendl; + pi->dirstat.version++; for (map::iterator p = dirfrags.begin(); p != dirfrags.end(); p++) { - inode.dirstat.take_diff(p->second->fnode.fragstat, - p->second->fnode.accounted_fragstat); + fnode_t *pf = p->second->get_projected_fnode(); + dout(20) << " frag " << p->first + << " " << pf->fragstat + << " " << pf->accounted_fragstat << dendl; + pi->dirstat.take_diff(pf->fragstat, + pf->accounted_fragstat); } + dout(20) << " final dirstat " << pi->dirstat << dendl; } break; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index b918d9b21c4e..dbb035c93beb 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1218,10 +1218,10 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob, bool primary_dn, bool do_parent, int linkunlink, EMetaBlob *rollback) { - dout(10) << "predirty_nested " - << (do_parent ? "do_parent_mtime ":"") - << "linkunlink=" << linkunlink - << (primary_dn ? "primary_dn ":"remote_dn ") + dout(10) << "predirty_nested" + << (do_parent ? " do_parent_mtime":"") + << " linkunlink=" << linkunlink + << (primary_dn ? " primary_dn":" remote_dn") << " " << *in << dendl; if (!parent) { @@ -1312,6 +1312,7 @@ void Locker::predirty_nested(Mutation *mut, EMetaBlob *blob, } if (stop) { dout(10) << "predirty_nested stop. marking dirlock on " << *pin << dendl; + pin->dirlock.set_updated(); mut->add_updated_scatterlock(&pin->dirlock); mut->ls->dirty_dirfrag_dir.push_back(&pin->xlist_dirty_dirfrag_dir); break; @@ -1936,6 +1937,9 @@ void Locker::scatter_rdlock_finish(ScatterLock *lock, Mutation *mut) bool Locker::scatter_wrlock_try(ScatterLock *lock, Mutation *mut) { + dout(7) << "scatter_wrlock_try on " << *lock + << " on " << *lock->get_parent() << dendl; + // pre-twiddle? if (lock->get_parent()->is_auth() && !lock->get_parent()->is_replicated() && @@ -1954,21 +1958,6 @@ bool Locker::scatter_wrlock_try(ScatterLock *lock, Mutation *mut) return true; } - return false; -} - -bool Locker::scatter_wrlock_start(ScatterLock *lock, MDRequest *mut) -{ - dout(7) << "scatter_wrlock_start on " << *lock - << " on " << *lock->get_parent() << dendl; - - if (scatter_wrlock_try(lock, mut)) - return true; - - // wait for write. - lock->add_waiter(SimpleLock::WAIT_WR|SimpleLock::WAIT_STABLE, - new C_MDS_RetryRequest(mdcache, mut)); - // initiate scatter or lock? if (lock->is_stable()) { if (lock->get_parent()->is_auth()) { @@ -1990,6 +1979,20 @@ bool Locker::scatter_wrlock_start(ScatterLock *lock, MDRequest *mut) return false; } +bool Locker::scatter_wrlock_start(ScatterLock *lock, MDRequest *mut) +{ + dout(7) << "scatter_wrlock_start on " << *lock + << " on " << *lock->get_parent() << dendl; + + if (scatter_wrlock_try(lock, mut)) + return true; + + // wait for write. + lock->add_waiter(SimpleLock::WAIT_WR|SimpleLock::WAIT_STABLE, + new C_MDS_RetryRequest(mdcache, mut)); + return false; +} + void Locker::scatter_wrlock_finish(ScatterLock *lock, Mutation *mut) { dout(7) << "scatter_wrlock_finish on " << *lock @@ -2138,11 +2141,15 @@ void Locker::scatter_eval_gather(ScatterLock *lock) !lock->is_gathering() && lock->get_num_client_lease() == 0 && !lock->is_rdlocked()) { - dout(7) << "scatter_eval finished lock gather/un-rdlock on " << *lock - << " on " << *lock->get_parent() << dendl; - lock->set_state(LOCK_LOCK); - lock->finish_waiters(ScatterLock::WAIT_XLOCK|ScatterLock::WAIT_STABLE); - lock->get_parent()->auth_unpin(); + if (lock->is_updated()) { + scatter_writebehind(lock); + } else { + dout(7) << "scatter_eval finished lock gather/un-rdlock on " << *lock + << " on " << *lock->get_parent() << dendl; + lock->set_state(LOCK_LOCK); + lock->finish_waiters(ScatterLock::WAIT_XLOCK|ScatterLock::WAIT_STABLE); + lock->get_parent()->auth_unpin(); + } } // glockc -> lock? @@ -2213,8 +2220,9 @@ void Locker::scatter_eval_gather(ScatterLock *lock) // re-eval? - if (lock->is_stable()) // && lock->get_parent()->can_auth_pin()) + if (lock->is_stable()) { // && lock->get_parent()->can_auth_pin()) scatter_eval(lock); + } } } @@ -2231,28 +2239,38 @@ void Locker::scatter_writebehind(ScatterLock *lock) return; } - // journal write-behind. + // journal + Mutation *mut = new Mutation; + mut->ls = mds->mdlog->get_current_segment(); + + // forcefully take a wrlock + lock->get_wrlock(true); + mut->wrlocks.insert(lock); + mut->locks.insert(lock); + inode_t *pi = in->project_inode(); - pi->mtime = in->inode.mtime; // make sure an intermediate version isn't goofing us up - pi->version = in->pre_dirty(); + //????pi->mtime = in->inode.mtime; // make sure an intermediate version isn't goofing us up + pi->version = in->pre_dirty(); lock->get_parent()->finish_scatter_gather_update(lock->get_type()); EUpdate *le = new EUpdate(mds->mdlog, "scatter writebehind"); - le->metablob.add_dir_context(in->get_parent_dn()->get_dir()); + predirty_nested(mut, &le->metablob, in, 0, true, false); le->metablob.add_primary_dentry(in->get_parent_dn(), true, 0, pi); mds->mdlog->submit_entry(le); - mds->mdlog->wait_for_sync(new C_Locker_ScatterWB(this, lock, mds->mdlog->get_current_segment())); + mds->mdlog->wait_for_sync(new C_Locker_ScatterWB(this, lock, mut)); } -void Locker::scatter_writebehind_finish(ScatterLock *lock, LogSegment *ls) +void Locker::scatter_writebehind_finish(ScatterLock *lock, Mutation *mut) { CInode *in = (CInode*)lock->get_parent(); dout(10) << "scatter_writebehind_finish on " << *lock << " on " << *in << dendl; - in->pop_and_dirty_projected_inode(ls); + in->pop_and_dirty_projected_inode(mut->ls); + mut->apply(); lock->clear_updated(); - scatter_eval_gather(lock); + drop_locks(mut); + //scatter_eval_gather(lock); } void Locker::scatter_eval(ScatterLock *lock) diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 2e1fc01b8487..42772b979e41 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -148,14 +148,14 @@ protected: class C_Locker_ScatterWB : public Context { Locker *locker; ScatterLock *lock; - LogSegment *ls; + Mutation *mut; public: - C_Locker_ScatterWB(Locker *l, ScatterLock *sl, LogSegment *s) : locker(l), lock(sl), ls(s) {} + C_Locker_ScatterWB(Locker *l, ScatterLock *sl, Mutation *m) : locker(l), lock(sl), mut(m) {} void finish(int r) { - locker->scatter_writebehind_finish(lock, ls); + locker->scatter_writebehind_finish(lock, mut); } }; - void scatter_writebehind_finish(ScatterLock *lock, LogSegment *ls); + void scatter_writebehind_finish(ScatterLock *lock, Mutation *mut); public: void predirty_nested(Mutation *mut, EMetaBlob *blob, CInode *in, CDir *dir, diff --git a/src/mds/ScatterLock.h b/src/mds/ScatterLock.h index 97e09f0032d9..e1adeb9d91f5 100644 --- a/src/mds/ScatterLock.h +++ b/src/mds/ScatterLock.h @@ -150,8 +150,8 @@ public: bool can_wrlock() { return state == LOCK_SCATTER || state == LOCK_LOCK; } - void get_wrlock() { - assert(can_wrlock()); + void get_wrlock(bool force=false) { + assert(can_wrlock() || force); if (num_wrlock == 0) parent->get(MDSCacheObject::PIN_LOCK); ++num_wrlock; }