]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: make scatterlock flush on mix <-> lock transitions, not just mix <-> sync
authorSage Weil <sage@newdream.net>
Fri, 20 Mar 2009 23:54:20 +0000 (16:54 -0700)
committerSage Weil <sage@newdream.net>
Fri, 20 Mar 2009 23:56:42 +0000 (16:56 -0700)
Among other things, this fixes up mds (>0) shutdown.

src/mds/Locker.cc
src/mds/ScatterLock.h

index fbc592ca2b5d80d7f8139a93b1b2d833a42fde5d..99e35e646e58f2db5e7afd562a512baac3496e3d 100644 (file)
@@ -465,6 +465,7 @@ void Locker::eval_gather(SimpleLock *lock, bool first)
            bufferlist data;
            lock->encode_locked_state(data);
            mds->send_message_mds(new MLock(lock, LOCK_AC_LOCKACK, mds->get_nodeid(), data), auth);
+           ((ScatterLock *)lock)->start_flush();
          }
          break;
 
@@ -3061,6 +3062,8 @@ void Locker::handle_file_lock(ScatterLock *lock, MLock *m)
     lock->decode_locked_state(m->get_data());
     lock->set_state(LOCK_SYNC);
 
+    ((ScatterLock *)lock)->finish_flush();
+
     lock->get_rdlock();
     lock->finish_waiters(SimpleLock::WAIT_RD|SimpleLock::WAIT_STABLE);
     lock->put_rdlock();
@@ -3092,6 +3095,8 @@ void Locker::handle_file_lock(ScatterLock *lock, MLock *m)
     lock->decode_locked_state(m->get_data());
     lock->set_state(LOCK_MIX);
 
+    ((ScatterLock *)lock)->finish_flush();
+
     if (caps)
       issue_caps(in);
     
index 3fa61ae30e112f356ab291a7ebdbbde2b3c1e387..211be26da46e41ffe1eff9af60cbf68c9f2b6228 100644 (file)
@@ -51,10 +51,12 @@ public:
     dirty = false;
   }
   void finish_flush() {
-    flushing = false;
-    if (!dirty) {
-      parent->put(MDSCacheObject::PIN_DIRTYSCATTERED);
-      parent->clear_dirty_scattered(type);
+    if (flushing) {
+      flushing = false;
+      if (!dirty) {
+       parent->put(MDSCacheObject::PIN_DIRTYSCATTERED);
+       parent->clear_dirty_scattered(type);
+      }
     }
   }
   void clear_dirty() {