lotus-miner sectors expired --remove-expired

This commit is contained in:
Łukasz Magiera 2021-08-19 17:05:34 +02:00 committed by Steven Allen
parent d1759a4335
commit ccf8844689
2 changed files with 90 additions and 13 deletions

View File

@ -1519,12 +1519,25 @@ var sectorsUpdateCmd = &cli.Command{
var sectorsExpiredCmd = &cli.Command{ var sectorsExpiredCmd = &cli.Command{
Name: "expired", Name: "expired",
Usage: "Get or cleanup expired sectors", Usage: "Get or cleanup expired sectors",
ArgsUsage: "<sectorNum>",
Flags: []cli.Flag{ Flags: []cli.Flag{
&cli.BoolFlag{ &cli.BoolFlag{
Name: "show-removed", Name: "show-removed",
Usage: "show removed sectors", Usage: "show removed sectors",
}, },
&cli.BoolFlag{
Name: "remove-expired",
Usage: "remove expired sectors",
},
&cli.Int64Flag{
Name: "confirm-remove-count",
Hidden: true,
},
&cli.Int64Flag{
Name: "expired-epoch",
Usage: "epoch at which to check sector expirations",
DefaultText: "WinningPoSt lookback epoch",
},
}, },
Action: func(cctx *cli.Context) error { Action: func(cctx *cli.Context) error {
nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
@ -1563,15 +1576,22 @@ var sectorsExpiredCmd = &cli.Command{
return xerrors.Errorf("getting chain head: %w", err) return xerrors.Errorf("getting chain head: %w", err)
} }
lbEpoch := abi.ChainEpoch(cctx.Int64("expired-epoch"))
if !cctx.IsSet("expired-epoch") {
nv, err := fullApi.StateNetworkVersion(ctx, head.Key()) nv, err := fullApi.StateNetworkVersion(ctx, head.Key())
if err != nil { if err != nil {
return xerrors.Errorf("getting network version: %w", err) return xerrors.Errorf("getting network version: %w", err)
} }
lbEpoch := head.Height() - policy.GetWinningPoStSectorSetLookback(nv) lbEpoch = head.Height() - policy.GetWinningPoStSectorSetLookback(nv)
if lbEpoch < 0 { if lbEpoch < 0 {
return xerrors.Errorf("too early to terminate sectors") return xerrors.Errorf("too early to terminate sectors")
} }
}
if cctx.IsSet("confirm-remove-count") && !cctx.IsSet("expired-epoch") {
return xerrors.Errorf("--expired-epoch must be specified with --confirm-remove-count")
}
lbts, err := fullApi.ChainGetTipSetByHeight(ctx, lbEpoch, head.Key()) lbts, err := fullApi.ChainGetTipSetByHeight(ctx, lbEpoch, head.Key())
if err != nil { if err != nil {
@ -1611,9 +1631,15 @@ var sectorsExpiredCmd = &cli.Command{
return err return err
} }
if cctx.Bool("remove-expired") {
color.Red("Removing sectors:\n")
}
// toCheck now only contains sectors which either failed to precommit or are expired/terminated // toCheck now only contains sectors which either failed to precommit or are expired/terminated
fmt.Printf("Sector\tState\tExpiration\n") fmt.Printf("Sector\tState\tExpiration\n")
var toRemove []abi.SectorNumber
err = toCheck.ForEach(func(u uint64) error { err = toCheck.ForEach(func(u uint64) error {
s := abi.SectorNumber(u) s := abi.SectorNumber(u)
@ -1623,11 +1649,17 @@ var sectorsExpiredCmd = &cli.Command{
return nil return nil
} }
if !cctx.Bool("show-removed") && st.State == api.SectorState(sealing.Removed) { rmMsg := ""
if st.State == api.SectorState(sealing.Removed) {
if cctx.IsSet("confirm-remove-count") || !cctx.Bool("show-removed") {
return nil return nil
} }
} else { // not removed
toRemove = append(toRemove, s)
}
fmt.Printf("%d:\t%s\t%s\n", s, st.State, lcli.EpochTime(head.Height(), st.Expiration)) fmt.Printf("%d%s\t%s\t%s\n", s, rmMsg, st.State, lcli.EpochTime(head.Height(), st.Expiration))
return nil return nil
}) })
@ -1635,6 +1667,34 @@ var sectorsExpiredCmd = &cli.Command{
return err return err
} }
if cctx.Bool("remove-expired") {
if !cctx.IsSet("confirm-remove-count") {
fmt.Println()
fmt.Println(color.YellowString("All"), color.GreenString("%d", len(toRemove)), color.YellowString("sectors listed above will be removed\n"))
fmt.Println(color.YellowString("To confirm removal of the above sectors, including\n all related sealed and unsealed data, run:\n"))
fmt.Println(color.RedString("lotus-miner sectors expired --remove-expired --confirm-remove-count=%d --expired-epoch=%d\n", len(toRemove), lbts.Height()))
fmt.Println(color.YellowString("WARNING: This operation is irreversible"))
return nil
}
fmt.Println()
if int64(len(toRemove)) != cctx.Int64("confirm-remove-count") {
return xerrors.Errorf("value of confirm-remove-count doesn't match the number of sectors which can be removed (%d)", len(toRemove))
}
for _, number := range toRemove {
fmt.Printf("Removing sector\t%s:\t", color.YellowString("%d", number))
err := nodeApi.SectorRemove(ctx, number)
if err != nil {
color.Red("ERROR: %s\n", err.Error())
} else {
color.Green("OK\n")
}
}
}
return nil return nil
}, },
} }

View File

@ -1472,6 +1472,7 @@ COMMANDS:
update-state ADVANCED: manually update the state of a sector, this may aid in error recovery update-state ADVANCED: manually update the state of a sector, this may aid in error recovery
pledge store random data in a sector pledge store random data in a sector
check-expire Inspect expiring sectors check-expire Inspect expiring sectors
expired Get or cleanup expired sectors
renew Renew expiring sectors while not exceeding each sector's max life renew Renew expiring sectors while not exceeding each sector's max life
extend Extend sector expiration extend Extend sector expiration
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)
@ -1577,6 +1578,22 @@ OPTIONS:
``` ```
### lotus-miner sectors expired
```
NAME:
lotus-miner sectors expired - Get or cleanup expired sectors
USAGE:
lotus-miner sectors expired [command options] [arguments...]
OPTIONS:
--show-removed show removed sectors (default: false)
--remove-expired remove expired sectors (default: false)
--expired-epoch value epoch at which to check sector expirations (default: WinningPoSt lookback epoch)
--help, -h show help (default: false)
```
### lotus-miner sectors renew ### lotus-miner sectors renew
``` ```
NAME: NAME: