diff mbox

[4/4] mds: Allow evaluating locks in replica object.

Message ID alpine.DEB.2.00.1210261548020.26041@cobra.newdream.net (mailing list archive)
State New, archived
Headers show

Commit Message

Sage Weil Oct. 26, 2012, 10:49 p.m. UTC
Hi Yan,

On Thu, 25 Oct 2012, Yan, Zheng wrote:
> From: "Yan, Zheng" <zheng.z.yan@intel.com>
> 
> We should allow Locker::try_eval(MDSCacheObject *, int) to evaluate
> locks in replica objects. Otherwise the locks in replica objects
> may stuck on unstable states forever.
> 
> Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
> ---
>  src/mds/Locker.cc | 15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc
> index a03789f..2c840a9 100644
> --- a/src/mds/Locker.cc
> +++ b/src/mds/Locker.cc
> @@ -834,12 +834,7 @@ void Locker::try_eval(MDSCacheObject *p, int mask)
>      return;
>    }
>  
> -  if (!p->is_auth()) {
> -    dout(7) << "try_eval not auth for " << *p << dendl;
> -    return;
> -  }
> -
> -  if (!p->can_auth_pin()) {
> +  if (p->is_auth() && !p->can_auth_pin()) {
>      dout(7) << "try_eval can't auth_pin, waiting on " << *p << dendl;
>      p->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_Eval(this, p, mask));
>      return;
> @@ -847,9 +842,11 @@ void Locker::try_eval(MDSCacheObject *p, int mask)
>  
>    if (mask & CEPH_LOCK_DN) {
>      assert(mask == CEPH_LOCK_DN);
> -    bool need_issue = false;  // ignore this, no caps on dentries
> -    CDentry *dn = (CDentry *)p;
> -    simple_eval(&dn->lock, &need_issue);
> +    if (p->is_auth()) {
> +      bool need_issue = false;  // ignore this, no caps on dentries
> +      CDentry *dn = (CDentry *)p;
> +      simple_eval(&dn->lock, &need_issue);
> +    }
>    } else {
>      CInode *in = (CInode *)p;
>      eval(in, mask);
> -- 
> 1.7.11.7

I handled this one a bit differently.  I think we should still consider 
the non-auth eval_gather() case on the dentry.  I applied the below to the 
wip-mds branch.. look okay?  Notably, eval(CInode*,...) calls eval_any() 
on all of the masked locks, so the path is symmetrical.

Thanks!
sage



--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc
index a03789f..e033bbe 100644
--- a/src/mds/Locker.cc
+++ b/src/mds/Locker.cc
@@ -834,12 +834,7 @@  void Locker::try_eval(MDSCacheObject *p, int mask)
     return;
   }
 
-  if (!p->is_auth()) {
-    dout(7) << "try_eval not auth for " << *p << dendl;
-    return;
-  }
-
-  if (!p->can_auth_pin()) {
+  if (p->is_auth() && !p->can_auth_pin()) {
     dout(7) << "try_eval can't auth_pin, waiting on " << *p << dendl;
     p->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_Eval(this, p, mask));
     return;
@@ -849,7 +844,7 @@  void Locker::try_eval(MDSCacheObject *p, int mask)
     assert(mask == CEPH_LOCK_DN);
     bool need_issue = false;  // ignore this, no caps on dentries
     CDentry *dn = (CDentry *)p;
-    simple_eval(&dn->lock, &need_issue);
+    eval_any(&dn->lock, &need_issue);
   } else {
     CInode *in = (CInode *)p;
     eval(in, mask);