sealing: Error types that can actually be checked
This commit is contained in:
parent
74095b25c5
commit
82343460dd
32
checks.go
32
checks.go
@ -14,36 +14,36 @@ import (
|
|||||||
|
|
||||||
// TODO: For now we handle this by halting state execution, when we get jsonrpc reconnecting
|
// TODO: For now we handle this by halting state execution, when we get jsonrpc reconnecting
|
||||||
// We should implement some wait-for-api logic
|
// We should implement some wait-for-api logic
|
||||||
type ErrApi error
|
type ErrApi struct{error}
|
||||||
|
|
||||||
type ErrInvalidDeals error
|
type ErrInvalidDeals struct{error}
|
||||||
type ErrExpiredDeals error
|
type ErrExpiredDeals struct{error}
|
||||||
|
|
||||||
type ErrBadCommD error
|
type ErrBadCommD struct{error}
|
||||||
type ErrExpiredTicket error
|
type ErrExpiredTicket struct{error}
|
||||||
|
|
||||||
func checkPieces(ctx context.Context, si SectorInfo, api sealingApi) error {
|
func checkPieces(ctx context.Context, si SectorInfo, api sealingApi) error {
|
||||||
head, err := api.ChainHead(ctx)
|
head, err := api.ChainHead(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrApi(xerrors.Errorf("getting chain head: %w", err))
|
return &ErrApi{xerrors.Errorf("getting chain head: %w", err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, piece := range si.Pieces {
|
for i, piece := range si.Pieces {
|
||||||
deal, err := api.StateMarketStorageDeal(ctx, piece.DealID, nil)
|
deal, err := api.StateMarketStorageDeal(ctx, piece.DealID, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrApi(xerrors.Errorf("getting deal %d for piece %d: %w", piece.DealID, i, err))
|
return &ErrApi{xerrors.Errorf("getting deal %d for piece %d: %w", piece.DealID, i, err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
if string(deal.PieceRef) != string(piece.CommP) {
|
if string(deal.PieceRef) != string(piece.CommP) {
|
||||||
return ErrInvalidDeals(xerrors.Errorf("piece %d of sector %d refers deal %d with wrong CommP: %x != %x", i, si.SectorID, piece.DealID, piece.CommP, deal.PieceRef))
|
return &ErrInvalidDeals{xerrors.Errorf("piece %d (or %d) of sector %d refers deal %d with wrong CommP: %x != %x", i, len(si.Pieces), si.SectorID, piece.DealID, piece.CommP, deal.PieceRef)}
|
||||||
}
|
}
|
||||||
|
|
||||||
if piece.Size != deal.PieceSize {
|
if piece.Size != deal.PieceSize {
|
||||||
return ErrInvalidDeals(xerrors.Errorf("piece %d of sector %d refers deal %d with different size: %d != %d", i, si.SectorID, piece.DealID, piece.Size, deal.PieceSize))
|
return &ErrInvalidDeals{xerrors.Errorf("piece %d (or %d) of sector %d refers deal %d with different size: %d != %d", i, len(si.Pieces), si.SectorID, piece.DealID, piece.Size, deal.PieceSize)}
|
||||||
}
|
}
|
||||||
|
|
||||||
if head.Height() >= deal.ProposalExpiration {
|
if head.Height() >= deal.ProposalExpiration {
|
||||||
return ErrExpiredDeals(xerrors.Errorf("piece %d of sector %d refers expired deal %d - expires %d, head %d", i, si.SectorID, piece.DealID, deal.ProposalExpiration, head.Height()))
|
return &ErrExpiredDeals{xerrors.Errorf("piece %d (or %d) of sector %d refers expired deal %d - expires %d, head %d", i, len(si.Pieces), si.SectorID, piece.DealID, deal.ProposalExpiration, head.Height())}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,12 +53,12 @@ func checkPieces(ctx context.Context, si SectorInfo, api sealingApi) error {
|
|||||||
func checkSeal(ctx context.Context, maddr address.Address, si SectorInfo, api sealingApi) (err error) {
|
func checkSeal(ctx context.Context, maddr address.Address, si SectorInfo, api sealingApi) (err error) {
|
||||||
head, err := api.ChainHead(ctx)
|
head, err := api.ChainHead(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrApi(xerrors.Errorf("getting chain head: %w", err))
|
return &ErrApi{xerrors.Errorf("getting chain head: %w", err)}
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize, err := api.StateMinerSectorSize(ctx, maddr, head)
|
ssize, err := api.StateMinerSectorSize(ctx, maddr, head)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrApi(err)
|
return &ErrApi{err}
|
||||||
}
|
}
|
||||||
|
|
||||||
ccparams, err := actors.SerializeParams(&actors.ComputeDataCommitmentParams{
|
ccparams, err := actors.SerializeParams(&actors.ComputeDataCommitmentParams{
|
||||||
@ -80,17 +80,17 @@ func checkSeal(ctx context.Context, maddr address.Address, si SectorInfo, api se
|
|||||||
}
|
}
|
||||||
r, err := api.StateCall(ctx, ccmt, nil)
|
r, err := api.StateCall(ctx, ccmt, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrApi(xerrors.Errorf("calling ComputeDataCommitment: %w", err))
|
return &ErrApi{xerrors.Errorf("calling ComputeDataCommitment: %w", err)}
|
||||||
}
|
}
|
||||||
if r.ExitCode != 0 {
|
if r.ExitCode != 0 {
|
||||||
return ErrBadCommD(xerrors.Errorf("receipt for ComputeDataCommitment had exit code %d", r.ExitCode))
|
return &ErrBadCommD{xerrors.Errorf("receipt for ComputeDataCommitment had exit code %d", r.ExitCode)}
|
||||||
}
|
}
|
||||||
if string(r.Return) != string(si.CommD) {
|
if string(r.Return) != string(si.CommD) {
|
||||||
return ErrBadCommD(xerrors.Errorf("on chain CommD differs from sector: %x != %x", r.Return, si.CommD))
|
return &ErrBadCommD{xerrors.Errorf("on chain CommD differs from sector: %x != %x", r.Return, si.CommD)}
|
||||||
}
|
}
|
||||||
|
|
||||||
if int64(head.Height())-int64(si.Ticket.BlockHeight+build.SealRandomnessLookback) > build.SealRandomnessLookbackLimit {
|
if int64(head.Height())-int64(si.Ticket.BlockHeight+build.SealRandomnessLookback) > build.SealRandomnessLookbackLimit {
|
||||||
return ErrExpiredTicket(xerrors.Errorf("ticket expired: seal height: %d, head: %d", si.Ticket.BlockHeight+build.SealRandomnessLookback, head.Height()))
|
return &ErrExpiredTicket{xerrors.Errorf("ticket expired: seal height: %d, head: %d", si.Ticket.BlockHeight+build.SealRandomnessLookback, head.Height())}
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -13,7 +13,7 @@ const minRetryTime = 1 * time.Minute
|
|||||||
func failedCooldown(ctx statemachine.Context, sector SectorInfo) error {
|
func failedCooldown(ctx statemachine.Context, sector SectorInfo) error {
|
||||||
retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(minRetryTime)
|
retryStart := time.Unix(int64(sector.Log[len(sector.Log)-1].Timestamp), 0).Add(minRetryTime)
|
||||||
if len(sector.Log) > 0 && !time.Now().After(retryStart) {
|
if len(sector.Log) > 0 && !time.Now().After(retryStart) {
|
||||||
log.Infof("%s(%d), waiting %s before retrying", api.SectorStates[sector.State], time.Until(retryStart))
|
log.Infof("%s(%d), waiting %s before retrying", api.SectorStates[sector.State], sector.SectorID, time.Until(retryStart))
|
||||||
select {
|
select {
|
||||||
case <-time.After(time.Until(retryStart)):
|
case <-time.After(time.Until(retryStart)):
|
||||||
case <-ctx.Context().Done():
|
case <-ctx.Context().Done():
|
||||||
|
Loading…
Reference in New Issue
Block a user