]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commit
mds: revoke GSHARED cap when finishing xlock
authorYan, Zheng <zheng.z.yan@intel.com>
Tue, 16 Jul 2013 07:21:38 +0000 (15:21 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Mon, 5 Aug 2013 03:09:07 +0000 (11:09 +0800)
commit3c3b2ceb03e7294704f5bf3e1e420012a0166585
tree24da8a12c4b4b5b04256c5562646f65fe6ee3148
parent755581977c2bc9eb81c9d9d955024cbedded2161
mds: revoke GSHARED cap when finishing xlock

If lock state is LOCK_XLOCKDONE, the xlocker can have GSHARED cap.
So when finishing xlock, we may need to revoke the GSHARED cap.

In most cases Locker::_finish_xlock() directly set lock state to
LOCK_LOCK or LOCK_EXCL, which hides the issue. If 'num_rdlock > 0'
or 'num_wrlock > 0' when finishing xlock, the issue reveals.
(lock get stuck in LOCK_XLOCKDONE forever)

The fix is always call Locker::_finish_xlock() when xlock count
reaches zero. _finish_xlock() checks if it can change lock state
to LOCK_EXCL immediately. If not, it uses Locker::eval_gather()
to transit lock state.

Another change of this patch is avoid changing lock state to
LOCK_LOCK directly. because lock in LOCK_XLOCK_DONE state allows
GSHARED cap, lock in LOCK_LOCK state does not.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/Locker.cc
src/mds/Locker.h