Skip to content

Live snapshots 10: register external ref for console decorators and co - #7145

Open
dbezhetskov wants to merge 9 commits into
cloudflare:mainfrom
dbezhetskov:live-snapshots-10
Open

Live snapshots 10: register external ref for console decorators and co#7145
dbezhetskov wants to merge 9 commits into
cloudflare:mainfrom
dbezhetskov:live-snapshots-10

Conversation

@dbezhetskov

Copy link
Copy Markdown

depends on: #7144

Build a throwaway “zygote” Worker from the same source and bindings,
solely to evaluate top-level code and produce a snapshot artifact.
The SnapshotArtifact encapsulates all the data required to construct
a new isolate from a V8 startup snapshot.

Add a SnapshotConfig parameter to WorkerdApi controlling how the
isolate is created:
  - kj::none: a regular isolate, no snapshots involved
  - MutableSnapshot: the isolate is created via v8::SnapshotCreator
    and fills the snapshot artifact
  - ReadonlySharedSnapshot: the isolate boots from a previously
    produced snapshot blob
To create snapshot we need to reset all C++ handles first.
Here we reset IsolateBase level handles.
Instead of creating impl->env, impl->ctxExports, and the exported
handler table only to reset them again before CreateBlob, don't create
them at all in the zygote. This is safe: top-level code has already
executed by this point, and the zygote worker never handles requests,
so nothing reads this state.

No JavaScript values are lost to garbage collection either, because the
values these handles would refer to are already retained elsewhere:

    impl->env        == IsolateBase::workerEnvObj
    impl->ctxExports == IsolateBase::workerExportsObj

A real Worker repopulates these handles in START_FROM_SNAPSHOT mode.
Reset the memoized andcontext constructor-templates kept per
JSG_RESOURCE type by the TypeWrapper machinery.
Add visitStructTypeHandles to traverse all struct
types and reset their template and field handles.
Reset the per-entry module / source-object / mutable-exports
/ synthetic handles of every instantiated ModuleInfo.
To create a snapshot, we need to provide V8 with all external references
that it may encounter during snapshot creation.

Introduce a fixed-size array of external references as a new field in
SnapshotArtifact, and collect the references during JSG type
registration.
…hetic modules

Cover the callbacks that reach the snapshotted heap without going
through ResourceTypeBuilder:

* the console.{debug,error,info,log,warn} decorators, created via
  v8::Function::New() in setupContext and living on the snapshotted
  console object;
* the SyntheticModuleEvaluationSteps callback, embedded by V8 in
  every synthetic v8::Module;
* the KJ_LOG message listener, stored as a Foreign on the isolate
  heap.
@dbezhetskov
dbezhetskov requested review from a team as code owners August 27, 2026 10:50
@dbezhetskov

Copy link
Copy Markdown
Author

PTAL @erikcorry

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant