From df7f8954c3a2279328ba28911eaab935a889bda8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 7 Jun 2011 09:41:56 -0700 Subject: [PATCH] mds: fix/clean up xlock import/export - create xlock import/export helpers - fix/simplify checks: we want to export/import only xlocks on the inode that is being migrated, unless they are locallock. Signed-off-by: Sage Weil --- src/mds/Locker.cc | 23 +++++++++++++++++++++++ src/mds/Locker.h | 4 ++++ src/mds/Server.cc | 36 ++++++++++++------------------------ 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index fcb594c766582..0e8ccbe294ee4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1174,6 +1174,29 @@ void Locker::xlock_finish(SimpleLock *lock, Mutation *mut) } } +void Locker::xlock_export(SimpleLock *lock, Mutation *mut) +{ + dout(10) << "xlock_export on " << *lock << " " << *lock->get_parent() << dendl; + + lock->put_xlock(); + mut->xlocks.erase(lock); + mut->locks.erase(lock); + + MDSCacheObject *p = lock->get_parent(); + assert(p->state_test(CInode::STATE_AMBIGUOUSAUTH)); // we are exporting this (inode) + + if (!lock->is_stable()) + lock->get_parent()->auth_unpin(lock); + + lock->set_state(LOCK_LOCK); +} + +void Locker::xlock_import(SimpleLock *lock, Mutation *mut) +{ + dout(10) << "xlock_import on " << *lock << " " << *lock->get_parent() << dendl; + lock->get_parent()->auth_pin(lock); +} + // file i/o ----------------------------------------- diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 2b72654fd456e..d2c9e3535946b 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -136,6 +136,10 @@ public: bool xlock_start(SimpleLock *lock, MDRequest *mut); void xlock_finish(SimpleLock *lock, Mutation *mut); // public for Server's slave UNXLOCK + void xlock_export(SimpleLock *lock, Mutation *mut); + void xlock_import(SimpleLock *lock, Mutation *mut); + + // simple public: void try_simple_eval(SimpleLock *lock); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index cf849995ab2fc..d54fa5d922007 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -5377,9 +5377,9 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen for (set::iterator i = mdr->xlocks.begin(); i != mdr->xlocks.end(); ++i) - if (!(*i)->is_locallock() && - (*i)->get_parent() == destdnl->get_inode()) - destdnl->get_inode()->auth_pin(*i); + if ((*i)->get_parent() == destdnl->get_inode() && + !(*i)->is_locallock()) + mds->locker->xlock_import(*i, mdr); } // hack: fix auth bit @@ -5687,30 +5687,18 @@ void Server::_commit_slave_rename(MDRequest *mdr, int r, destdnl->get_inode()->state_test(CInode::STATE_AMBIGUOUSAUTH)) { list finished; + CInode *in = destdnl->get_inode(); + // drop our pins // we exported, clear out any xlocks that we moved to another MDS set::iterator i = mdr->xlocks.begin(); - while(i != mdr->xlocks.end()) { - SimpleLock *lock = *i; - assert(lock->get_parent() == destdnl->inode || - lock->get_parent() == srcdn); - /* if that assert fails then this unlocking code isn't - * intelligent enough. */ - lock->put_xlock(); - if((!lock->is_stable() && - lock->get_sm()->states[lock->get_next_state()].next == 0) && - !lock->is_locallock()) { - dout(20) << "removing lock " << lock << ", will be stable, unpinning" << dendl; - lock->get_parent()->auth_unpin(lock); - } else if (!lock->is_stable()) { - dout(5) << "erasing unstable lock " << lock << lock->get_type() - << " on " << *lock->get_parent() << " without removing pins!" - << dendl; - } else { - dout(20) << "removing lock " << lock << dendl; - } - mdr->xlocks.erase(i++); - mdr->locks.erase(lock); + while (i != mdr->xlocks.end()) { + SimpleLock *lock = *i++; + + // we only care about xlocks on the exported inode + if (lock->get_parent() == in && + !lock->is_locallock()) + mds->locker->xlock_export(lock, mdr); } dout(10) << " finishing inode export on " << *destdnl->get_inode() << dendl; -- 2.39.5