add a new state for precommit wait

This commit is contained in:
Jeromy 2020-05-18 15:49:21 -07:00
parent 744fc321e9
commit 06bcde9c2d
6 changed files with 30 additions and 4 deletions

10
fsm.go
View File

@ -46,9 +46,13 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
), ),
PreCommitting: planOne( PreCommitting: planOne(
on(SectorSealPreCommitFailed{}, SealFailed), on(SectorSealPreCommitFailed{}, SealFailed),
on(SectorPreCommitted{}, WaitSeed), on(SectorPreCommitted{}, PreCommitWait),
on(SectorChainPreCommitFailed{}, PreCommitFailed), on(SectorChainPreCommitFailed{}, PreCommitFailed),
), ),
PreCommitWait: planOne(
on(SectorChainPreCommitFailed{}, PreCommitFailed),
on(SectorPreCommitLanded{}, WaitSeed),
),
WaitSeed: planOne( WaitSeed: planOne(
on(SectorSeedReady{}, Committing), on(SectorSeedReady{}, Committing),
on(SectorChainPreCommitFailed{}, PreCommitFailed), on(SectorChainPreCommitFailed{}, PreCommitFailed),
@ -177,6 +181,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta
return m.handlePreCommit2, nil return m.handlePreCommit2, nil
case PreCommitting: case PreCommitting:
return m.handlePreCommitting, nil return m.handlePreCommitting, nil
case PreCommitWait:
return m.handlePreCommitWait, nil
case WaitSeed: case WaitSeed:
return m.handleWaitSeed, nil return m.handleWaitSeed, nil
case Committing: case Committing:
@ -211,7 +217,7 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta
case FailedUnrecoverable: case FailedUnrecoverable:
log.Errorf("sector %d failed unrecoverably", state.SectorNumber) log.Errorf("sector %d failed unrecoverably", state.SectorNumber)
default: default:
log.Errorf("unexpected sector update state: %d", state.State) log.Errorf("unexpected sector update state: %s", state.State)
} }
return nil, nil return nil, nil

View File

@ -98,6 +98,14 @@ func (evt SectorPreCommit2) apply(state *SectorInfo) {
state.CommR = &commr state.CommR = &commr
} }
type SectorPreCommitLanded struct {
TipSet TipSetToken
}
func (evt SectorPreCommitLanded) apply(si *SectorInfo) {
si.PreCommitTipSet = evt.TipSet
}
type SectorSealPreCommitFailed struct{ error } type SectorSealPreCommitFailed struct{ error }
func (evt SectorSealPreCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error } func (evt SectorSealPreCommitFailed) FormatError(xerrors.Printer) (next error) { return evt.error }

View File

@ -41,6 +41,9 @@ func TestHappyPath(t *testing.T) {
require.Equal(m.t, m.state.State, PreCommitting) require.Equal(m.t, m.state.State, PreCommitting)
m.planSingle(SectorPreCommitted{}) m.planSingle(SectorPreCommitted{})
require.Equal(m.t, m.state.State, PreCommitWait)
m.planSingle(SectorPreCommitLanded{})
require.Equal(m.t, m.state.State, WaitSeed) require.Equal(m.t, m.state.State, WaitSeed)
m.planSingle(SectorSeedReady{}) m.planSingle(SectorSeedReady{})
@ -73,6 +76,9 @@ func TestSeedRevert(t *testing.T) {
require.Equal(m.t, m.state.State, PreCommitting) require.Equal(m.t, m.state.State, PreCommitting)
m.planSingle(SectorPreCommitted{}) m.planSingle(SectorPreCommitted{})
require.Equal(m.t, m.state.State, PreCommitWait)
m.planSingle(SectorPreCommitLanded{})
require.Equal(m.t, m.state.State, WaitSeed) require.Equal(m.t, m.state.State, WaitSeed)
m.planSingle(SectorSeedReady{}) m.planSingle(SectorSeedReady{})

View File

@ -11,6 +11,7 @@ const (
PreCommit1 SectorState = "PreCommit1" // do PreCommit1 PreCommit1 SectorState = "PreCommit1" // do PreCommit1
PreCommit2 SectorState = "PreCommit2" // do PreCommit1 PreCommit2 SectorState = "PreCommit2" // do PreCommit1
PreCommitting SectorState = "PreCommitting" // on chain pre-commit PreCommitting SectorState = "PreCommitting" // on chain pre-commit
PreCommitWait SectorState = "PreCommitWait" // waiting for precommit to land on chain
WaitSeed SectorState = "WaitSeed" // waiting for seed WaitSeed SectorState = "WaitSeed" // waiting for seed
Committing SectorState = "Committing" Committing SectorState = "Committing"
CommitWait SectorState = "CommitWait" // waiting for message to land on chain CommitWait SectorState = "CommitWait" // waiting for message to land on chain

View File

@ -159,7 +159,7 @@ func (m *Sealing) handlePreCommitting(ctx statemachine.Context, sector SectorInf
return ctx.Send(SectorPreCommitted{Message: mcid}) return ctx.Send(SectorPreCommitted{Message: mcid})
} }
func (m *Sealing) handleWaitSeed(ctx statemachine.Context, sector SectorInfo) error { func (m *Sealing) handlePreCommitWait(ctx statemachine.Context, sector SectorInfo) error {
// would be ideal to just use the events.Called handler, but it wouldnt be able to handle individual message timeouts // would be ideal to just use the events.Called handler, but it wouldnt be able to handle individual message timeouts
log.Info("Sector precommitted: ", sector.SectorNumber) log.Info("Sector precommitted: ", sector.SectorNumber)
mw, err := m.api.StateWaitMsg(ctx.Context(), *sector.PreCommitMessage) mw, err := m.api.StateWaitMsg(ctx.Context(), *sector.PreCommitMessage)
@ -174,7 +174,11 @@ func (m *Sealing) handleWaitSeed(ctx statemachine.Context, sector SectorInfo) er
} }
log.Info("precommit message landed on chain: ", sector.SectorNumber) log.Info("precommit message landed on chain: ", sector.SectorNumber)
pci, err := m.api.StateSectorPreCommitInfo(ctx.Context(), m.maddr, sector.SectorNumber, mw.TipSetTok) return ctx.Send(SectorPreCommitLanded{TipSet: mw.TipSetTok})
}
func (m *Sealing) handleWaitSeed(ctx statemachine.Context, sector SectorInfo) error {
pci, err := m.api.StateSectorPreCommitInfo(ctx.Context(), m.maddr, sector.SectorNumber, sector.PreCommitTipSet)
if err != nil { if err != nil {
return xerrors.Errorf("getting precommit info: %w", err) return xerrors.Errorf("getting precommit info: %w", err)
} }

View File

@ -67,6 +67,7 @@ type SectorInfo struct {
Proof []byte Proof []byte
PreCommitMessage *cid.Cid PreCommitMessage *cid.Cid
PreCommitTipSet TipSetToken
// WaitSeed // WaitSeed
SeedValue abi.InteractiveSealRandomness SeedValue abi.InteractiveSealRandomness