From 4aed0476faa52b38346cc2a1a4dacc8e05429fea Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 28 Nov 2014 16:02:32 +0800 Subject: [PATCH] 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 --- src/mds/CInode.cc | 2 ++ src/mds/Locker.cc | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) 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; -- 2.47.3