load proof types in window post logic
This is going to be inefficient, but it should be fine in practice.
This commit is contained in:
parent
219c695967
commit
05db5ce426
@ -6,6 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
|
"github.com/filecoin-project/specs-storage/storage"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
@ -188,24 +189,30 @@ func (s *WindowPoStScheduler) runSubmitPoST(
|
|||||||
return submitErr
|
return submitErr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WindowPoStScheduler) checkSectors(ctx context.Context, check bitfield.BitField) (bitfield.BitField, error) {
|
func (s *WindowPoStScheduler) checkSectors(ctx context.Context, check bitfield.BitField, tsk types.TipSetKey) (bitfield.BitField, error) {
|
||||||
mid, err := address.IDFromAddress(s.actor)
|
mid, err := address.IDFromAddress(s.actor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return bitfield.BitField{}, err
|
return bitfield.BitField{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sectors := make(map[abi.SectorID]struct{})
|
sectorInfos, err := s.api.StateMinerSectors(ctx, s.actor, &check, tsk)
|
||||||
var tocheck []abi.SectorID
|
if err != nil {
|
||||||
err = check.ForEach(func(snum uint64) error {
|
return bitfield.BitField{}, err
|
||||||
s := abi.SectorID{
|
|
||||||
Miner: abi.ActorID(mid),
|
|
||||||
Number: abi.SectorNumber(snum),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tocheck = append(tocheck, s)
|
sectors := make(map[abi.SectorNumber]struct{})
|
||||||
sectors[s] = struct{}{}
|
var tocheck []storage.SectorRef
|
||||||
return nil
|
for _, info := range sectorInfos {
|
||||||
|
sectors[info.SectorNumber] = struct{}{}
|
||||||
|
tocheck = append(tocheck, storage.SectorRef{
|
||||||
|
ProofType: info.SealProof,
|
||||||
|
ID: abi.SectorID{
|
||||||
|
Miner: abi.ActorID(mid),
|
||||||
|
Number: info.SectorNumber,
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return bitfield.BitField{}, xerrors.Errorf("iterating over bitfield: %w", err)
|
return bitfield.BitField{}, xerrors.Errorf("iterating over bitfield: %w", err)
|
||||||
}
|
}
|
||||||
@ -215,20 +222,20 @@ func (s *WindowPoStScheduler) checkSectors(ctx context.Context, check bitfield.B
|
|||||||
return bitfield.BitField{}, xerrors.Errorf("checking provable sectors: %w", err)
|
return bitfield.BitField{}, xerrors.Errorf("checking provable sectors: %w", err)
|
||||||
}
|
}
|
||||||
for _, id := range bad {
|
for _, id := range bad {
|
||||||
delete(sectors, id)
|
delete(sectors, id.Number)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Warnw("Checked sectors", "checked", len(tocheck), "good", len(sectors))
|
log.Warnw("Checked sectors", "checked", len(tocheck), "good", len(sectors))
|
||||||
|
|
||||||
sbf := bitfield.New()
|
sbf := bitfield.New()
|
||||||
for s := range sectors {
|
for s := range sectors {
|
||||||
sbf.Set(uint64(s.Number))
|
sbf.Set(uint64(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
return sbf, nil
|
return sbf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WindowPoStScheduler) checkNextRecoveries(ctx context.Context, dlIdx uint64, partitions []api.Partition) ([]miner.RecoveryDeclaration, *types.SignedMessage, error) {
|
func (s *WindowPoStScheduler) checkNextRecoveries(ctx context.Context, dlIdx uint64, partitions []api.Partition, tsk types.TipSetKey) ([]miner.RecoveryDeclaration, *types.SignedMessage, error) {
|
||||||
ctx, span := trace.StartSpan(ctx, "storage.checkNextRecoveries")
|
ctx, span := trace.StartSpan(ctx, "storage.checkNextRecoveries")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
@ -254,7 +261,7 @@ func (s *WindowPoStScheduler) checkNextRecoveries(ctx context.Context, dlIdx uin
|
|||||||
|
|
||||||
faulty += uc
|
faulty += uc
|
||||||
|
|
||||||
recovered, err := s.checkSectors(ctx, unrecovered)
|
recovered, err := s.checkSectors(ctx, unrecovered, tsk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, xerrors.Errorf("checking unrecovered sectors: %w", err)
|
return nil, nil, xerrors.Errorf("checking unrecovered sectors: %w", err)
|
||||||
}
|
}
|
||||||
@ -320,7 +327,7 @@ func (s *WindowPoStScheduler) checkNextRecoveries(ctx context.Context, dlIdx uin
|
|||||||
return recoveries, sm, nil
|
return recoveries, sm, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *WindowPoStScheduler) checkNextFaults(ctx context.Context, dlIdx uint64, partitions []api.Partition) ([]miner.FaultDeclaration, *types.SignedMessage, error) {
|
func (s *WindowPoStScheduler) checkNextFaults(ctx context.Context, dlIdx uint64, partitions []api.Partition, tsk types.TipSetKey) ([]miner.FaultDeclaration, *types.SignedMessage, error) {
|
||||||
ctx, span := trace.StartSpan(ctx, "storage.checkNextFaults")
|
ctx, span := trace.StartSpan(ctx, "storage.checkNextFaults")
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
@ -335,7 +342,7 @@ func (s *WindowPoStScheduler) checkNextFaults(ctx context.Context, dlIdx uint64,
|
|||||||
return nil, nil, xerrors.Errorf("determining non faulty sectors: %w", err)
|
return nil, nil, xerrors.Errorf("determining non faulty sectors: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
good, err := s.checkSectors(ctx, nonFaulty)
|
good, err := s.checkSectors(ctx, nonFaulty, tsk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, xerrors.Errorf("checking sectors: %w", err)
|
return nil, nil, xerrors.Errorf("checking sectors: %w", err)
|
||||||
}
|
}
|
||||||
@ -438,7 +445,7 @@ func (s *WindowPoStScheduler) runPost(ctx context.Context, di dline.Info, ts *ty
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
if recoveries, sigmsg, err = s.checkNextRecoveries(context.TODO(), declDeadline, partitions); err != nil {
|
if recoveries, sigmsg, err = s.checkNextRecoveries(context.TODO(), declDeadline, partitions, ts.Key()); err != nil {
|
||||||
// TODO: This is potentially quite bad, but not even trying to post when this fails is objectively worse
|
// TODO: This is potentially quite bad, but not even trying to post when this fails is objectively worse
|
||||||
log.Errorf("checking sector recoveries: %v", err)
|
log.Errorf("checking sector recoveries: %v", err)
|
||||||
}
|
}
|
||||||
@ -457,7 +464,7 @@ func (s *WindowPoStScheduler) runPost(ctx context.Context, di dline.Info, ts *ty
|
|||||||
return // FORK: declaring faults after ignition upgrade makes no sense
|
return // FORK: declaring faults after ignition upgrade makes no sense
|
||||||
}
|
}
|
||||||
|
|
||||||
if faults, sigmsg, err = s.checkNextFaults(context.TODO(), declDeadline, partitions); err != nil {
|
if faults, sigmsg, err = s.checkNextFaults(context.TODO(), declDeadline, partitions, ts.Key()); err != nil {
|
||||||
// TODO: This is also potentially really bad, but we try to post anyways
|
// TODO: This is also potentially really bad, but we try to post anyways
|
||||||
log.Errorf("checking sector faults: %v", err)
|
log.Errorf("checking sector faults: %v", err)
|
||||||
}
|
}
|
||||||
@ -527,7 +534,7 @@ func (s *WindowPoStScheduler) runPost(ctx context.Context, di dline.Info, ts *ty
|
|||||||
return nil, xerrors.Errorf("adding recoveries to set of sectors to prove: %w", err)
|
return nil, xerrors.Errorf("adding recoveries to set of sectors to prove: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
good, err := s.checkSectors(ctx, toProve)
|
good, err := s.checkSectors(ctx, toProve, ts.Key())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("checking sectors to skip: %w", err)
|
return nil, xerrors.Errorf("checking sectors to skip: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/filecoin-project/go-address"
|
"github.com/filecoin-project/go-address"
|
||||||
"github.com/filecoin-project/go-bitfield"
|
"github.com/filecoin-project/go-bitfield"
|
||||||
|
"github.com/filecoin-project/specs-storage/storage"
|
||||||
|
|
||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
"github.com/filecoin-project/go-state-types/big"
|
"github.com/filecoin-project/go-state-types/big"
|
||||||
@ -116,7 +117,7 @@ func (m *mockProver) GenerateWindowPoSt(ctx context.Context, aid abi.ActorID, si
|
|||||||
type mockFaultTracker struct {
|
type mockFaultTracker struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m mockFaultTracker) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []abi.SectorID) ([]abi.SectorID, error) {
|
func (m mockFaultTracker) CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef) ([]abi.SectorID, error) {
|
||||||
// Returns "bad" sectors so just return nil meaning all sectors are good
|
// Returns "bad" sectors so just return nil meaning all sectors are good
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user