From 04fe9062a6f6c20df7715c2ae0da2a41e4977fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 28 Feb 2023 09:48:17 +0100 Subject: [PATCH] fix: fsm: shutdown removed sectors FSMs --- storage/pipeline/fsm.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/storage/pipeline/fsm.go b/storage/pipeline/fsm.go index 25fd6fcef..8ae18a9fd 100644 --- a/storage/pipeline/fsm.go +++ b/storage/pipeline/fsm.go @@ -6,8 +6,10 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "net/http" + "os" "reflect" "time" @@ -19,9 +21,15 @@ import ( "github.com/filecoin-project/lotus/api" ) +var errSectorRemoved = errors.New("sector removed") + func (m *Sealing) Plan(events []statemachine.Event, user interface{}) (interface{}, uint64, error) { next, processed, err := m.plan(events, user.(*SectorInfo)) if err != nil || next == nil { + if err == errSectorRemoved && os.Getenv("LOTUS_KEEP_REMOVED_FSM_ACTIVE") != "1" { + return nil, processed, statemachine.ErrTerminated + } + l := Log{ Timestamp: uint64(time.Now().Unix()), Message: fmt.Sprintf("state machine error: %s", err), @@ -601,7 +609,7 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta case Removing: return m.handleRemoving, processed, nil case Removed: - return nil, processed, nil + return nil, processed, errSectorRemoved case RemoveFailed: return m.handleRemoveFailed, processed, nil @@ -615,13 +623,14 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta // Fatal errors case UndefinedSectorState: log.Error("sector update with undefined state!") + return nil, processed, xerrors.Errorf("sector update with undefined state") case FailedUnrecoverable: log.Errorf("sector %d failed unrecoverably", state.SectorNumber) + return nil, processed, xerrors.Errorf("sector %d failed unrecoverably", state.SectorNumber) default: log.Errorf("unexpected sector update state: %s", state.State) + return nil, processed, xerrors.Errorf("unexpected sector update state: %s", state.State) } - - return nil, processed, nil } func (m *Sealing) onUpdateSector(ctx context.Context, state *SectorInfo) error {