verifier: Handle sector unlocking correctly

This commit is contained in:
Łukasz Magiera 2020-06-08 19:57:28 +02:00
parent 8e489cdbdb
commit 375a6b4d38

View File

@ -16,10 +16,11 @@ import (
func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []abi.SectorInfo, randomness abi.PoStRandomness) ([]abi.PoStProof, error) { func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []abi.SectorInfo, randomness abi.PoStRandomness) ([]abi.PoStProof, error) {
randomness[31] = 0 // TODO: Not correct, fixme randomness[31] = 0 // TODO: Not correct, fixme
privsectors, skipped, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredProof.RegisteredWinningPoStProof) // TODO: FAULTS? privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredProof.RegisteredWinningPoStProof) // TODO: FAULTS?
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer done()
if len(skipped) > 0 { if len(skipped) > 0 {
return nil, xerrors.Errorf("pubSectorToPriv skipped sectors: %+v", skipped) return nil, xerrors.Errorf("pubSectorToPriv skipped sectors: %+v", skipped)
} }
@ -29,21 +30,29 @@ func (sb *Sealer) GenerateWinningPoSt(ctx context.Context, minerID abi.ActorID,
func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []abi.SectorInfo, randomness abi.PoStRandomness) ([]abi.PoStProof, []abi.SectorID, error) { func (sb *Sealer) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, sectorInfo []abi.SectorInfo, randomness abi.PoStRandomness) ([]abi.PoStProof, []abi.SectorID, error) {
randomness[31] = 0 // TODO: Not correct, fixme randomness[31] = 0 // TODO: Not correct, fixme
privsectors, skipped, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredProof.RegisteredWindowPoStProof) privsectors, skipped, done, err := sb.pubSectorToPriv(ctx, minerID, sectorInfo, nil, abi.RegisteredProof.RegisteredWindowPoStProof)
if err != nil { if err != nil {
return nil, nil, xerrors.Errorf("gathering sector info: %w", err) return nil, nil, xerrors.Errorf("gathering sector info: %w", err)
} }
defer done()
proof, err := ffi.GenerateWindowPoSt(minerID, privsectors, randomness) proof, err := ffi.GenerateWindowPoSt(minerID, privsectors, randomness)
return proof, skipped, err return proof, skipped, err
} }
func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []abi.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredProof) (abi.RegisteredProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, error) { func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorInfo []abi.SectorInfo, faults []abi.SectorNumber, rpt func(abi.RegisteredProof) (abi.RegisteredProof, error)) (ffi.SortedPrivateSectorInfo, []abi.SectorID, func(), error) {
fmap := map[abi.SectorNumber]struct{}{} fmap := map[abi.SectorNumber]struct{}{}
for _, fault := range faults { for _, fault := range faults {
fmap[fault] = struct{}{} fmap[fault] = struct{}{}
} }
var doneFuncs []func()
done := func() {
for _, df := range doneFuncs {
df()
}
}
var skipped []abi.SectorID var skipped []abi.SectorID
var out []ffi.PrivateSectorInfo var out []ffi.PrivateSectorInfo
for _, s := range sectorInfo { for _, s := range sectorInfo {
@ -53,17 +62,18 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn
sid := abi.SectorID{Miner: mid, Number: s.SectorNumber} sid := abi.SectorID{Miner: mid, Number: s.SectorNumber}
paths, done, err := sb.sectors.AcquireSector(ctx, sid, stores.FTCache|stores.FTSealed, 0, false) paths, d, err := sb.sectors.AcquireSector(ctx, sid, stores.FTCache|stores.FTSealed, 0, false)
if err != nil { if err != nil {
log.Warnw("failed to acquire sector, skipping", "sector", sid, "error", err) log.Warnw("failed to acquire sector, skipping", "sector", sid, "error", err)
skipped = append(skipped, sid) skipped = append(skipped, sid)
continue continue
} }
done() // TODO: This is a tiny bit suboptimal doneFuncs = append(doneFuncs, d)
postProofType, err := rpt(s.RegisteredProof) postProofType, err := rpt(s.RegisteredProof)
if err != nil { if err != nil {
return ffi.SortedPrivateSectorInfo{}, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err) done()
return ffi.SortedPrivateSectorInfo{}, nil, nil, xerrors.Errorf("acquiring registered PoSt proof from sector info %+v: %w", s, err)
} }
out = append(out, ffi.PrivateSectorInfo{ out = append(out, ffi.PrivateSectorInfo{
@ -74,7 +84,7 @@ func (sb *Sealer) pubSectorToPriv(ctx context.Context, mid abi.ActorID, sectorIn
}) })
} }
return ffi.NewSortedPrivateSectorInfo(out...), skipped, nil return ffi.NewSortedPrivateSectorInfo(out...), skipped, done, nil
} }
var _ Verifier = ProofVerifier var _ Verifier = ProofVerifier