From: Yan, Zheng Date: Tue, 8 Aug 2017 07:48:28 +0000 (+0800) Subject: mds: keep isnap lock in sync state X-Git-Tag: v13.1.0~413^2~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2d60956c8befab3b0b468c9d25c2a3bac96d3d7a;p=ceph.git 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" --- 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,