Skip to content
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

fix(swingset): stop using a persistent kernel bundle #5706

Merged
merged 1 commit into from
Jul 1, 2022

Commits on Jul 1, 2022

  1. fix(swingset): stop using a persistent kernel bundle

    Previously, the kernel sources were bundled during
    `initializeSwingset()`, and stored in the kvStore portion of the
    swingstore kernelDB. It was read from that DB each time
    makeSwingsetController() launched the application process.
    
    That ensured the kernel behavior would remain consistent (and
    deterministic) even if the user's source tree changed. Using a
    persistent kernel bundle also speeds up application launch: we save
    about 1.8s by not re-running `bundleSource` on each launch.
    
    Once upon a time I thought this consistency was important/useful, but
    now I see that it causes more problems than it's worth. In particular,
    upgrading a chain requires an awkward "rekernelize" action to replace
    the kernel bundle in the database. And we believe we can reclaim about
    1.0s per launch by moving to a not-yet-written `importLocation()` Endo
    tool that loads module graphs from disk without serializing the
    archive in the middle.
    
    This patch changes swingset to stop using a persistent kernel
    bundle. Each application launch (i.e. `makeSwingsetController()` call)
    re-bundles the kernel sources just before importing that bundle, so
    that updated source trees are automatically picked up without
    additional API calls or rekernelize steps. The bundle is no longer
    stored in the kvStore.
    
    The other bundles (vats, devices, xsnap helpers) are still created
    during `initializeSwingset` and stored in the DB, since these become
    part of the deterministic history of each vat (#4376 and #5703 will
    inform changes to how those bundles are managed). Only the kernel
    bundle has become non-persistent.
    
    Bundling is slow enough that many unit tests pre-bundle both the
    kernel and the sources of built-in vats, devices, and xsnap helper
    bundles. This provides a considerable speedup for tests that build (or
    launch) multiple kernels within a single test file. These
    `kernelBundles` are passed into `initializationOptions`, which then
    bypassed the swingset-bundles-it-for-you code. This saves a minute or
    two when running the full swingset test suite.
    
    Unit tests can still use `initializationOptions` to amortize bundling
    costs for the non-kernel bundles. `runtimeOptions` now accepts a
    `kernelBundle` member to amortize bundling the kernel itself. Tests
    which use this trick and also use `makeSwingsetController()` need to
    be updated (else they'll run 1.8s slower). All such tests were inside
    `packages/SwingSet/test/` and have been updated, which would otherwise
    cause the test suite to run about 50-60s slower.
    
    The other agoric-sdk packages that do swingset-style tests are mostly
    using the deprecated `buildVatController()`, whose options continue to
    accept both kinds of bundles, and do not need changes.
    
    closes #5679
    warner committed Jul 1, 2022
    Configuration menu
    Copy the full SHA
    ec2c30d View commit details
    Browse the repository at this point in the history