-
Notifications
You must be signed in to change notification settings - Fork 29.6k
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
vm: add Script.createCodeCache() #20300
vm: add Script.createCodeCache() #20300
Conversation
lib/vm.js
Outdated
if (cachedData && !cachedDataWarned) { | ||
process.emitWarning(cachedDataMessage, 'DeprecationWarning', 'DEPXXXX'); | ||
cachedDataWarned = true; | ||
} |
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 that this makes this PR semver-major – it might be easier to split the deprecation out?
Also – What’s the motivation for not doing a docs-only deprecation first? Do we actually want a run-time deprecation at any point? It seems like, for cache information, just making them no-ops would be less breakage for users…
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.
i can remove the runtime dep
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.
The additional of a new throw also makes it semver-major.
Wait, nevermind, this is a check on a new property. Scratch that :-)
0a65658
to
d4aa733
Compare
doc/api/deprecations.md
Outdated
|
||
Type: Documentation-only | ||
|
||
The options `produceCachedData` and `cachedData` have been deprecated. Please use |
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.
I would also support splitting the deprecation into a separate PR, so that we can ship this earlier without semver changes.
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.
I changed it to docs only, not sure why I made it runtime in the first place
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.
Even as a docs-only deprecation, it should be separated out into a separate commit.
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.
Also ... just a nit... s/DEPXXXX/DEP00XX ... the release tooling looks specifically for the DEP00XX
pattern to ensure that the codes are properly assigned before release.
env, | ||
reinterpret_cast<const char*>(cached_data->data), | ||
cached_data->length); | ||
args.GetReturnValue().Set(buf.ToLocalChecked()); |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
src/env.h
Outdated
V(change_string, "change") \ | ||
V(channel_string, "channel") \ | ||
V(chunks_sent_since_last_write_string, "chunksSentSinceLastWrite") \ | ||
V(code_cache_used_string, "codeCacheUsed") \ |
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.
This is an API change. Not sure whether that belongs into a separate PR? Not sure if this would block this PR from going into Node 10 otherwise.
doc/api/vm.md
Outdated
* `codeCache` {Buffer} Provides an optional `Buffer` with V8's code cache | ||
data for the supplied source. When supplied, the `codeCacheRejected` value | ||
will be set to either `true` or `false` depending on acceptance of the data | ||
by V8. | ||
* `cachedData` {Buffer} Provides an optional `Buffer` with V8's code cache |
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.
Is the code cache generated by createCodeCache
compatible with cachedData
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.
Yes. The latter is produced with createCodeCache
.
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.
In that case I’m reluctant to deprecate an older name of the same thing. Actually would rather change createCodeCache
to createCachedData
or something similar.
@hashseed Can the code cache generated by a different version of v8 be loaded by another? (My guess is no?) |
We check a version hash before deserializing. If the version hash mismatches, V8 rejects the cache data. |
@hashseed Thanks. It would be good to document about this (otherwise the user only has a boolean codeCacheRejected without further information or possible cause) |
I'm going to work on some patches this weekend for v8 to provide more data on what happened with the caches besides just if it was rejected, which should help make this API a bit better |
Generally agree. Though I think landing the minimal change of adding this new API without adding the reject reason or deprecating the old API would make sense too. |
f066d12
to
b45e969
Compare
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.
Code looks good.
doc/api/vm.md
Outdated
--> | ||
|
||
Creates a code cache that can be used with the Script constructor's | ||
`cachedData` option. Returns a Buffer. If the code cache cannot be created then |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
- version: REPLACEME | ||
pr-url: https://github.com/nodejs/node/pull/20300 | ||
description: The `produceCachedData` is deprecated in favour of | ||
`script.createCachedData()` |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
doc/api/vm.md
Outdated
|
||
Creates a code cache that can be used with the Script constructor's | ||
`cachedData` option. Returns a Buffer. If the code cache cannot be created then | ||
`ERR_CODE_CACHE_CREATION_FAILED` is thrown. This method may be called at any |
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.
@hashseed What can possibly lead to failure of creating cached data? It would be helpful here for the documentation.
doc/api/vm.md
Outdated
Creates a code cache that can be used with the Script constructor's | ||
`cachedData` option. Returns a Buffer. If the code cache cannot be created then | ||
`ERR_CODE_CACHE_CREATION_FAILED` is thrown. This method may be called at any | ||
time and any number of times. |
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.
Maybe also link to the V8 blog post?
test/parallel/test-vm-cached-data.js
Outdated
|
||
if (script.cachedDataProduced) | ||
data = script.cachedData.toString('base64'); |
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.
The old code should still be tested.
<a id="DEP00XX"></a> | ||
### DEP00XX: vm.Script cached data | ||
|
||
Type: Documentation-only |
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.
Any reason this isn't runtime?
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.
@TimothyGu Some previous comments on that in #20300 (comment) … for a caching functionality, there is no reason to introduce a runtime deprecation, right?
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.
i never know when to make something documentation or runtime... do we have some sort of guide on deciding which to do? i always kinda saw documentation as things that are too ingrained in npm packages such that like any project would be spammed if it used a runtime dep
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.
@devsnek I don’t know if you’ve read it, but https://github.com/nodejs/node/blob/master/COLLABORATOR_GUIDE.md#deprecations might help you?
Generally, we should avoid moving directly from a documented feature towards a runtime deprecation. But yes, obviously popularity of a feature has played a role in deciding how fast we move with those steps…
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.
@addaleax i've seen that but it doesn't really explain when to use them, just how they fit into semver. is the generally expected process that something will do docs -> runtime -> eol?
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.
is the generally expected process that something will do docs -> runtime -> eol?
Yes, unless we have reason to deviate from it. But in this case I do think we have reason to do so. :)
These here are possible reject reasons. |
@hashseed I meant possible reasons for failure of creating a code cache, not consuming one :) |
Oh. Creating may fail if the script is actually an asm.js module or if the debugger is active. The latter can probably be fixed as soon as the debug context has been removed completely. |
Any updates here? What's the status? |
@jdalton hashseed is going to backport a bunch of changes to SharedFunctionInfo soonish, this is just waiting for that. |
Umm.. wait. Which changes am I supposed to backport? I am not aware of anything actionable on my end. Did I drop the ball? |
@hashseed a couple weeks ago I emailed you about backporting the changes for this and modules sfi and my understanding from that was you would be backporting the changes. if that's wrong sorry about the misunderstanding 😅 |
I haven't found such an email unfortunately. Do you mean by any chance this change? I'm pessimistic that it will get green light for back porting since this is not a bug fix. We could just float this in Node? |
@devsnek Are you cool floating the change into Node? |
ab4284b
to
c31b520
Compare
Okay! |
test/parallel/test-vm-cached-data.js
Outdated
|
||
assert(cachedData instanceof Buffer); | ||
|
||
data = cachedData.toString('base64'); |
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.
This overwrites data
created earlier. Is it possible to test the buffer returned from both produceCachedData
and createCachedData
?
This comment has been minimized.
This comment has been minimized.
c31b520
to
9db4f30
Compare
CI again just to make sure: https://ci.nodejs.org/job/node-test-commit/19379/ |
Update: NM, on double checking my test I found I goofed it. |
landed in 4f67c6f |
PR-URL: #20300 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: John-David Dalton <[email protected]> Reviewed-By: Tiancheng "Timothy" Gu <[email protected]> Reviewed-By: Yang Guo <[email protected]>
PR-URL: #20300 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: John-David Dalton <[email protected]> Reviewed-By: Tiancheng "Timothy" Gu <[email protected]> Reviewed-By: Yang Guo <[email protected]>
Notable changes: * build: * Node.js should now be about 60% faster to startup than the previous version, thanks to the use V8's code cache feature for core modules. [#21405](#21405) * dns: * An experimental promisified version of the dns module is now available. Give it a try with `require('dns').promises`. [#21264](#21264) * fs: * `fs.lchown` has been undeprecated now that libuv supports it. [#21498](#21498) * lib: * `Atomics.wake` is being renamed to `Atomics.notify` in the ECMAScript specification ([reference](tc39/ecma262#1220)). Since Node.js now has experimental support for worker threads, we are being proactive and added a `notify` alias, while emitting a warning if `wake` is used. [#21413](#21413) [#21518](#21518) * n-api: * Add API for asynchronous functions. [#17887](#17887) * util: * `util.inspect` is now able to return a result instead of throwing when the maximum call stack size is exceeded during inspection. [#20725](#20725) * vm: * Add `script.createCachedData()`. This API replaces the `produceCachedData` option of the `Script` constructor that is now deprecated. [#20300](#20300) * worker: * Support for relative paths has been added to the `Worker` constructor. Paths are interpreted relative to the current working directory. [#21407](#21407) PR-URL: #21629
Notable changes: * dns: * An experimental promisified version of the dns module is now available. Give it a try with `require('dns').promises`. [#21264](#21264) * fs: * `fs.lchown` has been undeprecated now that libuv supports it. [#21498](#21498) * lib: * `Atomics.wake` is being renamed to `Atomics.notify` in the ECMAScript specification ([reference](tc39/ecma262#1220)). Since Node.js now has experimental support for worker threads, we are being proactive and added a `notify` alias, while emitting a warning if `wake` is used. [#21413](#21413) [#21518](#21518) * n-api: * Add API for asynchronous functions. [#17887](#17887) * util: * `util.inspect` is now able to return a result instead of throwing when the maximum call stack size is exceeded during inspection. [#20725](#20725) * vm: * Add `script.createCachedData()`. This API replaces the `produceCachedData` option of the `Script` constructor that is now deprecated. [#20300](#20300) * worker: * Support for relative paths has been added to the `Worker` constructor. Paths are interpreted relative to the current working directory. [#21407](#21407) PR-URL: #21629
Notable changes: * dns: * An experimental promisified version of the dns module is now available. Give it a try with `require('dns').promises`. [#21264](#21264) * fs: * `fs.lchown` has been undeprecated now that libuv supports it. [#21498](#21498) * lib: * `Atomics.wake` is being renamed to `Atomics.notify` in the ECMAScript specification ([reference](tc39/ecma262#1220)). Since Node.js now has experimental support for worker threads, we are being proactive and added a `notify` alias, while emitting a warning if `wake` is used. [#21413](#21413) [#21518](#21518) * n-api: * Add API for asynchronous functions. [#17887](#17887) * util: * `util.inspect` is now able to return a result instead of throwing when the maximum call stack size is exceeded during inspection. [#20725](#20725) * vm: * Add `script.createCachedData()`. This API replaces the `produceCachedData` option of the `Script` constructor that is now deprecated. [#20300](#20300) * worker: * Support for relative paths has been added to the `Worker` constructor. Paths are interpreted relative to the current working directory. [#21407](#21407) PR-URL: #21629
Closes #20052
/cc @nodejs/vm
Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passes