From: John Spray Date: Mon, 1 Jun 2015 14:18:52 +0000 (+0100) Subject: mds: add MDS::damaged_unlocked helper X-Git-Tag: v9.0.3~132^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=136ebf0439cbb73621641d6618f25a36f04b0eda;p=ceph.git mds: add MDS::damaged_unlocked helper ...to avoid doing a lock/damaged/unlock in lots of places in MDLog. Signed-off-by: John Spray --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 4ee502ee1a80..b62ec748aa30 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -847,9 +847,7 @@ void MDLog::_recovery_thread(MDSInternalContextBase *completion) } else if (read_result != 0) { mds->clog->error() << "failed to read JournalPointer: " << read_result << " (" << cpp_strerror(read_result) << ")"; - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(0); // Should be unreachable because damaged() calls respawn() } @@ -877,9 +875,7 @@ void MDLog::_recovery_thread(MDSInternalContextBase *completion) // means something worse like a corrupt header, which we can't handle here. mds->clog->error() << "Error recovering journal " << jp.front << ": " << cpp_strerror(recovery_result); - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(recovery_result == 0); // Unreachable because damaged() calls respawn() } @@ -912,9 +908,7 @@ void MDLog::_recovery_thread(MDSInternalContextBase *completion) if (recovery_result != 0) { mds->clog->error() << "Error recovering journal " << jp.front << ": " << cpp_strerror(recovery_result); - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(recovery_result == 0); // Unreachable because damaged() calls respawn() } @@ -1150,9 +1144,7 @@ void MDLog::_replay_thread() r = -EAGAIN; } else { mds->clog->error() << "missing journal object"; - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(0); // Should be unreachable because damaged() calls respawn() } } else if (r == -EINVAL) { @@ -1163,9 +1155,7 @@ void MDLog::_replay_thread() r = -EAGAIN; } else { mds->clog->error() << "invalid journaler offsets"; - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(0); // Should be unreachable because damaged() calls respawn() } } else { @@ -1188,9 +1178,7 @@ void MDLog::_replay_thread() << dendl; mds->clog->error() << "error reading journal header"; - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(0); // Should be unreachable because damaged() calls // respawn() } @@ -1234,9 +1222,7 @@ void MDLog::_replay_thread() if (g_conf->mds_log_skip_corrupt_events) { continue; } else { - mds->mds_lock.Lock(); - mds->damaged(); - mds->mds_lock.Unlock(); + mds->damaged_unlocked(); assert(0); // Should be unreachable because damaged() calls // respawn() } diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 4f78af193dc2..f3679c43b5dc 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -2423,6 +2423,7 @@ void MDS::handle_signal(int signum) void MDS::damaged() { assert(whoami != MDS_RANK_NONE); + assert(mds_lock.is_locked_by_me()); set_want_state(MDSMap::STATE_DAMAGED); monc->flush_log(); // Flush any clog error from before we were called diff --git a/src/mds/MDS.h b/src/mds/MDS.h index f7335e46bca1..807bbbfa43a8 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -449,9 +449,23 @@ private: * to load an MDS rank's data structures. This is *not* for use with * errors affecting normal dirfrag/inode objects -- they should be handled * through cleaner scrub/repair mechanisms. + * + * Callers must already hold mds_lock. */ void damaged(); + /** + * Wrapper around `damaged` for users who are not + * already holding mds_lock. + * + * Callers must not already hold mds_lock. + */ + void damaged_unlocked() + { + Mutex::Locker l(mds_lock); + damaged(); + } + /** * Terminate this daemon process. *