From: IvanGuan Date: Thu, 29 Nov 2018 08:41:14 +0000 (+0800) Subject: mds: fix bug filelock stuck at LOCK_XSYN leading client can't read data X-Git-Tag: v12.2.11~29^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=90a6027a9d94b26b205c2ce01eb034a45ec55876;p=ceph.git mds: fix bug filelock stuck at LOCK_XSYN leading client can't read data The file's wanted_loner_cap will be -1 when more than one client open it.Sometimes the loner can't be dropped successfully which will leading filelock stuck at LOCK_XSYN.However,this state doesn't allow others any caps so the client open the file by O_RDONLY can't read data all the time untill someone else open it by O_RDWR or O_WRONLY.We should change the state to LOCK_MIX or LOCK_SYNC instead of stucking all the time. Fixes: http://tracker.ceph.com/issues/37333 Signed-off-by: Guan yunfei (cherry picked from commit c3339d93f04030197d075e8a9c7235dba08530cf) --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 058fcae7642..feb00ac83c4 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -4871,7 +4871,7 @@ void Locker::file_eval(ScatterLock *lock, bool *need_issue) else if (lock->get_state() != LOCK_SYNC && !lock->is_wrlocked() && // drain wrlocks first! !lock->is_waiter_for(SimpleLock::WAIT_WR) && - !(wanted & (CEPH_CAP_GWR|CEPH_CAP_GBUFFER)) && + !(wanted & CEPH_CAP_GWR) && !((lock->get_state() == LOCK_MIX) && in->is_dir() && in->has_subtree_or_exporting_dirfrag()) // if we are a delegation point, stay where we are //((wanted & CEPH_CAP_RD) ||