]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix/clean up xlock import/export
authorSage Weil <sage.weil@dreamhost.com>
Tue, 7 Jun 2011 16:41:56 +0000 (09:41 -0700)
committerSage Weil <sage.weil@dreamhost.com>
Tue, 7 Jun 2011 16:41:56 +0000 (09:41 -0700)
- 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 <sage.weil@dreamhost.com>
src/mds/Locker.cc
src/mds/Locker.h
src/mds/Server.cc

index fcb594c766582cb8e44d60f791e539a0d84e0281..0e8ccbe294ee460ffe172e0b0c2932fdc4df04b2 100644 (file)
@@ -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 -----------------------------------------
index 2b72654fd456e761752ad719fc43e6230becf594..d2c9e3535946bfd6fc8219709adc1aaf9d5b860d 100644 (file)
@@ -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);
index cf849995ab2fc5e46aa2a6f11b726bc3ed2bb262..d54fa5d922007ce871d2ff86b350cbe64a3170af 100644 (file)
@@ -5377,9 +5377,9 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen
        for (set<SimpleLock *>::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<Context*> finished;
 
+      CInode *in = destdnl->get_inode();
+
       // drop our pins
       // we exported, clear out any xlocks that we moved to another MDS
       set<SimpleLock*>::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;