Hi Yan, On Thu, 25 Oct 2012, Yan, Zheng wrote: > From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx> > > 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@xxxxxxxxx> > --- > 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 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); -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html