From 0f094cb0dc8be795afbe0b032ac4b761c0482c87 Mon Sep 17 00:00:00 2001 From: Ethan Arrowood Date: Thu, 1 Feb 2024 20:20:29 -0700 Subject: [PATCH] report: add --report-disable-network option New option `--report-disable-network`, also available as `report.disableNetwork`, enables the user to disable networking interfaces in their diagnostic report. On some systems, this can cause the report to take minutes to generate so this option can be used to optimize that. fixes: https://github.com/nodejs/node/issues/46060 --- lib/internal/process/report.js | 7 +++++++ src/node_options.cc | 5 +++++ src/node_options.h | 1 + src/node_report.cc | 28 +++++++++++++++++++++++----- src/node_report_module.cc | 17 +++++++++++++++++ test/report/test-report-config.js | 11 +++++++++++ 6 files changed, 64 insertions(+), 5 deletions(-) diff --git a/lib/internal/process/report.js b/lib/internal/process/report.js index 9889f913c3f81f..2ca7557620c0b2 100644 --- a/lib/internal/process/report.js +++ b/lib/internal/process/report.js @@ -60,6 +60,13 @@ const report = { validateBoolean(b, 'compact'); nr.setCompact(b); }, + get disableNetwork() { + return nr.getDisableNetwork(); + }, + set disableNetwork(b) { + validateBoolean(b, 'disableNetwork'); + nr.setDisableNetwork(b); + }, get signal() { return nr.getSignal(); }, diff --git a/src/node_options.cc b/src/node_options.cc index 7b5152172c5ce7..c807cc9bd6d90f 100644 --- a/src/node_options.cc +++ b/src/node_options.cc @@ -950,6 +950,11 @@ PerProcessOptionsParser::PerProcessOptionsParser( "generate diagnostic report on fatal (internal) errors", &PerProcessOptions::report_on_fatalerror, kAllowedInEnvvar); + AddOption("--report-disable-network", + "disable network interface diagnostics." + " (default: false)", + &PerProcessOptions::report_disable_network, + kAllowedInEnvvar); #ifdef NODE_HAVE_I18N_SUPPORT AddOption("--icu-data-dir", diff --git a/src/node_options.h b/src/node_options.h index 915151b7dc2904..374b27769b4ca9 100644 --- a/src/node_options.h +++ b/src/node_options.h @@ -306,6 +306,7 @@ class PerProcessOptions : public Options { bool report_compact = false; std::string report_directory; std::string report_filename; + bool report_disable_network = false; // TODO(addaleax): Some of these could probably be per-Environment. std::string use_largepages = "off"; diff --git a/src/node_report.cc b/src/node_report.cc index 54121cb6b48210..6514c3a194efeb 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -61,7 +61,8 @@ static void WriteNodeReport(Isolate* isolate, const std::string& filename, std::ostream& out, Local error, - bool compact); + bool compact, + bool disable_network); static void PrintVersionInformation(JSONWriter* writer); static void PrintJavaScriptErrorStack(JSONWriter* writer, Isolate* isolate, @@ -93,7 +94,8 @@ static void WriteNodeReport(Isolate* isolate, const std::string& filename, std::ostream& out, Local error, - bool compact) { + bool compact, + bool disable_network) { // Obtain the current time and the pid. TIME_TYPE tm_struct; DiagnosticFilename::LocalTime(&tm_struct); @@ -917,8 +919,14 @@ std::string TriggerNodeReport(Isolate* isolate, compact = per_process::cli_options->report_compact; } + bool disable_network; + { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + disable_network = per_process::cli_options->report_disable_network; + } + report::WriteNodeReport( - isolate, env, message, trigger, filename, *outstream, error, compact); + isolate, env, message, trigger, filename, *outstream, error, compact, disable_network); // Do not close stdout/stderr, only close files we opened. if (outfile.is_open()) { @@ -969,8 +977,13 @@ void GetNodeReport(Isolate* isolate, if (isolate != nullptr) { env = Environment::GetCurrent(isolate); } + bool disable_network; + { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + disable_network = per_process::cli_options->report_disable_network; + } report::WriteNodeReport( - isolate, env, message, trigger, "", out, error, false); + isolate, env, message, trigger, "", out, error, false, disable_network); } // External function to trigger a report, writing to a supplied stream. @@ -983,8 +996,13 @@ void GetNodeReport(Environment* env, if (env != nullptr) { isolate = env->isolate(); } + bool disable_network; + { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + disable_network = per_process::cli_options->report_disable_network; + } report::WriteNodeReport( - isolate, env, message, trigger, "", out, error, false); + isolate, env, message, trigger, "", out, error, false, disable_network); } } // namespace node diff --git a/src/node_report_module.cc b/src/node_report_module.cc index 58963fd5150b04..4cb654581eb65e 100644 --- a/src/node_report_module.cc +++ b/src/node_report_module.cc @@ -84,6 +84,19 @@ static void SetCompact(const FunctionCallbackInfo& info) { per_process::cli_options->report_compact = compact; } +static void GetDisableNetwork(const FunctionCallbackInfo& info) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + info.GetReturnValue().Set(per_process::cli_options->report_disable_network); +} + +static void SetDisableNetwork(const FunctionCallbackInfo& info) { + Mutex::ScopedLock lock(per_process::cli_options_mutex); + Environment* env = Environment::GetCurrent(info); + Isolate* isolate = env->isolate(); + bool disable_network = info[0]->ToBoolean(isolate)->Value(); + per_process::cli_options->report_disable_network = disable_network; +} + static void GetDirectory(const FunctionCallbackInfo& info) { Mutex::ScopedLock lock(per_process::cli_options_mutex); Environment* env = Environment::GetCurrent(info); @@ -174,6 +187,8 @@ static void Initialize(Local exports, SetMethod(context, exports, "getReport", GetReport); SetMethod(context, exports, "getCompact", GetCompact); SetMethod(context, exports, "setCompact", SetCompact); + SetMethod(context, exports, "getDisableNetwork", GetDisableNetwork); + SetMethod(context, exports, "setDisableNetwork", SetDisableNetwork); SetMethod(context, exports, "getDirectory", GetDirectory); SetMethod(context, exports, "setDirectory", SetDirectory); SetMethod(context, exports, "getFilename", GetFilename); @@ -200,6 +215,8 @@ void RegisterExternalReferences(ExternalReferenceRegistry* registry) { registry->Register(GetReport); registry->Register(GetCompact); registry->Register(SetCompact); + registry->Register(GetDisableNetwork); + registry->Register(SetDisableNetwork); registry->Register(GetDirectory); registry->Register(SetDirectory); registry->Register(GetFilename); diff --git a/test/report/test-report-config.js b/test/report/test-report-config.js index dce58c5bfcd954..103ad23c4638c9 100644 --- a/test/report/test-report-config.js +++ b/test/report/test-report-config.js @@ -66,6 +66,17 @@ assert.throws(() => { }, { code: 'ERR_INVALID_ARG_TYPE' }); assert.strictEqual(process.report.compact, true); +// Verify that process.report.reportDisableNetwork behaves properly. +assert.strictEqual(process.report.disableNetwork, true); +process.report.disableNetwork = false; +assert.strictEqual(process.report.disableNetwork, false); +process.report.disableNetwork = true; +assert.strictEqual(process.report.disableNetwork, true); +assert.throws(() => { + process.report.disableNetwork = {}; +}, { code: 'ERR_INVALID_ARG_TYPE' }); +assert.strictEqual(process.report.disableNetwork, true); + if (!common.isWindows) { // Verify that process.report.signal behaves properly. assert.strictEqual(process.report.signal, 'SIGUSR2');