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-01-16 02:53:59 +00:00
|
|
|
"github.com/ipfs/go-cid"
|
2020-03-22 20:44:27 +00:00
|
|
|
"golang.org/x/xerrors"
|
2020-01-16 02:55:12 +00:00
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/api"
|
2020-01-15 20:53:14 +00:00
|
|
|
)
|
|
|
|
|
2020-01-16 01:25:49 +00:00
|
|
|
type mutator interface {
|
|
|
|
apply(state *SectorInfo)
|
|
|
|
}
|
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
// 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
|
|
|
|
2020-01-16 02:53:59 +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
|
|
|
|
2020-01-16 02:53:59 +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:53:59 +00:00
|
|
|
}
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
func (evt SectorForceState) applyGlobal(state *SectorInfo) bool {
|
2020-03-22 20:44:27 +00:00
|
|
|
state.State = evt.State
|
2020-01-16 02:53:59 +00:00
|
|
|
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
|
|
|
|
2020-01-16 01:25:49 +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-01-16 01:25:49 +00:00
|
|
|
}
|
|
|
|
|
2020-03-22 20:44:27 +00:00
|
|
|
type SectorPacked struct{ Pieces []Piece }
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 01:25:49 +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-16 01:25:49 +00:00
|
|
|
}
|
2020-01-15 20:53:14 +00:00
|
|
|
|
2020-01-22 19:47:29 +00:00
|
|
|
type SectorPackingFailed struct{ error }
|
|
|
|
|
|
|
|
func (evt SectorPackingFailed) apply(*SectorInfo) {}
|
|
|
|
|
2020-01-15 20:53:14 +00:00
|
|
|
type SectorSealed struct {
|
2020-03-22 20:44:27 +00:00
|
|
|
Sealed cid.Cid
|
|
|
|
Unsealed cid.Cid
|
|
|
|
Ticket api.SealTicket
|
2020-01-15 20:53:14 +00:00
|
|
|
}
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 01:25:49 +00:00
|
|
|
func (evt SectorSealed) 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-03-22 20:44:27 +00:00
|
|
|
state.Ticket = evt.Ticket
|
2020-01-16 01:25:49 +00:00
|
|
|
}
|
|
|
|
|
2020-01-15 20:53:14 +00:00
|
|
|
type SectorSealFailed struct{ error }
|
2020-03-22 21:39:27 +00:00
|
|
|
|
|
|
|
func (evt SectorSealFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
|
|
|
|
func (evt SectorSealFailed) apply(*SectorInfo) {}
|
2020-01-15 20:53:14 +00:00
|
|
|
|
|
|
|
type SectorPreCommitFailed struct{ error }
|
2020-03-22 21:39:27 +00:00
|
|
|
|
|
|
|
func (evt SectorPreCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error }
|
|
|
|
func (evt SectorPreCommitFailed) apply(*SectorInfo) {}
|
2020-01-16 01:25:49 +00:00
|
|
|
|
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
|
|
|
|
2020-01-16 01:25:49 +00:00
|
|
|
func (evt SectorPreCommitted) apply(state *SectorInfo) {
|
2020-03-22 20:44:27 +00:00
|
|
|
state.PreCommitMessage = &evt.Message
|
2020-01-16 01:25:49 +00:00
|
|
|
}
|
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
|
|
|
|
2020-01-16 01:25:49 +00:00
|
|
|
func (evt SectorSeedReady) apply(state *SectorInfo) {
|
2020-03-22 20:44:27 +00:00
|
|
|
state.Seed = evt.Seed
|
2020-01-16 01:25:49 +00:00
|
|
|
}
|
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
|
|
|
|
2020-01-16 01:25:49 +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-16 01:25:49 +00:00
|
|
|
}
|
2020-01-15 20:53:14 +00:00
|
|
|
|
|
|
|
type SectorProving struct{}
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 01:25:49 +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
|
|
|
|
2020-01-23 15:38:01 +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) {}
|
|
|
|
|
2020-01-23 15:38:01 +00:00
|
|
|
// Faults
|
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
type SectorFaulty struct{}
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
func (evt SectorFaulty) apply(state *SectorInfo) {}
|
2020-01-15 20:53:14 +00:00
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
type SectorFaultReported struct{ reportMsg cid.Cid }
|
2020-01-16 02:54:57 +00:00
|
|
|
|
2020-01-16 02:53:59 +00:00
|
|
|
func (evt SectorFaultReported) apply(state *SectorInfo) {
|
|
|
|
state.FaultReportMsg = &evt.reportMsg
|
2020-01-15 20:53:14 +00:00
|
|
|
}
|
2020-01-16 02:53:59 +00:00
|
|
|
|
|
|
|
type SectorFaultedFinal struct{}
|