From 8ec7da0deeb86499929baf4d97846510b2762bd1 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 2 Mar 2022 09:33:33 -0700 Subject: [PATCH 1/3] Handle finalize failures in fsm --- cmd/lotus-miner/info.go | 1 + extern/storage-sealing/fsm.go | 6 ++ extern/storage-sealing/sector_state.go | 130 +++++++++++++------------ 3 files changed, 73 insertions(+), 64 deletions(-) diff --git a/cmd/lotus-miner/info.go b/cmd/lotus-miner/info.go index 1133908ca..249a839d6 100644 --- a/cmd/lotus-miner/info.go +++ b/cmd/lotus-miner/info.go @@ -527,6 +527,7 @@ var stateList = []stateMeta{ {col: color.FgRed, state: sealing.SnapDealsDealsExpired}, {col: color.FgRed, state: sealing.ReplicaUpdateFailed}, {col: color.FgRed, state: sealing.ReleaseSectorKeyFailed}, + {col: color.FgRed, state: sealing.FinalizeReplicaUpdateFailed}, } func init() { diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 251d3a74a..8678a0fe9 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -175,6 +175,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ), FinalizeReplicaUpdate: planOne( on(SectorFinalized{}, UpdateActivating), + on(SectorFinalizeFailed{}, FinalizeReplicaUpdateFailed), ), UpdateActivating: planOne( on(SectorUpdateActive{}, ReleaseSectorKey), @@ -267,6 +268,9 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto ReleaseSectorKeyFailed: planOne( on(SectorUpdateActive{}, ReleaseSectorKey), ), + FinalizeReplicaUpdateFailed: planOne( + on(SectorRetryFinalize{}, FinalizeReplicaUpdate), + ), // Post-seal @@ -536,6 +540,8 @@ func (m *Sealing) plan(events []statemachine.Event, state *SectorInfo) (func(sta return m.handleSubmitReplicaUpdateFailed, processed, nil case ReleaseSectorKeyFailed: return m.handleReleaseSectorKeyFailed, 0, err + case FinalizeReplicaUpdateFailed: + return m.handleFinalizeFailed, processed, nil case AbortUpgrade: return m.handleAbortUpgrade, processed, nil diff --git a/extern/storage-sealing/sector_state.go b/extern/storage-sealing/sector_state.go index 5c2c56171..0f8228d02 100644 --- a/extern/storage-sealing/sector_state.go +++ b/extern/storage-sealing/sector_state.go @@ -3,64 +3,65 @@ package sealing type SectorState string var ExistSectorStateList = map[SectorState]struct{}{ - Empty: {}, - WaitDeals: {}, - Packing: {}, - AddPiece: {}, - AddPieceFailed: {}, - GetTicket: {}, - PreCommit1: {}, - PreCommit2: {}, - PreCommitting: {}, - PreCommitWait: {}, - SubmitPreCommitBatch: {}, - PreCommitBatchWait: {}, - WaitSeed: {}, - Committing: {}, - CommitFinalize: {}, - CommitFinalizeFailed: {}, - SubmitCommit: {}, - CommitWait: {}, - SubmitCommitAggregate: {}, - CommitAggregateWait: {}, - FinalizeSector: {}, - Proving: {}, - FailedUnrecoverable: {}, - SealPreCommit1Failed: {}, - SealPreCommit2Failed: {}, - PreCommitFailed: {}, - ComputeProofFailed: {}, - CommitFailed: {}, - PackingFailed: {}, - FinalizeFailed: {}, - DealsExpired: {}, - RecoverDealIDs: {}, - Faulty: {}, - FaultReported: {}, - FaultedFinal: {}, - Terminating: {}, - TerminateWait: {}, - TerminateFinality: {}, - TerminateFailed: {}, - Removing: {}, - RemoveFailed: {}, - Removed: {}, - SnapDealsWaitDeals: {}, - SnapDealsAddPiece: {}, - SnapDealsPacking: {}, - UpdateReplica: {}, - ProveReplicaUpdate: {}, - SubmitReplicaUpdate: {}, - ReplicaUpdateWait: {}, - UpdateActivating: {}, - ReleaseSectorKey: {}, - FinalizeReplicaUpdate: {}, - SnapDealsAddPieceFailed: {}, - SnapDealsDealsExpired: {}, - SnapDealsRecoverDealIDs: {}, - ReplicaUpdateFailed: {}, - ReleaseSectorKeyFailed: {}, - AbortUpgrade: {}, + Empty: {}, + WaitDeals: {}, + Packing: {}, + AddPiece: {}, + AddPieceFailed: {}, + GetTicket: {}, + PreCommit1: {}, + PreCommit2: {}, + PreCommitting: {}, + PreCommitWait: {}, + SubmitPreCommitBatch: {}, + PreCommitBatchWait: {}, + WaitSeed: {}, + Committing: {}, + CommitFinalize: {}, + CommitFinalizeFailed: {}, + SubmitCommit: {}, + CommitWait: {}, + SubmitCommitAggregate: {}, + CommitAggregateWait: {}, + FinalizeSector: {}, + Proving: {}, + FailedUnrecoverable: {}, + SealPreCommit1Failed: {}, + SealPreCommit2Failed: {}, + PreCommitFailed: {}, + ComputeProofFailed: {}, + CommitFailed: {}, + PackingFailed: {}, + FinalizeFailed: {}, + DealsExpired: {}, + RecoverDealIDs: {}, + Faulty: {}, + FaultReported: {}, + FaultedFinal: {}, + Terminating: {}, + TerminateWait: {}, + TerminateFinality: {}, + TerminateFailed: {}, + Removing: {}, + RemoveFailed: {}, + Removed: {}, + SnapDealsWaitDeals: {}, + SnapDealsAddPiece: {}, + SnapDealsPacking: {}, + UpdateReplica: {}, + ProveReplicaUpdate: {}, + SubmitReplicaUpdate: {}, + ReplicaUpdateWait: {}, + UpdateActivating: {}, + ReleaseSectorKey: {}, + FinalizeReplicaUpdate: {}, + SnapDealsAddPieceFailed: {}, + SnapDealsDealsExpired: {}, + SnapDealsRecoverDealIDs: {}, + ReplicaUpdateFailed: {}, + ReleaseSectorKeyFailed: {}, + FinalizeReplicaUpdateFailed: {}, + AbortUpgrade: {}, } // cmd/lotus-miner/info.go defines CLI colors corresponding to these states @@ -124,12 +125,13 @@ const ( RecoverDealIDs SectorState = "RecoverDealIDs" // snap deals error modes - SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" - SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" - SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" - AbortUpgrade SectorState = "AbortUpgrade" - ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" - ReleaseSectorKeyFailed SectorState = "ReleaseSectorKeyFailed" + SnapDealsAddPieceFailed SectorState = "SnapDealsAddPieceFailed" + SnapDealsDealsExpired SectorState = "SnapDealsDealsExpired" + SnapDealsRecoverDealIDs SectorState = "SnapDealsRecoverDealIDs" + AbortUpgrade SectorState = "AbortUpgrade" + ReplicaUpdateFailed SectorState = "ReplicaUpdateFailed" + ReleaseSectorKeyFailed SectorState = "ReleaseSectorKeyFailed" + FinalizeReplicaUpdateFailed SectorState = "FinalizeReplicaUpdateFailed" Faulty SectorState = "Faulty" // sector is corrupted or gone for some reason FaultReported SectorState = "FaultReported" // sector has been declared as a fault on chain From 93e22da5395692ec4bd33613d5d3fc73596e5876 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Wed, 2 Mar 2022 13:03:03 -0700 Subject: [PATCH 2/3] Log instead of error normal shutdown of state machine --- extern/storage-sealing/fsm.go | 36 ++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/extern/storage-sealing/fsm.go b/extern/storage-sealing/fsm.go index 8678a0fe9..2c50d1885 100644 --- a/extern/storage-sealing/fsm.go +++ b/extern/storage-sealing/fsm.go @@ -19,7 +19,13 @@ import ( 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 { - return nil, processed, err + l := Log{ + Timestamp: uint64(time.Now().Unix()), + Message: fmt.Sprintf("state machine error: %s", err), + Kind: fmt.Sprintf("error;%T", err), + } + user.(*SectorInfo).logAppend(l) + return nil, processed, nil } return func(ctx statemachine.Context, si SectorInfo) error { @@ -313,6 +319,21 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto FailedUnrecoverable: final, } +func (state *SectorInfo) logAppend(l Log) { + if len(state.Log) > 8000 { + log.Warnw("truncating sector log", "sector", state.SectorNumber) + state.Log[2000] = Log{ + Timestamp: uint64(time.Now().Unix()), + Message: "truncating log (above 8000 entries)", + Kind: fmt.Sprintf("truncate"), + } + + state.Log = append(state.Log[:2000], state.Log[6000:]...) + } + + state.Log = append(state.Log, l) +} + func (m *Sealing) logEvents(events []statemachine.Event, state *SectorInfo) { for _, event := range events { log.Debugw("sector event", "sector", state.SectorNumber, "type", fmt.Sprintf("%T", event.User), "event", event.User) @@ -341,18 +362,7 @@ func (m *Sealing) logEvents(events []statemachine.Event, state *SectorInfo) { l.Trace = fmt.Sprintf("%+v", err) } - if len(state.Log) > 8000 { - log.Warnw("truncating sector log", "sector", state.SectorNumber) - state.Log[2000] = Log{ - Timestamp: uint64(time.Now().Unix()), - Message: "truncating log (above 8000 entries)", - Kind: fmt.Sprintf("truncate"), - } - - state.Log = append(state.Log[:2000], state.Log[6000:]...) - } - - state.Log = append(state.Log, l) + state.logAppend(l) } } From e51b10e6a5c91e440c1fa51e92ec150316848ff3 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 3 Mar 2022 18:57:20 -0500 Subject: [PATCH 3/3] release v1.14.4 --- CHANGELOG.md | 10 ++++++++++ build/openrpc/full.json.gz | Bin 25706 -> 25705 bytes build/openrpc/miner.json.gz | Bin 11768 -> 11768 bytes build/openrpc/worker.json.gz | Bin 3845 -> 3845 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 629635c1e..ebb5b6a5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Lotus changelog +# 1.14.4 / 2022-03-03 + +This is a *highly recommended* optional release for storage providers that are doing snap deals. This fix the bug +that causes some snap deal sectors are stuck in `FinalizeReplicaUpdate`. In addition, SPs should be able to force +update sectors status without getting blocked by `normal shutdown of state machine`. + +# v1.14.3 / 2022-02-28 + +This is an **optional** release, that includes a fix to properly register the `--really-do-it` flag for abort-upgrade. + # 1.14.2 / 2022-02-24 This is an **optional** release of lotus, that's had a couple more improvements w.r.t Snap experience for storage providers in preparation of the[upcoming OhSnap upgrade](https://github.com/filecoin-project/community/discussions/74?sort=new#discussioncomment-1922550). diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index d6f1437743b300f25103a5f74057caeaff6a4d93..f49edde9dc991573574a1402faac05ce7126bc5a 100644 GIT binary patch delta 30 mcmaELg7M`E#tB`FUpIEYWn?_Pxr*sUBFE_pKjtiMRt5m=s0{i5 delta 31 ncmaEPg7MV}#tB`F-!^u?Wn_Baxw(?*MIuL6!HU&c+^h@$1EmgO diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 676bd4d72b0ab84c251f62902faa5fc1061b4748..9c85c08e5ddcede63290c629045be3f80f92948e 100644 GIT binary patch delta 11735 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 84c7626f7b0f83752db042c59e80910a3214a92e..e8e1f8c67740bf76458a1e8103a6078d2e7ebfa9 100644 GIT binary patch delta 21 dcmZpbYn7YO$QZk^shW@D