Skip to content

Live snapshots 8: detach live wrappables and reset their handles - #7143

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

Live snapshots 8: detach live wrappables and reset their handles#7143
dbezhetskov wants to merge 7 commits into
cloudflare:mainfrom
dbezhetskov:live-snapshots-8

Conversation

@dbezhetskov

Copy link
Copy Markdown

depends on: #7142

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