-
-
Couldn't load subscription status.
- Fork 33.6k
src: fix timing of snapshot serialize callback #60434
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Previously the addAfterUserSerailizeCallback() wasn't ready to be used for building the built-in snapshot. This patch initializes the callbacks at the time lib/internal/v8/start_snapshot.js is loaded, so that these callbacks get run correctly when building the built-in snapshot. Currently when building the built-in snapshot, addAfterUserSerializeCallback() is only used by createUnsafeBuffer(), other usages can only come from user-land snapshots, which is covered by tests, but what gets run by the built-in snapshot building process is less visible, and the path used by createUnsafeBuffer() isn't reliably visible in user land either. This adds an internal usage counter in debug builds to verify this path when building the built-in snapshot.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Note: this effectively disables --zero-fill-buffers default being on since 24.0.0
If not for a significant perf impact, this should have been a semver-major change at this point
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #60434 +/- ##
==========================================
+ Coverage 88.07% 88.57% +0.50%
==========================================
Files 704 704
Lines 207778 207814 +36
Branches 39949 40038 +89
==========================================
+ Hits 182998 184078 +1080
+ Misses 16791 15775 -1016
+ Partials 7989 7961 -28
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RSLGTM
|
Also this likely should be both a notable change and have a clear description that it disables default buffer zero-filling, which has been accidental |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Testing ./node -e 'for (let i = 0; i < 1e6; i++) {if(Buffer.allocUnsafe(4096).some(x=>x))process.exit(0)}process.exit(1)' is failing without this patch, and passing with it
|
Fast-track has been requested by @aduh95. Please 👍 to approve. |
|
Fast track so it can get into #60436? |
|
Adding
baking-for-lts
|
Commit Queue failed- Loading data for nodejs/node/pull/60434 ✔ Done loading data for nodejs/node/pull/60434 ----------------------------------- PR info ------------------------------------ Title src: fix timing of snapshot serialize callback (#60434) Author Joyee Cheung <[email protected]> (@joyeecheung) Branch joyeecheung:buffer -> nodejs:main Labels c++, lib / src, baking-for-lts, fast-track, author ready, needs-ci Commits 4 - src: add COUNT_GENERIC_USAGE utility for tests - src: fix timing of snapshot serialize callback - fixup! src: fix timing of snapshot serialize callback - fixup! fixup! src: fix timing of snapshot serialize callback Committers 1 - Joyee Cheung <[email protected]> PR-URL: https://github.com/nodejs/node/pull/60434 Fixes: https://github.com/nodejs/node/issues/60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]> ------------------------------ Generated metadata ------------------------------ PR-URL: https://github.com/nodejs/node/pull/60434 Fixes: https://github.com/nodejs/node/issues/60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]> -------------------------------------------------------------------------------- ℹ This PR was created on Mon, 27 Oct 2025 14:31:11 GMT ✔ Approvals: 3 ✔ - Matteo Collina (@mcollina) (TSC): https://github.com/nodejs/node/pull/60434#pullrequestreview-3384325240 ✔ - Antoine du Hamel (@aduh95) (TSC): https://github.com/nodejs/node/pull/60434#pullrequestreview-3384634586 ✔ - Richard Lau (@richardlau) (TSC): https://github.com/nodejs/node/pull/60434#pullrequestreview-3386023877 ℹ This PR is being fast-tracked ✔ Last GitHub CI successful ℹ Last Full PR CI on 2025-10-27T22:09:50Z: https://ci.nodejs.org/job/node-test-pull-request/69909/ - Querying data for job/node-test-pull-request/69909/ ✔ Last Jenkins CI successful -------------------------------------------------------------------------------- ✔ No git cherry-pick in progress ✔ No git am in progress ✔ No git rebase in progress -------------------------------------------------------------------------------- - Bringing origin/main up to date... From https://github.com/nodejs/node * branch main -> FETCH_HEAD ✔ origin/main is now up-to-date - Downloading patch for 60434 From https://github.com/nodejs/node * branch refs/pull/60434/merge -> FETCH_HEAD ✔ Fetched commits as 51a57f2b3629..d6d46594f8e8 -------------------------------------------------------------------------------- [main 74f6c4aa82] src: add COUNT_GENERIC_USAGE utility for tests Author: Joyee Cheung <[email protected]> Date: Mon Oct 27 13:42:30 2025 +0100 3 files changed, 35 insertions(+), 2 deletions(-) [main 7f70321948] src: fix timing of snapshot serialize callback Author: Joyee Cheung <[email protected]> Date: Mon Oct 27 13:43:09 2025 +0100 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 test/parallel/test-buffer-alloc-unsafe-is-uninitialized.js [main 9f399a1b9a] fixup! src: fix timing of snapshot serialize callback Author: Joyee Cheung <[email protected]> Date: Mon Oct 27 17:42:51 2025 +0100 2 files changed, 21 insertions(+) create mode 100644 test/parallel/test-buffer-alloc-unsafe-is-initialized-with-zero-fill-flag.js [main d7be4afbbf] fixup! fixup! src: fix timing of snapshot serialize callback Author: Joyee Cheung <[email protected]> Date: Mon Oct 27 18:11:18 2025 +0100 2 files changed, 14 insertions(+), 8 deletions(-) ✔ Patches applied There are 4 commits in the PR. Attempting autorebase. Rebasing (2/6) Executing: git node land --amend --yes --------------------------------- New Message ---------------------------------- src: add COUNT_GENERIC_USAGE utility for testshttps://github.com/nodejs/node/actions/runs/18859727179 |
| using v8::Value; | ||
|
|
||
| thread_local std::unordered_map<std::string, int> generic_usage_counters; | ||
| thread_local std::unordered_map<FastStringKey, int, FastStringKey::Hash> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's make this use FastStringKey as well, that is useful here for the same reason as it is for fast API call count tracking
| if (generic_usage_counters.find(counter_name) == generic_usage_counters.end()) | ||
| generic_usage_counters[counter_name] = 0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| if (generic_usage_counters.find(counter_name) == generic_usage_counters.end()) | |
| generic_usage_counters[counter_name] = 0; |
... since this doesn't actually do anything, right? operator[] creates the element for you if it doesn't exist
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
will do a separate PR – #60447
|
Landed in 51a57f2...1f6b681 |
PR-URL: #60434 Fixes: #60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]>
Previously the addAfterUserSerailizeCallback() wasn't ready to be used for building the built-in snapshot. This patch initializes the callbacks at the time lib/internal/v8/start_snapshot.js is loaded, so that these callbacks get run correctly when building the built-in snapshot. Currently when building the built-in snapshot, addAfterUserSerializeCallback() is only used by createUnsafeBuffer(), other usages can only come from user-land snapshots, which is covered by tests, but what gets run by the built-in snapshot building process is less visible, and the path used by createUnsafeBuffer() isn't reliably visible in user land either. This adds an internal usage counter in debug builds to verify this path when building the built-in snapshot. PR-URL: #60434 Fixes: #60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]>
PR-URL: #60434 Fixes: #60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]>
Previously the addAfterUserSerailizeCallback() wasn't ready to be used for building the built-in snapshot. This patch initializes the callbacks at the time lib/internal/v8/start_snapshot.js is loaded, so that these callbacks get run correctly when building the built-in snapshot. Currently when building the built-in snapshot, addAfterUserSerializeCallback() is only used by createUnsafeBuffer(), other usages can only come from user-land snapshots, which is covered by tests, but what gets run by the built-in snapshot building process is less visible, and the path used by createUnsafeBuffer() isn't reliably visible in user land either. This adds an internal usage counter in debug builds to verify this path when building the built-in snapshot. PR-URL: #60434 Fixes: #60423 Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Richard Lau <[email protected]>
This addresses late review comments for the recently landed cfbfc1b. Refs: nodejs#60434 (review)
This addresses late review comments for the recently landed cfbfc1b and aligns the new code with the pre-existing V8 fast call counters. Refs: nodejs#60434 (review)
|
Given this landed, how fast can it get into 24? |
Why should restoring documented behaviour that's present on 22 and now 25 need wait to land on 24? I think
baking-for-lts
|
|
I'm removing
baking-for-lts
|
src: add COUNT_GENERIC_USAGE utility for tests
src: fix timing of snapshot serialize callback
Previously the addAfterUserSerailizeCallback() wasn't
ready to be used for building the built-in snapshot.
This patch initializes the callbacks at the time
lib/internal/v8/start_snapshot.js is loaded, so that
these callbacks get run correctly when building the
built-in snapshot.
Currently when building the built-in snapshot,
addAfterUserSerializeCallback() is only used by createUnsafeBuffer(),
other usages can only come from user-land snapshots,
which is covered by tests, but what gets run by the
built-in snapshot building process is less visible, and the
path used by createUnsafeBuffer() isn't reliably visible in user
land either. This adds an internal usage counter in debug builds
to verify this path when building the built-in snapshot.
Fixes: #60423