From: Yan, Zheng Date: Wed, 17 Jul 2013 05:52:18 +0000 (+0800) Subject: mds: handle "state == LOCK_LOCK_XLOCK" when cancelling xlock X-Git-Tag: v0.68~99^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f86828d149f0ae89f49faa83f2a04ee711a22b23;p=ceph.git mds: handle "state == LOCK_LOCK_XLOCK" when cancelling xlock If we find lock state is LOCK_LOCK_XLOCK when cancelling xlock, set lock state to LOCK_XLOCK_DONE and call Locker::eval_gather(). This makes sure the lock will eventually transit to a stable state. (LOCK_XLOCK_DONE's next state is stable) Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index d2d47fbb55db..efb5a741362e 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -544,8 +544,13 @@ void Locker::cancel_locking(Mutation *mut, set *pneed_issue) if (lock->get_parent()->is_auth()) { bool need_issue = false; - if (lock->get_state() == LOCK_PREXLOCK) + if (lock->get_state() == LOCK_PREXLOCK) { _finish_xlock(lock, -1, &need_issue); + } else if (lock->get_state() == LOCK_LOCK_XLOCK && + lock->get_num_xlocks() == 0) { + lock->set_state(LOCK_XLOCKDONE); + eval_gather(lock, true, &need_issue); + } if (need_issue) pneed_issue->insert(static_cast(lock->get_parent())); } @@ -1516,8 +1521,11 @@ void Locker::xlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue) SimpleLock::WAIT_WR | SimpleLock::WAIT_RD, 0); } else { - if (lock->get_num_xlocks() == 0) + if (lock->get_num_xlocks() == 0) { + if (lock->get_state() == LOCK_LOCK_XLOCK) + lock->set_state(LOCK_XLOCKDONE); _finish_xlock(lock, xlocker, &do_issue); + } } if (do_issue) {