From: John Spray Date: Wed, 29 Apr 2015 20:51:04 +0000 (+0100) Subject: mds: more damaged() handling in MDLog X-Git-Tag: v9.0.2~217^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=49efdb8bef325841e3a060e4654eb9e9fe2ac697;p=ceph.git mds: more damaged() handling in MDLog Specifically, the case where journal header objects are unreadable (such as because they've been lost). Signed-off-by: John Spray --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 2e08d1b47206..9a0f8442a765 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -870,10 +870,17 @@ void MDLog::_recovery_thread(MDSInternalContextBase *completion) C_SaferCond recover_wait; back.recover(&recover_wait); int recovery_result = recover_wait.wait(); + if (recovery_result != 0) { + // Journaler.recover succeeds if no journal objects are present: an error + // 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(); + assert(recovery_result == 0); // Unreachable because damaged() calls respawn() + } - // Journaler.recover succeeds if no journal objects are present: an error - // means something worse like a corrupt header, which we can't handle here. - assert(recovery_result == 0); // We could read journal, so we can erase it. back.erase(&erase_waiter); int erase_result = erase_waiter.wait(); @@ -901,11 +908,12 @@ void MDLog::_recovery_thread(MDSInternalContextBase *completion) dout(4) << "Journal " << jp.front << " recovered." << dendl; if (recovery_result != 0) { - derr << "Error recovering journal " << jp.front << ": " << cpp_strerror(recovery_result) << dendl; + mds->clog->error() << "Error recovering journal " << jp.front << ": " + << cpp_strerror(recovery_result); mds->mds_lock.Lock(); - completion->complete(recovery_result); + mds->damaged(); mds->mds_lock.Unlock(); - return; + assert(recovery_result == 0); // Unreachable because damaged() calls respawn() } /* Check whether the front journal format is acceptable or needs re-write */