feat: sealer: allow users to abort in-flight snap upgrades
This commit is contained in:
parent
e17ae2eaf4
commit
1b18236f91
@ -113,6 +113,8 @@ type StorageMiner interface {
|
|||||||
// SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message
|
// SectorCommitPending returns a list of pending Commit sectors to be sent in the next aggregate message
|
||||||
SectorCommitPending(ctx context.Context) ([]abi.SectorID, error) //perm:admin
|
SectorCommitPending(ctx context.Context) ([]abi.SectorID, error) //perm:admin
|
||||||
SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error //perm:admin
|
SectorMatchPendingPiecesToOpenSectors(ctx context.Context) error //perm:admin
|
||||||
|
// SectorAbortUpgrade can be called on sectors that are in the process of being upgraded to abort it
|
||||||
|
SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin
|
||||||
|
|
||||||
// WorkerConnect tells the node to connect to workers RPC
|
// WorkerConnect tells the node to connect to workers RPC
|
||||||
WorkerConnect(context.Context, string) error //perm:admin retry:true
|
WorkerConnect(context.Context, string) error //perm:admin retry:true
|
||||||
|
@ -747,6 +747,8 @@ type StorageMinerStruct struct {
|
|||||||
|
|
||||||
SealingSchedDiag func(p0 context.Context, p1 bool) (interface{}, error) `perm:"admin"`
|
SealingSchedDiag func(p0 context.Context, p1 bool) (interface{}, error) `perm:"admin"`
|
||||||
|
|
||||||
|
SectorAbortUpgrade func(p0 context.Context, p1 abi.SectorNumber) error `perm:"admin"`
|
||||||
|
|
||||||
SectorAddPieceToAny func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storage.Data, p3 PieceDealInfo) (SectorOffset, error) `perm:"admin"`
|
SectorAddPieceToAny func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storage.Data, p3 PieceDealInfo) (SectorOffset, error) `perm:"admin"`
|
||||||
|
|
||||||
SectorCommitFlush func(p0 context.Context) ([]sealiface.CommitBatchRes, error) `perm:"admin"`
|
SectorCommitFlush func(p0 context.Context) ([]sealiface.CommitBatchRes, error) `perm:"admin"`
|
||||||
@ -4402,6 +4404,17 @@ func (s *StorageMinerStub) SealingSchedDiag(p0 context.Context, p1 bool) (interf
|
|||||||
return nil, ErrNotSupported
|
return nil, ErrNotSupported
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *StorageMinerStruct) SectorAbortUpgrade(p0 context.Context, p1 abi.SectorNumber) error {
|
||||||
|
if s.Internal.SectorAbortUpgrade == nil {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
return s.Internal.SectorAbortUpgrade(p0, p1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StorageMinerStub) SectorAbortUpgrade(p0 context.Context, p1 abi.SectorNumber) error {
|
||||||
|
return ErrNotSupported
|
||||||
|
}
|
||||||
|
|
||||||
func (s *StorageMinerStruct) SectorAddPieceToAny(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storage.Data, p3 PieceDealInfo) (SectorOffset, error) {
|
func (s *StorageMinerStruct) SectorAddPieceToAny(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storage.Data, p3 PieceDealInfo) (SectorOffset, error) {
|
||||||
if s.Internal.SectorAddPieceToAny == nil {
|
if s.Internal.SectorAddPieceToAny == nil {
|
||||||
return *new(SectorOffset), ErrNotSupported
|
return *new(SectorOffset), ErrNotSupported
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -55,6 +55,7 @@ var sectorsCmd = &cli.Command{
|
|||||||
sectorsTerminateCmd,
|
sectorsTerminateCmd,
|
||||||
sectorsRemoveCmd,
|
sectorsRemoveCmd,
|
||||||
sectorsSnapUpCmd,
|
sectorsSnapUpCmd,
|
||||||
|
sectorsSnapAbortCmd,
|
||||||
sectorsMarkForUpgradeCmd,
|
sectorsMarkForUpgradeCmd,
|
||||||
sectorsStartSealCmd,
|
sectorsStartSealCmd,
|
||||||
sectorsSealDelayCmd,
|
sectorsSealDelayCmd,
|
||||||
@ -1520,6 +1521,31 @@ var sectorsSnapUpCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var sectorsSnapAbortCmd = &cli.Command{
|
||||||
|
Name: "abort-upgrade",
|
||||||
|
Usage: "Abort the attempted (SnapDeals) upgrade of a CC sector, reverting it to as before",
|
||||||
|
ArgsUsage: "<sectorNum>",
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
if cctx.Args().Len() != 1 {
|
||||||
|
return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number"))
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
|
||||||
|
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("could not parse sector number: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodeApi.SectorAbortUpgrade(ctx, abi.SectorNumber(id))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
var sectorsMarkForUpgradeCmd = &cli.Command{
|
var sectorsMarkForUpgradeCmd = &cli.Command{
|
||||||
Name: "mark-for-upgrade",
|
Name: "mark-for-upgrade",
|
||||||
Usage: "Mark a committed capacity sector for replacement by a sector with deals",
|
Usage: "Mark a committed capacity sector for replacement by a sector with deals",
|
||||||
|
@ -112,6 +112,7 @@
|
|||||||
* [SealingAbort](#SealingAbort)
|
* [SealingAbort](#SealingAbort)
|
||||||
* [SealingSchedDiag](#SealingSchedDiag)
|
* [SealingSchedDiag](#SealingSchedDiag)
|
||||||
* [Sector](#Sector)
|
* [Sector](#Sector)
|
||||||
|
* [SectorAbortUpgrade](#SectorAbortUpgrade)
|
||||||
* [SectorAddPieceToAny](#SectorAddPieceToAny)
|
* [SectorAddPieceToAny](#SectorAddPieceToAny)
|
||||||
* [SectorCommitFlush](#SectorCommitFlush)
|
* [SectorCommitFlush](#SectorCommitFlush)
|
||||||
* [SectorCommitPending](#SectorCommitPending)
|
* [SectorCommitPending](#SectorCommitPending)
|
||||||
@ -1841,6 +1842,21 @@ Response: `{}`
|
|||||||
## Sector
|
## Sector
|
||||||
|
|
||||||
|
|
||||||
|
### SectorAbortUpgrade
|
||||||
|
SectorAbortUpgrade can be called on sectors that are in the process of being upgraded to abort it
|
||||||
|
|
||||||
|
|
||||||
|
Perms: admin
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
9
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
Response: `{}`
|
||||||
|
|
||||||
### SectorAddPieceToAny
|
### SectorAddPieceToAny
|
||||||
Add piece to an open sector. If no sectors with enough space are open,
|
Add piece to an open sector. If no sectors with enough space are open,
|
||||||
either a new sector will be created, or this call will block until more
|
either a new sector will be created, or this call will block until more
|
||||||
|
@ -1512,6 +1512,7 @@ COMMANDS:
|
|||||||
terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector)
|
terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector)
|
||||||
remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty))
|
remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty))
|
||||||
snap-up Mark a committed capacity sector to be filled with deals
|
snap-up Mark a committed capacity sector to be filled with deals
|
||||||
|
abort-upgrade Abort the attempted (SnapDeals) upgrade of a CC sector, reverting it to as before
|
||||||
mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals
|
mark-for-upgrade Mark a committed capacity sector for replacement by a sector with deals
|
||||||
seal Manually start sealing a sector (filling any unused space with junk)
|
seal Manually start sealing a sector (filling any unused space with junk)
|
||||||
set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts
|
set-seal-delay Set the time, in minutes, that a new sector waits for deals before sealing starts
|
||||||
@ -1747,6 +1748,19 @@ OPTIONS:
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### lotus-miner sectors abort-upgrade
|
||||||
|
```
|
||||||
|
NAME:
|
||||||
|
lotus-miner sectors abort-upgrade - Abort the attempted (SnapDeals) upgrade of a CC sector, reverting it to as before
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
lotus-miner sectors abort-upgrade [command options] <sectorNum>
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
### lotus-miner sectors mark-for-upgrade
|
### lotus-miner sectors mark-for-upgrade
|
||||||
```
|
```
|
||||||
NAME:
|
NAME:
|
||||||
|
7
extern/storage-sealing/fsm.go
vendored
7
extern/storage-sealing/fsm.go
vendored
@ -137,27 +137,32 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
|
|||||||
SnapDealsWaitDeals: planOne(
|
SnapDealsWaitDeals: planOne(
|
||||||
on(SectorAddPiece{}, SnapDealsAddPiece),
|
on(SectorAddPiece{}, SnapDealsAddPiece),
|
||||||
on(SectorStartPacking{}, SnapDealsPacking),
|
on(SectorStartPacking{}, SnapDealsPacking),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
SnapDealsAddPiece: planOne(
|
SnapDealsAddPiece: planOne(
|
||||||
on(SectorPieceAdded{}, SnapDealsWaitDeals),
|
on(SectorPieceAdded{}, SnapDealsWaitDeals),
|
||||||
apply(SectorStartPacking{}),
|
apply(SectorStartPacking{}),
|
||||||
apply(SectorAddPiece{}),
|
apply(SectorAddPiece{}),
|
||||||
on(SectorAddPieceFailed{}, SnapDealsAddPieceFailed),
|
on(SectorAddPieceFailed{}, SnapDealsAddPieceFailed),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
SnapDealsPacking: planOne(
|
SnapDealsPacking: planOne(
|
||||||
on(SectorPacked{}, UpdateReplica),
|
on(SectorPacked{}, UpdateReplica),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
UpdateReplica: planOne(
|
UpdateReplica: planOne(
|
||||||
on(SectorReplicaUpdate{}, ProveReplicaUpdate),
|
on(SectorReplicaUpdate{}, ProveReplicaUpdate),
|
||||||
on(SectorUpdateReplicaFailed{}, ReplicaUpdateFailed),
|
on(SectorUpdateReplicaFailed{}, ReplicaUpdateFailed),
|
||||||
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
||||||
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
ProveReplicaUpdate: planOne(
|
ProveReplicaUpdate: planOne(
|
||||||
on(SectorProveReplicaUpdate{}, SubmitReplicaUpdate),
|
on(SectorProveReplicaUpdate{}, SubmitReplicaUpdate),
|
||||||
on(SectorProveReplicaUpdateFailed{}, ReplicaUpdateFailed),
|
on(SectorProveReplicaUpdateFailed{}, ReplicaUpdateFailed),
|
||||||
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
||||||
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
SubmitReplicaUpdate: planOne(
|
SubmitReplicaUpdate: planOne(
|
||||||
on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait),
|
on(SectorReplicaUpdateSubmitted{}, ReplicaUpdateWait),
|
||||||
@ -231,6 +236,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
|
|||||||
on(SectorRetryWaitDeals{}, SnapDealsWaitDeals),
|
on(SectorRetryWaitDeals{}, SnapDealsWaitDeals),
|
||||||
apply(SectorStartPacking{}),
|
apply(SectorStartPacking{}),
|
||||||
apply(SectorAddPiece{}),
|
apply(SectorAddPiece{}),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
SnapDealsDealsExpired: planOne(
|
SnapDealsDealsExpired: planOne(
|
||||||
on(SectorAbortUpgrade{}, AbortUpgrade),
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
@ -249,6 +255,7 @@ var fsmPlanners = map[SectorState]func(events []statemachine.Event, state *Secto
|
|||||||
on(SectorRetryProveReplicaUpdate{}, ProveReplicaUpdate),
|
on(SectorRetryProveReplicaUpdate{}, ProveReplicaUpdate),
|
||||||
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
on(SectorInvalidDealIDs{}, SnapDealsRecoverDealIDs),
|
||||||
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
on(SectorDealsExpired{}, SnapDealsDealsExpired),
|
||||||
|
on(SectorAbortUpgrade{}, AbortUpgrade),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Post-seal
|
// Post-seal
|
||||||
|
7
extern/storage-sealing/input.go
vendored
7
extern/storage-sealing/input.go
vendored
@ -524,6 +524,13 @@ func (m *Sealing) StartPacking(sid abi.SectorNumber) error {
|
|||||||
return m.sectors.Send(uint64(sid), SectorStartPacking{})
|
return m.sectors.Send(uint64(sid), SectorStartPacking{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Sealing) AbortUpgrade(sid abi.SectorNumber) error {
|
||||||
|
m.startupWait.Wait()
|
||||||
|
|
||||||
|
log.Infow("aborting upgrade of sector", "sector", sid, "trigger", "user")
|
||||||
|
return m.sectors.Send(uint64(sid), SectorAbortUpgrade{})
|
||||||
|
}
|
||||||
|
|
||||||
func proposalCID(deal api.PieceDealInfo) cid.Cid {
|
func proposalCID(deal api.PieceDealInfo) cid.Cid {
|
||||||
pc, err := deal.DealProposal.Cid()
|
pc, err := deal.DealProposal.Cid()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -384,6 +384,10 @@ func (sm *StorageMinerAPI) SectorMarkForUpgrade(ctx context.Context, id abi.Sect
|
|||||||
return sm.Miner.MarkForUpgrade(ctx, id, snap)
|
return sm.Miner.MarkForUpgrade(ctx, id, snap)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sm *StorageMinerAPI) SectorAbortUpgrade(ctx context.Context, number abi.SectorNumber) error {
|
||||||
|
return sm.Miner.SectorAbortUpgrade(number)
|
||||||
|
}
|
||||||
|
|
||||||
func (sm *StorageMinerAPI) SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) {
|
func (sm *StorageMinerAPI) SectorCommitFlush(ctx context.Context) ([]sealiface.CommitBatchRes, error) {
|
||||||
return sm.Miner.CommitFlush(ctx)
|
return sm.Miner.CommitFlush(ctx)
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,10 @@ func (m *Miner) IsMarkedForUpgrade(id abi.SectorNumber) bool {
|
|||||||
return m.sealing.IsMarkedForUpgrade(id)
|
return m.sealing.IsMarkedForUpgrade(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Miner) SectorAbortUpgrade(sectorNum abi.SectorNumber) error {
|
||||||
|
return m.sealing.AbortUpgrade(sectorNum)
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Miner) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPieceSize, r storage.Data, d api.PieceDealInfo) (api.SectorOffset, error) {
|
func (m *Miner) SectorAddPieceToAny(ctx context.Context, size abi.UnpaddedPieceSize, r storage.Data, d api.PieceDealInfo) (api.SectorOffset, error) {
|
||||||
return m.sealing.SectorAddPieceToAny(ctx, size, r, d)
|
return m.sealing.SectorAddPieceToAny(ctx, size, r, d)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user