From 626c93f7b63567171acc11afaff25c51d2685b1b Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Sun, 21 Oct 2018 10:34:30 +0300 Subject: [PATCH] global: store assert msg in global and dump to crash meta Signed-off-by: Mykola Golub --- src/common/assert.cc | 14 ++++++-------- src/global/global_context.cc | 1 + src/global/global_context.h | 1 + src/global/signal_handler.cc | 3 +++ 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/common/assert.cc b/src/common/assert.cc index 2803e0b7305bc..f5b74263dbaad 100644 --- a/src/common/assert.cc +++ b/src/common/assert.cc @@ -48,13 +48,12 @@ namespace ceph { ostringstream tss; tss << ceph_clock_now(); - char buf[8096]; - snprintf(buf, sizeof(buf), + snprintf(g_assert_msg, sizeof(g_assert_msg), "%s: In function '%s' thread %llx time %s\n" "%s: %d: FAILED ceph_assert(%s)\n", file, func, (unsigned long long)pthread_self(), tss.str().c_str(), file, line, assertion); - dout_emergency(buf); + dout_emergency(g_assert_msg); // TODO: get rid of this memory allocation. ostringstream oss; @@ -62,7 +61,7 @@ namespace ceph { dout_emergency(oss.str()); if (g_assert_context) { - lderr(g_assert_context) << buf << std::endl; + lderr(g_assert_context) << g_assert_msg << std::endl; *_dout << oss.str() << dendl; // dump recent only if the abort signal handler won't do it for us @@ -124,8 +123,7 @@ namespace ceph { ceph_pthread_getname(pthread_self(), g_assert_thread_name, sizeof(g_assert_thread_name)); - char buf[8096]; - BufAppender ba(buf, sizeof(buf)); + BufAppender ba(g_assert_msg, sizeof(g_assert_msg)); BackTrace *bt = new BackTrace(1); ba.printf("%s: In function '%s' thread %llx time %s\n" "%s: %d: FAILED ceph_assert(%s)\n", @@ -137,7 +135,7 @@ namespace ceph { ba.vprintf(msg, args); va_end(args); ba.printf("\n"); - dout_emergency(buf); + dout_emergency(g_assert_msg); // TODO: get rid of this memory allocation. ostringstream oss; @@ -145,7 +143,7 @@ namespace ceph { dout_emergency(oss.str()); if (g_assert_context) { - lderr(g_assert_context) << buf << std::endl; + lderr(g_assert_context) << g_assert_msg << std::endl; *_dout << oss.str() << dendl; // dump recent only if the abort signal handler won't do it for us diff --git a/src/global/global_context.cc b/src/global/global_context.cc index 0eb6e62bf3dd2..4adfa0ff28bc7 100644 --- a/src/global/global_context.cc +++ b/src/global/global_context.cc @@ -33,3 +33,4 @@ const char *g_assert_func = 0; const char *g_assert_condition = 0; unsigned long long g_assert_thread = 0; char g_assert_thread_name[4096]; +char g_assert_msg[8096]; diff --git a/src/global/global_context.h b/src/global/global_context.h index a58e4b26c9046..59031f4c68fbb 100644 --- a/src/global/global_context.h +++ b/src/global/global_context.h @@ -28,5 +28,6 @@ extern const char *g_assert_func; extern const char *g_assert_condition; extern unsigned long long g_assert_thread; extern char g_assert_thread_name[4096]; +extern char g_assert_msg[8096]; #endif diff --git a/src/global/signal_handler.cc b/src/global/signal_handler.cc index 3ac35626cb35e..45155b3bf16e1 100644 --- a/src/global/signal_handler.cc +++ b/src/global/signal_handler.cc @@ -249,6 +249,9 @@ static void handle_fatal_signal(int signum) if (g_assert_thread_name[0]) { jf.dump_string("assert_thread_name", g_assert_thread_name); } + if (g_assert_msg[0]) { + jf.dump_string("assert_msg", g_assert_msg); + } // backtrace bt.dump(&jf); -- 2.39.5