wait for pre-upgrades to exit on stop
This commit is contained in:
parent
f65d179f2c
commit
77117a0be5
@ -5,6 +5,7 @@ import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
"github.com/filecoin-project/go-state-types/rt"
|
||||
|
||||
@ -243,6 +244,8 @@ func (sm *StateManager) hasExpensiveFork(ctx context.Context, height abi.ChainEp
|
||||
}
|
||||
|
||||
func (sm *StateManager) preMigrationWorker(ctx context.Context) {
|
||||
defer close(sm.shutdown)
|
||||
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
|
||||
@ -252,6 +255,9 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) {
|
||||
run func(ts *types.TipSet)
|
||||
}
|
||||
|
||||
var wg sync.WaitGroup
|
||||
defer wg.Wait()
|
||||
|
||||
// Turn each pre-migration into an operation in a schedule.
|
||||
var schedule []op
|
||||
for upgradeEpoch, migration := range sm.stateMigrations {
|
||||
@ -270,7 +276,9 @@ func (sm *StateManager) preMigrationWorker(ctx context.Context) {
|
||||
|
||||
// TODO: are these values correct?
|
||||
run: func(ts *types.TipSet) {
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
err := migrationFunc(preCtx, sm, cache, ts.ParentState(), ts.Height(), ts)
|
||||
if err != nil {
|
||||
log.Errorw("failed to run pre-migration",
|
||||
|
@ -72,8 +72,8 @@ type migration struct {
|
||||
type StateManager struct {
|
||||
cs *store.ChainStore
|
||||
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
cancel context.CancelFunc
|
||||
shutdown chan struct{}
|
||||
|
||||
// Determines the network version at any given epoch.
|
||||
networkVersions []versionSpec
|
||||
@ -168,17 +168,24 @@ func cidsToKey(cids []cid.Cid) string {
|
||||
//
|
||||
// This is method is not safe to invoke from multiple threads or concurrently with Stop.
|
||||
func (sm *StateManager) Start(context.Context) error {
|
||||
sm.ctx, sm.cancel = context.WithCancel(context.Background())
|
||||
go sm.preMigrationWorker(sm.ctx)
|
||||
var ctx context.Context
|
||||
ctx, sm.cancel = context.WithCancel(context.Background())
|
||||
sm.shutdown = make(chan struct{})
|
||||
go sm.preMigrationWorker(ctx)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Stop starts the state manager's background processes.
|
||||
//
|
||||
// This is method is not safe to invoke from multiple threads or concurrently with Start.
|
||||
func (sm *StateManager) Stop(context.Context) error {
|
||||
// This is method is not safe to invoke concurrently with Start.
|
||||
func (sm *StateManager) Stop(ctx context.Context) error {
|
||||
if sm.cancel != nil {
|
||||
sm.cancel()
|
||||
select {
|
||||
case <-sm.shutdown:
|
||||
case <-ctx.Done():
|
||||
return ctx.Err()
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user