Skip to content

src: keep global list of addon-provided cleanup hooks#63985

Open
addaleax wants to merge 1 commit into
nodejs:mainfrom
addaleax:fix-63923
Open

src: keep global list of addon-provided cleanup hooks#63985
addaleax wants to merge 1 commit into
nodejs:mainfrom
addaleax:fix-63923

Conversation

@addaleax

Copy link
Copy Markdown
Member

A recent change, 215027c, introduced flakiness into our test suite that exposed an issue with the cleanup hook API design.

Specifically, the signatures of AddEnvironmentCleanupHook() and RemoveEnvironmentCleanupHook() are problematic. Both functions take Isolate* arguments, as addons are not generally expected to have to care about the Node.js Environment as a first-class scope provider.

However, this model made the incorrect assumption that in the situations in which RemoveEnvironmentCleanupHook() would be invoked an Environment would always be associated with the current Isolate (via the current V8 Context, if there is one).

This occasionally breaks down when RemoveEnvironmentCleanupHook() is called during garbage collection -- which would be an expected use case of the functionality, but one that has not been covered through our tests before 215027c.

Since Node.js guarantees API and ABI stability within a major version, and this is a bug that is independent from the aforementioned change, this commit resolves it by adding global mutable state to keep track off cleanup hooks registered through the Node.js public API.

Obviously, this solution does not represent a desirable long-term state, and a semver-minor follow up should add an API that does not require modifications to these data structures, likely based on the async cleanup hook API which already solves this issue properly.

Refs: #63642
Fixes: #63923

A recent change, 215027c, introduced flakiness into our
test suite that exposed an issue with the cleanup hook API design.

Specifically, the signatures of `AddEnvironmentCleanupHook()` and
`RemoveEnvironmentCleanupHook()` are problematic. Both functions
take `Isolate*` arguments, as addons are not generally expected
to have to care about the Node.js `Environment` as a first-class
scope provider.

However, this model made the incorrect assumption that in the
situations in which `RemoveEnvironmentCleanupHook()` would be
invoked an `Environment` would always be associated with the
current `Isolate` (via the current V8 `Context`, if there is one).

This occasionally breaks down when `RemoveEnvironmentCleanupHook()`
is called during garbage collection -- which would be an expected
use case of the functionality, but one that has not been covered
through our tests before 215027c.

Since Node.js guarantees API and ABI stability within a major version,
and this is a bug that is independent from the aforementioned change,
this commit resolves it by adding global mutable state to keep track
off cleanup hooks registered through the Node.js public API.

Obviously, this solution does not represent a desirable long-term
state, and a semver-minor follow up should add an API that does not
require modifications to these data structures, likely based on
the async cleanup hook API which already solves this issue properly.

Refs: nodejs#63642
Fixes: nodejs#63923
Signed-off-by: Anna Henningsen <anna@addaleax.net>
@nodejs-github-bot nodejs-github-bot added c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run. labels Jun 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Issues and PRs that require attention from people who are familiar with C++. needs-ci PRs that need a full CI run.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Flaky crash on worker-addon-exit test

2 participants