lotus/storage/sealing/fsm_events.go

195 lines
4.7 KiB
Go
Raw Normal View History

2020-01-15 20:53:14 +00:00
package sealing
import (
2020-02-08 02:18:32 +00:00
"github.com/filecoin-project/specs-actors/actors/abi"
2020-04-03 16:54:01 +00:00
"github.com/filecoin-project/specs-storage/storage"
"github.com/ipfs/go-cid"
2020-03-22 20:44:27 +00:00
"golang.org/x/xerrors"
"github.com/filecoin-project/lotus/api"
2020-01-15 20:53:14 +00:00
)
type mutator interface {
apply(state *SectorInfo)
}
// globalMutator is an event which can apply in every state
type globalMutator interface {
// applyGlobal applies the event to the state. If if returns true,
// event processing should be interrupted
applyGlobal(state *SectorInfo) bool
}
// Global events
type SectorRestart struct{}
2020-01-16 02:54:57 +00:00
func (evt SectorRestart) applyGlobal(*SectorInfo) bool { return false }
type SectorFatalError struct{ error }
2020-03-22 21:39:27 +00:00
func (evt SectorFatalError) FormatError(xerrors.Printer) (next error) { return evt.error }
2020-01-16 02:54:57 +00:00
func (evt SectorFatalError) applyGlobal(state *SectorInfo) bool {
log.Errorf("Fatal error on sector %d: %+v", state.SectorID, evt.error)
// TODO: Do we want to mark the state as unrecoverable?
// I feel like this should be a softer error, where the user would
// be able to send a retry event of some kind
return true
}
type SectorForceState struct {
2020-03-22 20:44:27 +00:00
State api.SectorState
}
2020-01-16 02:54:57 +00:00
func (evt SectorForceState) applyGlobal(state *SectorInfo) bool {
2020-03-22 20:44:27 +00:00
state.State = evt.State
return true
}
// Normal path
2020-01-15 20:53:14 +00:00
type SectorStart struct {
2020-03-22 20:44:27 +00:00
ID abi.SectorNumber
SectorType abi.RegisteredProof
Pieces []Piece
2020-01-15 20:53:14 +00:00
}
2020-01-16 02:54:57 +00:00
func (evt SectorStart) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
state.SectorID = evt.ID
state.Pieces = evt.Pieces
state.SectorType = evt.SectorType
}
2020-03-22 20:44:27 +00:00
type SectorPacked struct{ Pieces []Piece }
2020-01-16 02:54:57 +00:00
func (evt SectorPacked) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
state.Pieces = append(state.Pieces, evt.Pieces...)
}
2020-01-15 20:53:14 +00:00
type SectorPackingFailed struct{ error }
func (evt SectorPackingFailed) apply(*SectorInfo) {}
2020-04-03 16:54:01 +00:00
type SectorPreCommit1 struct {
PreCommit1Out storage.PreCommit1Out
Ticket api.SealTicket
}
func (evt SectorPreCommit1) apply(state *SectorInfo) {
state.PreCommit1Out = evt.PreCommit1Out
state.Ticket = evt.Ticket
}
type SectorPreCommit2 struct {
2020-03-22 20:44:27 +00:00
Sealed cid.Cid
Unsealed cid.Cid
2020-01-15 20:53:14 +00:00
}
2020-01-16 02:54:57 +00:00
2020-04-03 16:54:01 +00:00
func (evt SectorPreCommit2) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
commd := evt.Unsealed
2020-02-27 00:42:39 +00:00
state.CommD = &commd
2020-03-22 20:44:27 +00:00
commr := evt.Sealed
2020-02-27 00:42:39 +00:00
state.CommR = &commr
}
2020-04-03 16:54:01 +00:00
type SectorSealPreCommitFailed struct{ error }
2020-03-22 21:39:27 +00:00
2020-04-03 16:54:01 +00:00
func (evt SectorSealPreCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
2020-04-04 01:50:05 +00:00
func (evt SectorSealPreCommitFailed) apply(si *SectorInfo) {
si.InvalidProofs = 0 // reset counter
}
2020-01-15 20:53:14 +00:00
2020-04-03 16:54:01 +00:00
type SectorChainPreCommitFailed struct{ error }
2020-03-22 21:39:27 +00:00
2020-04-03 16:54:01 +00:00
func (evt SectorChainPreCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
func (evt SectorChainPreCommitFailed) apply(*SectorInfo) {}
2020-01-15 20:53:14 +00:00
type SectorPreCommitted struct {
2020-03-22 20:44:27 +00:00
Message cid.Cid
2020-01-15 20:53:14 +00:00
}
2020-01-16 02:54:57 +00:00
func (evt SectorPreCommitted) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
state.PreCommitMessage = &evt.Message
}
2020-01-15 20:53:14 +00:00
type SectorSeedReady struct {
2020-03-22 20:44:27 +00:00
Seed api.SealSeed
2020-01-15 20:53:14 +00:00
}
2020-01-16 02:54:57 +00:00
func (evt SectorSeedReady) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
state.Seed = evt.Seed
}
2020-01-15 20:53:14 +00:00
2020-01-20 22:04:46 +00:00
type SectorComputeProofFailed struct{ error }
2020-03-22 21:39:27 +00:00
func (evt SectorComputeProofFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
func (evt SectorComputeProofFailed) apply(*SectorInfo) {}
2020-01-20 08:23:56 +00:00
2020-01-15 20:53:14 +00:00
type SectorCommitFailed struct{ error }
2020-03-22 21:39:27 +00:00
func (evt SectorCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
func (evt SectorCommitFailed) apply(*SectorInfo) {}
2020-01-20 08:23:56 +00:00
2020-01-15 20:53:14 +00:00
type SectorCommitted struct {
2020-03-22 20:44:27 +00:00
Message cid.Cid
Proof []byte
2020-01-15 20:53:14 +00:00
}
2020-01-16 02:54:57 +00:00
func (evt SectorCommitted) apply(state *SectorInfo) {
2020-03-22 20:44:27 +00:00
state.Proof = evt.Proof
state.CommitMessage = &evt.Message
}
2020-01-15 20:53:14 +00:00
type SectorProving struct{}
2020-01-16 02:54:57 +00:00
func (evt SectorProving) apply(*SectorInfo) {}
2020-01-15 20:53:14 +00:00
2020-01-29 21:25:06 +00:00
type SectorFinalized struct{}
func (evt SectorFinalized) apply(*SectorInfo) {}
type SectorFinalizeFailed struct{ error }
2020-03-22 21:39:27 +00:00
func (evt SectorFinalizeFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
func (evt SectorFinalizeFailed) apply(*SectorInfo) {}
2020-01-29 21:25:06 +00:00
// Failed state recovery
type SectorRetrySeal struct{}
func (evt SectorRetrySeal) apply(state *SectorInfo) {}
2020-01-23 17:34:04 +00:00
type SectorRetryPreCommit struct{}
func (evt SectorRetryPreCommit) apply(state *SectorInfo) {}
type SectorRetryWaitSeed struct{}
func (evt SectorRetryWaitSeed) apply(state *SectorInfo) {}
type SectorRetryComputeProof struct{}
func (evt SectorRetryComputeProof) apply(state *SectorInfo) {}
2020-04-04 01:50:05 +00:00
type SectorRetryInvalidProof struct{}
func (evt SectorRetryInvalidProof) apply(state *SectorInfo) {
state.InvalidProofs++
}
// Faults
type SectorFaulty struct{}
2020-01-16 02:54:57 +00:00
func (evt SectorFaulty) apply(state *SectorInfo) {}
2020-01-15 20:53:14 +00:00
type SectorFaultReported struct{ reportMsg cid.Cid }
2020-01-16 02:54:57 +00:00
func (evt SectorFaultReported) apply(state *SectorInfo) {
state.FaultReportMsg = &evt.reportMsg
2020-01-15 20:53:14 +00:00
}
type SectorFaultedFinal struct{}