Skip to content

Live snapshots 9: register external handles during JSG type registration - #7144

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

Live snapshots 9: register external handles during JSG type registration#7144
dbezhetskov wants to merge 8 commits into
cloudflare:mainfrom
dbezhetskov:live-snapshots-9

Conversation

@dbezhetskov

Copy link
Copy Markdown

depends on: #7143

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.
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