]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: group finishers after eval_cap_gather does all locks
authorSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 19:23:43 +0000 (12:23 -0700)
committerSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 19:23:43 +0000 (12:23 -0700)
This will reduce some churn, since we can update all the lock states before
worrying about anyone trying to take more than one (and failing, again).

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

index 9082392e180230719c31267552100d0faed3943c..f95888495db4d216e5b03f0d30023cdf5790b430 100644 (file)
@@ -398,7 +398,7 @@ void Locker::drop_rdlocks(Mutation *mut)
 
 // generics
 
-void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue)
+void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, list<Context*> *pfinishers)
 {
   dout(10) << "eval_gather " << *lock << " on " << *lock->get_parent() << dendl;
   assert(!lock->is_stable());
@@ -558,7 +558,11 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue)
       }
     }
 
-    lock->finish_waiters(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK);
+    if (pfinishers)
+      lock->take_waiting(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK,
+                        *pfinishers);
+    else
+      lock->finish_waiters(SimpleLock::WAIT_STABLE|SimpleLock::WAIT_WR|SimpleLock::WAIT_RD|SimpleLock::WAIT_XLOCK);
     
     if (caps)
       need_issue = true;
@@ -665,19 +669,22 @@ void Locker::try_eval(CInode *in, int mask)
 void Locker::eval_cap_gather(CInode *in)
 {
   bool need_issue = false;
+  list<Context*> finishers;
 
   // kick locks now
   if (!in->filelock.is_stable())
-    eval_gather(&in->filelock, false, &need_issue);
+    eval_gather(&in->filelock, false, &need_issue, &finishers);
   if (!in->authlock.is_stable())
-    eval_gather(&in->authlock, false, &need_issue);
+    eval_gather(&in->authlock, false, &need_issue, &finishers);
   if (!in->linklock.is_stable())
-    eval_gather(&in->linklock, false, &need_issue);
+    eval_gather(&in->linklock, false, &need_issue, &finishers);
   if (!in->xattrlock.is_stable())
-    eval_gather(&in->xattrlock, false, &need_issue);
+    eval_gather(&in->xattrlock, false, &need_issue, &finishers);
 
   if (need_issue)
     issue_caps(in);
+
+  finish_contexts(finishers);
 }
 
 void Locker::eval(SimpleLock *lock, bool *need_issue)
index 31ae5ff3e97e89761b53341eee44d621a5ba9578..873432066bd485775764d1613da572a54b2f99aa 100644 (file)
@@ -89,7 +89,7 @@ public:
   void set_xlocks_done(Mutation *mut);
   void drop_rdlocks(Mutation *mut);
 
-  void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0);
+  void eval_gather(SimpleLock *lock, bool first=false, bool *need_issue=0, list<Context*> *pfinishers=0);
   void eval(SimpleLock *lock, bool *need_issue=0);
   void eval_any(SimpleLock *lock, bool *need_issue=0) {
     if (!lock->is_stable())