fix(lotus-sim): skip (and log) missing/expired pre-commits

This commit is contained in:
Steven Allen 2021-06-07 19:21:18 -07:00
parent 0ccf716989
commit 2e4f526375

View File

@ -120,7 +120,6 @@ func (ss *simulationState) packProveCommitsMiner(
batchSize = len(snos) batchSize = len(snos)
} }
batch := snos[:batchSize] batch := snos[:batchSize]
snos = snos[batchSize:]
proof, err := mockAggregateSealProof(sealType, minerAddr, batchSize) proof, err := mockAggregateSealProof(sealType, minerAddr, batchSize)
if err != nil { if err != nil {
@ -149,22 +148,53 @@ func (ss *simulationState) packProveCommitsMiner(
}); err != nil { }); err != nil {
// If we get a random error, or a fatal actor error, bail. // If we get a random error, or a fatal actor error, bail.
// Otherwise, just log it. // Otherwise, just log it.
if aerr, ok := err.(aerrors.ActorError); !ok || aerr.IsFatal() { aerr, ok := err.(aerrors.ActorError)
if !ok || aerr.IsFatal() {
return res, false, err return res, false, err
} }
if aerr.RetCode() == exitcode.ErrNotFound {
good, expired, err := ss.filterProveCommits(ctx, minerAddr, batch)
if err != nil {
log.Errorw("failed to filter prove commits", "miner", minerAddr, "error", err)
// fail with the original error.
return res, false, aerr
}
// If we've removed sectors (and kept some), try again.
// If we've removed all sectors, or no sectors, just
// move on and deliver the error.
if len(good) > 0 && len(expired) > 0 {
res.failed += len(expired)
// update the pending sector numbers in-place to remove the expired ones.
snos = snos[len(expired):]
copy(snos, good)
pending.finish(sealType, len(expired))
log.Errorw("failed to prove commit expired/missing pre-commits",
"error", err,
"miner", minerAddr,
"expired", expired,
"discarded", len(expired),
"kept", len(good),
"epoch", ss.nextEpoch(),
)
continue
}
}
log.Errorw("failed to prove commit sector(s)", log.Errorw("failed to prove commit sector(s)",
"error", err, "error", err,
"miner", minerAddr, "miner", minerAddr,
"sectors", batch, "sectors", batch,
"epoch", ss.nextEpoch(), "epoch", ss.nextEpoch(),
) )
res.failed += batchSize res.failed += len(batch)
} else if full { } else if full {
return res, true, nil return res, true, nil
} else { } else {
res.done += batchSize res.done += len(batch)
} }
pending.finish(sealType, batchSize) pending.finish(sealType, batchSize)
snos = snos[batchSize:]
} }
} }
for len(snos) > 0 && res.unbatched < power5.MaxMinerProveCommitsPerEpoch { for len(snos) > 0 && res.unbatched < power5.MaxMinerProveCommitsPerEpoch {
@ -225,12 +255,56 @@ func (ss *simulationState) loadProveCommitsMiner(ctx context.Context, addr addre
nv := ss.sm.GetNtwkVersion(ctx, nextEpoch) nv := ss.sm.GetNtwkVersion(ctx, nextEpoch)
av := actors.VersionForNetwork(nv) av := actors.VersionForNetwork(nv)
return minerState.ForEachPrecommittedSector(func(info miner.SectorPreCommitOnChainInfo) error { var total, dropped int
err := minerState.ForEachPrecommittedSector(func(info miner.SectorPreCommitOnChainInfo) error {
total++
msd := policy.GetMaxProveCommitDuration(av, info.Info.SealProof) msd := policy.GetMaxProveCommitDuration(av, info.Info.SealProof)
if nextEpoch > info.PreCommitEpoch+msd { if nextEpoch > info.PreCommitEpoch+msd {
log.Warnw("dropping old pre-commit") dropped++
return nil return nil
} }
return ss.commitQueue.enqueueProveCommit(addr, info.PreCommitEpoch, info.Info) return ss.commitQueue.enqueueProveCommit(addr, info.PreCommitEpoch, info.Info)
}) })
if err != nil {
return err
}
if dropped > 0 {
log.Warnw("dropped expired pre-commits on load",
"miner", addr,
"total", total,
"expired", dropped,
)
}
return nil
}
// filterProveCommits filters out expired prove-commits.
func (ss *simulationState) filterProveCommits(ctx context.Context, minerAddr address.Address, snos []abi.SectorNumber) (good, expired []abi.SectorNumber, err error) {
_, minerState, err := ss.getMinerState(ctx, minerAddr)
if err != nil {
return nil, nil, err
}
nextEpoch := ss.nextEpoch()
nv := ss.sm.GetNtwkVersion(ctx, nextEpoch)
av := actors.VersionForNetwork(nv)
good = make([]abi.SectorNumber, 0, len(snos))
for _, sno := range snos {
info, err := minerState.GetPrecommittedSector(sno)
if err != nil {
return nil, nil, err
}
if info == nil {
expired = append(expired, sno)
continue
}
msd := policy.GetMaxProveCommitDuration(av, info.Info.SealProof)
if nextEpoch > info.PreCommitEpoch+msd {
expired = append(expired, sno)
continue
}
good = append(good, sno)
}
return good, expired, nil
} }