From: Yan, Zheng Date: Fri, 28 Nov 2014 08:02:32 +0000 (+0800) Subject: mds: keep locks in sync state when MDS is readonly X-Git-Tag: v0.91~52^2~14^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4aed0476faa52b38346cc2a1a4dacc8e05429fea;p=ceph.git mds: keep locks in sync state when MDS is readonly when transit locks to sync state, we may submit new entries to the log. This should be safe as long as we don't trim old log segments. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index d84ef5f9e2f..3147ead0ca9 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -2500,6 +2500,8 @@ void CInode::decode_snap(bufferlist::iterator& p) client_t CInode::calc_ideal_loner() { + if (mdcache->is_readonly()) + return -1; if (!mds_caps_wanted.empty()) return -1; diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 57350c60a6d..c1903519aaa 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3692,6 +3692,14 @@ void Locker::simple_eval(SimpleLock *lock, bool *need_issue) return; } + if (mdcache->is_readonly()) { + if (lock->get_state() != LOCK_SYNC) { + dout(10) << "simple_eval read-only FS, syncing " << *lock << " on " << *lock->get_parent() << dendl; + simple_sync(lock, need_issue); + } + return; + } + CInode *in = 0; int wanted = 0; if (lock->get_type() != CEPH_LOCK_DN) { @@ -4119,6 +4127,14 @@ void Locker::scatter_eval(ScatterLock *lock, bool *need_issue) dout(20) << " freezing|frozen" << dendl; return; } + + if (mdcache->is_readonly()) { + if (lock->get_state() != LOCK_SYNC) { + dout(10) << "scatter_eval read-only FS, syncing " << *lock << " on " << *lock->get_parent() << dendl; + simple_sync(lock, need_issue); + } + return; + } if (!lock->is_rdlocked() && lock->get_state() != LOCK_MIX && @@ -4226,6 +4242,14 @@ void Locker::scatter_nudge(ScatterLock *lock, MDSInternalContextBase *c, bool fo } */ + if (mdcache->is_readonly()) { + if (lock->get_state() != LOCK_SYNC) { + dout(10) << "scatter_nudge auth, read-only FS, syncing " << *lock << " on " << *p << dendl; + simple_sync(static_cast(lock)); + } + break; + } + // adjust lock state dout(10) << "scatter_nudge auth, scatter/unscattering " << *lock << " on " << *p << dendl; switch (lock->get_type()) { @@ -4468,6 +4492,14 @@ void Locker::file_eval(ScatterLock *lock, bool *need_issue) if (lock->get_parent()->is_freezing_or_frozen()) return; + if (mdcache->is_readonly()) { + if (lock->get_state() != LOCK_SYNC) { + dout(10) << "file_eval read-only FS, syncing " << *lock << " on " << *lock->get_parent() << dendl; + simple_sync(lock, need_issue); + } + return; + } + // excl -> *? if (lock->get_state() == LOCK_EXCL) { dout(20) << " is excl" << dendl;