From 2d60956c8befab3b0b468c9d25c2a3bac96d3d7a Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 8 Aug 2017 15:48:28 +0800 Subject: [PATCH] mds: keep isnap lock in sync state unlike locks of other types, isnap lock and dentry lock in unreadable state can block path traverse, so it should be in sync state as much as possible. Signed-off-by: "Yan, Zheng" --- src/mds/Locker.cc | 20 ++++++++++++-------- src/mds/Migrator.cc | 4 ++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 4ab6d6194fe..0dac32aedfa 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1187,7 +1187,9 @@ void Locker::try_eval(SimpleLock *lock, bool *pneed_issue) } } - if (lock->get_type() != CEPH_LOCK_DN && p->is_freezing()) { + if (lock->get_type() != CEPH_LOCK_DN && + lock->get_type() != CEPH_LOCK_ISNAP && + p->is_freezing()) { dout(7) << "try_eval " << *lock << " freezing, waiting on " << *p << dendl; p->add_waiter(MDSCacheObject::WAIT_UNFREEZE, new C_Locker_Eval(this, p, lock->get_type())); return; @@ -1696,11 +1698,12 @@ bool Locker::xlock_start(SimpleLock *lock, MDRequestRef& mut) void Locker::_finish_xlock(SimpleLock *lock, client_t xlocker, bool *pneed_issue) { assert(!lock->is_stable()); - if (lock->get_num_rdlocks() == 0 && + if (lock->get_type() != CEPH_LOCK_DN && + lock->get_type() != CEPH_LOCK_ISNAP && + lock->get_num_rdlocks() == 0 && lock->get_num_wrlocks() == 0 && !lock->is_leased() && - lock->get_state() != LOCK_XLOCKSNAP && - lock->get_type() != CEPH_LOCK_DN) { + lock->get_state() != LOCK_XLOCKSNAP) { CInode *in = static_cast(lock->get_parent()); client_t loner = in->get_target_loner(); if (loner >= 0 && (xlocker < 0 || xlocker == loner)) { @@ -4051,10 +4054,11 @@ void Locker::simple_eval(SimpleLock *lock, bool *need_issue) assert(lock->is_stable()); if (lock->get_parent()->is_freezing_or_frozen()) { - // dentry lock in unreadable state can block path traverse - if ((lock->get_type() != CEPH_LOCK_DN || + // dentry/snap lock in unreadable state can block path traverse + if ((lock->get_type() != CEPH_LOCK_DN && + lock->get_type() != CEPH_LOCK_ISNAP) || lock->get_state() == LOCK_SYNC || - lock->get_parent()->is_frozen())) + lock->get_parent()->is_frozen()) return; } @@ -4068,7 +4072,7 @@ void Locker::simple_eval(SimpleLock *lock, bool *need_issue) CInode *in = 0; int wanted = 0; - if (lock->get_type() != CEPH_LOCK_DN) { + if (lock->get_cap_shift()) { in = static_cast(lock->get_parent()); in->get_caps_wanted(&wanted, NULL, lock->get_cap_shift()); } diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index a28be44bc3d..d09a96aa3a8 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -3038,6 +3038,10 @@ void Migrator::decode_import_inode(CDentry *dn, bufferlist::iterator& blp, in->add_replica(oldauth, CInode::EXPORT_NONCE); if (in->is_replica(mds->get_nodeid())) in->remove_replica(mds->get_nodeid()); + + if (in->snaplock.is_stable() && + in->snaplock.get_state() != LOCK_SYNC) + mds->locker->try_eval(&in->snaplock, NULL); } void Migrator::decode_import_inode_caps(CInode *in, bool auth_cap, -- 2.39.5