Skip to content

Commit

Permalink
src: return void in InitializeInspector()
Browse files Browse the repository at this point in the history
We have been ignoring inspector port binding errors during startup.
Handling this error would be a breaking change and it's probably
surprising to refuse to launch the Node.js instance simply because
the inspector cannot listen to the port anyway. So just turn the
return value of InitializeInspector() and remove the TODOs for
handling the error.

PR-URL: #44903
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
joyeecheung authored and RafaelGSS committed Nov 10, 2022
1 parent b2e6048 commit 824dcfc
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 11 deletions.
1 change: 0 additions & 1 deletion src/api/environment.cc
Expand Up @@ -370,7 +370,6 @@ Environment* CreateEnvironment(
Environment* env = new Environment(
isolate_data, context, args, exec_args, nullptr, flags, thread_id);
#if HAVE_INSPECTOR
// TODO(joyeecheung): handle the exit code returned by InitializeInspector().
if (env->should_create_inspector()) {
if (inspector_parent_handle) {
env->InitializeInspector(
Expand Down
2 changes: 1 addition & 1 deletion src/env.h
Expand Up @@ -617,7 +617,7 @@ class Environment : public MemoryRetainer {
#if HAVE_INSPECTOR
// If the environment is created for a worker, pass parent_handle and
// the ownership if transferred into the Environment.
ExitCode InitializeInspector(
void InitializeInspector(
std::unique_ptr<inspector::ParentInspectorHandle> parent_handle);
#endif

Expand Down
6 changes: 3 additions & 3 deletions src/node.cc
Expand Up @@ -166,7 +166,7 @@ void SignalExit(int signo, siginfo_t* info, void* ucontext) {
#endif // __POSIX__

#if HAVE_INSPECTOR
ExitCode Environment::InitializeInspector(
void Environment::InitializeInspector(
std::unique_ptr<inspector::ParentInspectorHandle> parent_handle) {
std::string inspector_path;
bool is_main = !parent_handle;
Expand All @@ -187,7 +187,7 @@ ExitCode Environment::InitializeInspector(
is_main);
if (options_->debug_options().inspector_enabled &&
!inspector_agent_->IsListening()) {
return ExitCode::kInvalidCommandLineArgument2; // Signal internal error
return;
}

profiler::StartProfilers(this);
Expand All @@ -196,7 +196,7 @@ ExitCode Environment::InitializeInspector(
inspector_agent_->PauseOnNextJavascriptStatement("Break at bootstrap");
}

return ExitCode::kNoFailure;
return;
}
#endif // HAVE_INSPECTOR

Expand Down
4 changes: 0 additions & 4 deletions src/node_main_instance.cc
Expand Up @@ -181,8 +181,6 @@ NodeMainInstance::CreateMainEnvironment(ExitCode* exit_code) {
SetIsolateErrorHandlers(isolate_, {});
env->InitializeMainContext(context, &(snapshot_data_->env_info));
#if HAVE_INSPECTOR
// TODO(joyeecheung): handle the exit code returned by
// InitializeInspector().
env->InitializeInspector({});
#endif

Expand All @@ -201,8 +199,6 @@ NodeMainInstance::CreateMainEnvironment(ExitCode* exit_code) {
EnvironmentFlags::kDefaultFlags,
{}));
#if HAVE_INSPECTOR
// TODO(joyeecheung): handle the exit code returned by
// InitializeInspector().
env->InitializeInspector({});
#endif
if (env->principal_realm()->RunBootstrapping().IsEmpty()) {
Expand Down
2 changes: 0 additions & 2 deletions src/node_snapshotable.cc
Expand Up @@ -1173,8 +1173,6 @@ ExitCode SnapshotBuilder::Generate(SnapshotData* out,
// in the future).
if (snapshot_type == SnapshotMetadata::Type::kFullyCustomized) {
#if HAVE_INSPECTOR
// TODO(joyeecheung): handle the exit code returned by
// InitializeInspector().
env->InitializeInspector({});
#endif
if (LoadEnvironment(env, StartExecutionCallback{}).IsEmpty()) {
Expand Down
59 changes: 59 additions & 0 deletions test/parallel/test-inspect-address-in-use.js
@@ -0,0 +1,59 @@
'use strict';
const common = require('../common');
common.skipIfInspectorDisabled();

const { spawnSync } = require('child_process');
const { createServer } = require('http');
const assert = require('assert');
const fixtures = require('../common/fixtures');
const entry = fixtures.path('empty.js');
const { Worker } = require('worker_threads');

function testOnServerListen(fn) {
const server = createServer((socket) => {
socket.end('echo');
});

server.on('listening', () => {
fn(server);
server.close();
});
server.listen(0, '127.0.0.1');
}

function testChildProcess(getArgs, exitCode) {
testOnServerListen((server) => {
const { port } = server.address();
const child = spawnSync(process.execPath, getArgs(port));
const stderr = child.stderr.toString().trim();
const stdout = child.stdout.toString().trim();
console.log('[STDERR]');
console.log(stderr);
console.log('[STDOUT]');
console.log(stdout);
const match = stderr.match(
/Starting inspector on 127\.0\.0\.1:(\d+) failed: address already in use/
);
assert.notStrictEqual(match, null);
assert.strictEqual(match[1], port + '');
assert.strictEqual(child.status, exitCode);
});
}

testChildProcess(
(port) => [`--inspect=${port}`, '--build-snapshot', entry], 0);
testChildProcess(
(port) => [`--inspect=${port}`, entry], 0);

testOnServerListen((server) => {
const { port } = server.address();
const worker = new Worker(entry, {
execArgv: [`--inspect=${port}`]
});

worker.on('error', common.mustNotCall());

worker.on('exit', common.mustCall((code) => {
assert.strictEqual(code, 0);
}));
});

0 comments on commit 824dcfc

Please sign in to comment.