niceties for development bundle loading

This commit is contained in:
vyzo 2022-05-16 21:09:09 +03:00
parent b4be759b2c
commit 46a85fc11e
4 changed files with 55 additions and 20 deletions

View File

@ -8,10 +8,10 @@ import (
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
) )
var BuiltinActorReleases map[actors.Version]string var BuiltinActorReleases map[actors.Version]Bundle
func init() { func init() {
BuiltinActorReleases = make(map[actors.Version]string) BuiltinActorReleases = make(map[actors.Version]Bundle)
spec := BundleSpec{} spec := BundleSpec{}
@ -22,6 +22,6 @@ func init() {
} }
for _, b := range spec.Bundles { for _, b := range spec.Bundles {
BuiltinActorReleases[b.Version] = b.Release BuiltinActorReleases[b.Version] = b
} }
} }

View File

@ -16,6 +16,13 @@ type BundleSpec struct {
} }
type Bundle struct { type Bundle struct {
// actors version in this bundle
Version actors.Version Version actors.Version
// release id
Release string Release string
// bundle path: optional, uses the appropriate release bundle if unset
Path string
// development version; when set, in conjunction with path, it will always
// load the bundle to the blockstore
Development bool
} }

View File

@ -28,6 +28,10 @@ func FetchAndLoadBundle(ctx context.Context, basePath string, bs blockstore.Bloc
return cid.Undef, xerrors.Errorf("error fetching bundle for builtin-actors version %d: %w", av, err) return cid.Undef, xerrors.Errorf("error fetching bundle for builtin-actors version %d: %w", av, err)
} }
return LoadBundle(ctx, bs, path, av)
}
func LoadBundle(ctx context.Context, bs blockstore.Blockstore, path string, av actors.Version) (cid.Cid, error) {
f, err := os.Open(path) f, err := os.Open(path)
if err != nil { if err != nil {
return cid.Undef, xerrors.Errorf("error opening bundle for builtin-actors vresion %d: %w", av, err) return cid.Undef, xerrors.Errorf("error opening bundle for builtin-actors vresion %d: %w", av, err)
@ -52,7 +56,7 @@ func FetchAndLoadBundle(ctx context.Context, basePath string, bs blockstore.Bloc
} }
// utility for blanket loading outside DI // utility for blanket loading outside DI
func FetchAndLoadBundles(ctx context.Context, bs blockstore.Blockstore, bar map[actors.Version]string) error { func FetchAndLoadBundles(ctx context.Context, bs blockstore.Blockstore, bar map[actors.Version]build.Bundle) error {
netw := build.NetworkBundle netw := build.NetworkBundle
if netw == "" { if netw == "" {
netw = "mainnet" netw = "mainnet"
@ -67,9 +71,15 @@ func FetchAndLoadBundles(ctx context.Context, bs blockstore.Blockstore, bar map[
} }
} }
for av, rel := range bar { for av, bd := range bar {
if _, err := FetchAndLoadBundle(ctx, path, bs, av, rel, netw); err != nil { if bd.Path != "" {
return err if _, err := LoadBundle(ctx, bs, bd.Path, av); err != nil {
return err
}
} else {
if _, err := FetchAndLoadBundle(ctx, path, bs, av, bd.Release, netw); err != nil {
return err
}
} }
} }

View File

@ -2,7 +2,7 @@ package modules
import ( import (
"fmt" "fmt"
"strings" "path/filepath"
"sync" "sync"
"go.uber.org/fx" "go.uber.org/fx"
@ -30,9 +30,9 @@ func LoadBuiltinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.LockedRe
netw = "mainnet" netw = "mainnet"
} }
for av, rel := range build.BuiltinActorReleases { for av, bd := range build.BuiltinActorReleases {
// first check to see if we know this release // first check to see if we know this release
key := dstore.NewKey(fmt.Sprintf("/builtin-actors/v%d/%s", av, rel)) key := dstore.NewKey(fmt.Sprintf("/builtin-actors/v%d/%s", av, bd.Release))
data, err := ds.Get(ctx, key) data, err := ds.Get(ctx, key)
switch err { switch err {
@ -66,13 +66,23 @@ func LoadBuiltinActors(lc fx.Lifecycle, mctx helpers.MetricsCtx, r repo.LockedRe
return result, xerrors.Errorf("error loading %s from datastore: %w", key, err) return result, xerrors.Errorf("error loading %s from datastore: %w", key, err)
} }
// ok, we don't have it -- fetch it and add it to the blockstore // we haven't recorded it in the daatastore, so we need to load it
mfCid, err := bundle.FetchAndLoadBundle(ctx, r.Path(), bs, av, rel, netw) var mfCid cid.Cid
if err != nil { if bd.Path != "" {
return result, err // this is a local bundle, load it directly from the filessystem
mfCid, err = bundle.LoadBundle(ctx, bs, bd.Path, av)
if err != nil {
return result, err
}
} else {
// fetch it and add it to the blockstore
mfCid, err = bundle.FetchAndLoadBundle(ctx, r.Path(), bs, av, bd.Release, netw)
if err != nil {
return result, err
}
} }
if rel == "dev" || strings.HasPrefix(rel, "dev.") { if bd.Development {
// don't store the release key so that we always load development bundles // don't store the release key so that we always load development bundles
continue continue
} }
@ -108,11 +118,19 @@ func LoadBuiltinActorsTesting(lc fx.Lifecycle, mctx helpers.MetricsCtx, bs dtype
testingBundleMx.Lock() testingBundleMx.Lock()
defer testingBundleMx.Unlock() defer testingBundleMx.Unlock()
for av, rel := range build.BuiltinActorReleases { for av, bd := range build.BuiltinActorReleases {
const basePath = "/tmp/lotus-testing" if bd.Path != "" {
// we need the appopriate bundle for tests; it should live next to the main bundle, with the
if _, err := bundle.FetchAndLoadBundle(ctx, basePath, bs, av, rel, netw); err != nil { // appropriate network name
return result, xerrors.Errorf("error loading bundle for builtin-actors vresion %d: %w", av, err) path := filepath.Join(filepath.Dir(bd.Path), fmt.Sprintf("builtin-actors-%s.car", netw))
if _, err := bundle.LoadBundle(ctx, bs, path, av); err != nil {
return result, xerrors.Errorf("error loading testing bundle for builtin-actors version %d/%s: %w", av, netw, err)
}
} else {
const basePath = "/tmp/lotus-testing"
if _, err := bundle.FetchAndLoadBundle(ctx, basePath, bs, av, bd.Release, netw); err != nil {
return result, xerrors.Errorf("error loading testing bundle for builtin-actors version %d/%s: %w", av, netw, err)
}
} }
} }