github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/migration/nv10/test/parallel_migration_test.go (about) 1 package test_test 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/filecoin-project/go-state-types/abi" 8 adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt" 9 ipld2 "github.com/filecoin-project/specs-actors/v2/support/ipld" 10 vm2 "github.com/filecoin-project/specs-actors/v2/support/vm" 11 cid "github.com/ipfs/go-cid" 12 cbor "github.com/ipfs/go-ipld-cbor" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 "golang.org/x/sync/errgroup" 16 17 "github.com/filecoin-project/specs-actors/v4/actors/migration/nv10" 18 ) 19 20 func TestParallelMigrationCalls(t *testing.T) { 21 // Construct simple prior state tree over a synchronized store 22 ctx := context.Background() 23 log := nv10.TestLogger{TB: t} 24 bs := ipld2.NewSyncBlockStoreInMemory() 25 vm := vm2.NewVMWithSingletons(ctx, t, bs) 26 27 // Run migration 28 adtStore := adt2.WrapStore(ctx, cbor.NewCborStore(bs)) 29 startRoot := vm.StateRoot() 30 endRootSerial, err := nv10.MigrateStateTree(ctx, adtStore, startRoot, abi.ChainEpoch(0), nv10.Config{MaxWorkers: 1}, log, nv10.NewMemMigrationCache()) 31 require.NoError(t, err) 32 33 // Migrate in parallel 34 var endRootParallel1, endRootParallel2 cid.Cid 35 grp, ctx := errgroup.WithContext(ctx) 36 grp.Go(func() error { 37 var err1 error 38 endRootParallel1, err1 = nv10.MigrateStateTree(ctx, adtStore, startRoot, abi.ChainEpoch(0), nv10.Config{MaxWorkers: 2}, log, nv10.NewMemMigrationCache()) 39 return err1 40 }) 41 grp.Go(func() error { 42 var err2 error 43 endRootParallel2, err2 = nv10.MigrateStateTree(ctx, adtStore, startRoot, abi.ChainEpoch(0), nv10.Config{MaxWorkers: 2}, log, nv10.NewMemMigrationCache()) 44 return err2 45 }) 46 require.NoError(t, grp.Wait()) 47 assert.Equal(t, endRootSerial, endRootParallel1) 48 assert.Equal(t, endRootParallel1, endRootParallel2) 49 }