]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: efficiently drop_rdlocks and drop_xlocks too
authorSage Weil <sage@newdream.net>
Thu, 9 Jun 2011 21:43:05 +0000 (14:43 -0700)
committerSage Weil <sage@newdream.net>
Thu, 9 Jun 2011 23:14:02 +0000 (16:14 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/Locker.cc
src/mds/Locker.h

index 0fd1ac14da6aac1389b196d5871fe7c09e78ed69..c3034d88e94aa91e77df8baa0fcb604fadd6d9f1 100644 (file)
@@ -443,18 +443,47 @@ void Locker::drop_locks(Mutation *mut, set<CInode*> *pneed_issue)
   mut->done_locking = false;
 }
 
-void Locker::drop_non_rdlocks(Mutation *mut)
+void Locker::drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
 {
-  while (!mut->xlocks.empty()) 
-    xlock_finish(*mut->xlocks.begin(), mut);
-  while (!mut->wrlocks.empty()) 
-    wrlock_finish(*mut->wrlocks.begin(), mut);
+  set<CInode*> my_need_issue;
+  if (!pneed_issue)
+    pneed_issue = &my_need_issue;
+
+  while (!mut->xlocks.empty()) {
+    bool ni = false;
+    MDSCacheObject *p = (*mut->xlocks.begin())->get_parent();
+    xlock_finish(*mut->xlocks.begin(), mut, &ni);
+    if (ni)
+      pneed_issue->insert((CInode*)p);
+  }
+  while (!mut->wrlocks.empty()) {
+    bool ni = false;
+    MDSCacheObject *p = (*mut->wrlocks.begin())->get_parent();
+    wrlock_finish(*mut->wrlocks.begin(), mut, &ni);
+    if (ni)
+      pneed_issue->insert((CInode*)p);
+  }
+
+  if (pneed_issue == &my_need_issue)
+    issue_caps_set(*pneed_issue);
 }
 
-void Locker::drop_rdlocks(Mutation *mut)
+void Locker::drop_rdlocks(Mutation *mut, set<CInode*> *pneed_issue)
 {
-  while (!mut->rdlocks.empty()) 
-    rdlock_finish(*mut->rdlocks.begin(), mut);
+  set<CInode*> my_need_issue;
+  if (!pneed_issue)
+    pneed_issue = &my_need_issue;
+
+  while (!mut->rdlocks.empty()) {
+    bool ni = false;
+    MDSCacheObject *p = (*mut->rdlocks.begin())->get_parent();
+    rdlock_finish(*mut->rdlocks.begin(), mut, &ni);
+    if (ni)
+      pneed_issue->insert((CInode*)p);
+  }
+
+  if (pneed_issue == &my_need_issue)
+    issue_caps_set(*pneed_issue);
 }
 
 
index 61f501b479b858e1ab3ea4338ef3d6a6b8e86c9e..801f0c20f271c0ad9ce943d3e96d5bdc5a712911 100644 (file)
@@ -89,8 +89,8 @@ public:
 
   void drop_locks(Mutation *mut, set<CInode*> *pneed_issue=0);
   void set_xlocks_done(Mutation *mut);
-  void drop_non_rdlocks(Mutation *mut);
-  void drop_rdlocks(Mutation *mut);
+  void drop_non_rdlocks(Mutation *mut, set<CInode*> *pneed_issue=0);
+  void drop_rdlocks(Mutation *mut, set<CInode*> *pneed_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);