From: Sage Weil Date: Fri, 12 Sep 2014 22:25:03 +0000 (-0700) Subject: global/signal_handler: do not log if SEGV originated inside log code X-Git-Tag: v0.86~81^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e3fe18aabe5f6d39fafe4bc44a77647f65944bef;p=ceph.git global/signal_handler: do not log if SEGV originated inside log code Signed-off-by: Sage Weil --- diff --git a/src/global/signal_handler.cc b/src/global/signal_handler.cc index ffdc5402cafe..edca694f1c08 100644 --- a/src/global/signal_handler.cc +++ b/src/global/signal_handler.cc @@ -84,23 +84,27 @@ static void handle_fatal_signal(int signum) dout_emergency(buf); pidfile_remove(); - // TODO: don't use an ostringstream here. It could call malloc(), which we - // don't want inside a signal handler. - // Also fix the backtrace code not to allocate memory. - BackTrace bt(0); - ostringstream oss; - bt.print(oss); - dout_emergency(oss.str()); - - // dump to log. this uses the heap extensively, but we're better - // off trying than not. - derr << buf << std::endl; - bt.print(*_dout); - *_dout << " NOTE: a copy of the executable, or `objdump -rdS ` " - << "is needed to interpret this.\n" - << dendl; - - g_ceph_context->_log->dump_recent(); + // avoid recursion back into logging code if that is where + // we got the SEGV. + if (!g_ceph_context->_log->is_inside_log_lock()) { + // TODO: don't use an ostringstream here. It could call malloc(), which we + // don't want inside a signal handler. + // Also fix the backtrace code not to allocate memory. + BackTrace bt(0); + ostringstream oss; + bt.print(oss); + dout_emergency(oss.str()); + + // dump to log. this uses the heap extensively, but we're better + // off trying than not. + derr << buf << std::endl; + bt.print(*_dout); + *_dout << " NOTE: a copy of the executable, or `objdump -rdS ` " + << "is needed to interpret this.\n" + << dendl; + + g_ceph_context->_log->dump_recent(); + } reraise_fatal(signum); }