This is an automated email from the ASF dual-hosted git repository.
alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git
The following commit(s) were added to refs/heads/master by this push:
new 628c5d311 [minidump] a minor cleanup on the minidump code
628c5d311 is described below
commit 628c5d31198a8573db9c61b4a7beac0a090c79ae
Author: Alexey Serbin <[email protected]>
AuthorDate: Mon Jul 17 11:04:22 2023 -0700
[minidump] a minor cleanup on the minidump code
I looked through the code of the minidump wrapper in the context of
KUDU-3491 and cleaned up the related sections a bit:
* explicitly initialize the 'user_signal_handler_thread_running_' field
* changed the signature of the minidump_dir() method to return
'const std::string' and perform an extra sanity check (debug-only)
* changed the type from 'int' to 'size_t' and explicitly initialize
the 'current_num_instances_' static member: that's not necessary per
the C++ standard (at least C++17), but might help to work around
possible compiler bugs
* other minor updates: code style, etc.
Change-Id: I33b0c528975bf50a6fe16b9c2f76eeb685e5dd35
Reviewed-on: http://gerrit.cloudera.org:8080/20206
Reviewed-by: Abhishek Chennaka <[email protected]>
Tested-by: Alexey Serbin <[email protected]>
---
src/kudu/util/minidump.cc | 39 ++++++++++++++++++++++++---------------
src/kudu/util/minidump.h | 12 +++++++-----
2 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/src/kudu/util/minidump.cc b/src/kudu/util/minidump.cc
index 66310b4e6..e7daa403c 100644
--- a/src/kudu/util/minidump.cc
+++ b/src/kudu/util/minidump.cc
@@ -24,6 +24,7 @@
#include <csignal>
#include <cstdint>
#include <cstdlib>
+#include <ctime>
#include <functional>
#include <initializer_list>
#include <memory>
@@ -122,6 +123,8 @@ static sigset_t GetSigset(int signo) {
return signals;
}
+std::atomic<size_t> MinidumpExceptionHandler::current_num_instances_ = 0;
+
#if defined(__linux__)
// Called by the exception handler before minidump is produced.
@@ -204,7 +207,10 @@ bool MinidumpExceptionHandler::WriteMinidump() {
}
Status MinidumpExceptionHandler::InitMinidumpExceptionHandler() {
+ DCHECK(!breakpad_handler_);
+
minidump_dir_ = FLAGS_minidump_path;
+ CHECK(!minidump_dir_.empty());
if (minidump_dir_[0] != '/') {
minidump_dir_ = JoinPathSegments(FLAGS_log_dir, minidump_dir_);
}
@@ -267,20 +273,24 @@ Status
MinidumpExceptionHandler::InitMinidumpExceptionHandler() {
}
Status MinidumpExceptionHandler::RegisterMinidumpExceptionHandler() {
- if (!FLAGS_enable_minidumps) return Status::OK();
+ if (!FLAGS_enable_minidumps) {
+ return Status::OK();
+ }
// Ensure only one active instance is alive per process at any given time.
- CHECK_EQ(0, MinidumpExceptionHandler::current_num_instances_.fetch_add(1));
+ CHECK_EQ(0, current_num_instances_.fetch_add(1));
RETURN_NOT_OK(InitMinidumpExceptionHandler());
- RETURN_NOT_OK(StartUserSignalHandlerThread());
- return Status::OK();
+
+ return StartUserSignalHandlerThread();
}
void MinidumpExceptionHandler::UnregisterMinidumpExceptionHandler() {
- if (!FLAGS_enable_minidumps) return;
+ if (!FLAGS_enable_minidumps) {
+ return;
+ }
StopUserSignalHandlerThread();
- CHECK_EQ(1, MinidumpExceptionHandler::current_num_instances_.fetch_sub(1));
+ CHECK_EQ(1, current_num_instances_.fetch_sub(1));
}
Status MinidumpExceptionHandler::StartUserSignalHandlerThread() {
@@ -315,16 +325,16 @@ void
MinidumpExceptionHandler::RunUserSignalHandlerThread() {
}
}
-#else // defined(__linux__)
+#else // #if defined(__linux__) ...
-// At the time of writing, we don't support breakpad on Mac so we just stub out
-// all the methods defined in the header file.
+// At the time of writing, we support breakpad only on Linux, so we just stub
+// out all the methods defined in the header file, i.e. the methods implemented
+// below in the '#else' macro's scope are all no-op.
Status MinidumpExceptionHandler::InitMinidumpExceptionHandler() {
return Status::OK();
}
-// No-op on non-Linux platforms.
Status MinidumpExceptionHandler::RegisterMinidumpExceptionHandler() {
return Status::OK();
}
@@ -346,9 +356,7 @@ void
MinidumpExceptionHandler::StopUserSignalHandlerThread() {
void MinidumpExceptionHandler::RunUserSignalHandlerThread() {
}
-#endif // defined(__linux__)
-
-std::atomic<int> MinidumpExceptionHandler::current_num_instances_;
+#endif // if defined(__linux__) ... #else ...
MinidumpExceptionHandler::MinidumpExceptionHandler() {
CHECK_OK(RegisterMinidumpExceptionHandler());
@@ -362,7 +370,7 @@ Status
MinidumpExceptionHandler::DeleteExcessMinidumpFiles(Env* env) {
// Do not delete minidump files if minidumps are disabled.
if (!FLAGS_enable_minidumps) return Status::OK();
- int32_t max_minidumps = FLAGS_max_minidumps;
+ const int32_t max_minidumps = FLAGS_max_minidumps;
// Disable rotation if set to 0 or less.
if (max_minidumps <= 0) return Status::OK();
@@ -377,7 +385,8 @@ Status
MinidumpExceptionHandler::DeleteExcessMinidumpFiles(Env* env) {
return env_util::DeleteExcessFilesByPattern(env, pattern, max_minidumps);
}
-string MinidumpExceptionHandler::minidump_dir() const {
+const string& MinidumpExceptionHandler::minidump_dir() const {
+ DCHECK(breakpad_handler_);
return minidump_dir_;
}
diff --git a/src/kudu/util/minidump.h b/src/kudu/util/minidump.h
index 893440ae6..beaaa3478 100644
--- a/src/kudu/util/minidump.h
+++ b/src/kudu/util/minidump.h
@@ -18,6 +18,7 @@
#pragma once
#include <atomic>
+#include <cstddef>
#include <memory>
#include <string>
@@ -65,7 +66,7 @@ class MinidumpExceptionHandler {
Status DeleteExcessMinidumpFiles(Env* env);
// Get the path to the directory that will be used for writing minidumps.
- std::string minidump_dir() const;
+ const std::string& minidump_dir() const;
private:
Status InitMinidumpExceptionHandler();
@@ -79,11 +80,12 @@ class MinidumpExceptionHandler {
// The number of instnaces of this class that are currently in existence.
// We keep this counter in order to force a crash if more than one is running
// at a time, as a sanity check.
- static std::atomic<int> current_num_instances_;
+ static std::atomic<size_t> current_num_instances_;
- #ifndef __APPLE__
- std::atomic<bool> user_signal_handler_thread_running_;// Unused in macOS
build.
- #endif
+#ifndef __APPLE__
+ // Unused in macOS build.
+ std::atomic<bool> user_signal_handler_thread_running_ = false;
+#endif
scoped_refptr<Thread> user_signal_handler_thread_;