rate-limit some sectorbuilder ops
This commit is contained in:
parent
13da5a5966
commit
c76ce2a2eb
@ -77,7 +77,7 @@ var runCmd = &cli.Command{
|
|||||||
}
|
}
|
||||||
return lr.SetAPIEndpoint(apima)
|
return lr.SetAPIEndpoint(apima)
|
||||||
}),
|
}),
|
||||||
node.Override(new(*sectorbuilder.Config), modules.SectorBuilderConfig(storageRepoPath)),
|
node.Override(new(*sectorbuilder.Config), modules.SectorBuilderConfig(storageRepoPath, 5)), // TODO: grab worker count from config
|
||||||
node.Override(new(api.FullNode), nodeApi),
|
node.Override(new(api.FullNode), nodeApi),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -8,12 +8,14 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
sectorbuilder "github.com/filecoin-project/go-sectorbuilder"
|
sectorbuilder "github.com/filecoin-project/go-sectorbuilder"
|
||||||
|
|
||||||
logging "github.com/ipfs/go-log"
|
logging "github.com/ipfs/go-log"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/chain/address"
|
"github.com/filecoin-project/lotus/chain/address"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const PoStReservedWorkers = 1
|
||||||
|
|
||||||
var log = logging.Logger("sectorbuilder")
|
var log = logging.Logger("sectorbuilder")
|
||||||
|
|
||||||
type SectorSealingStatus = sectorbuilder.SectorSealingStatus
|
type SectorSealingStatus = sectorbuilder.SectorSealingStatus
|
||||||
@ -38,6 +40,8 @@ const CommLen = sectorbuilder.CommitmentBytesLen
|
|||||||
|
|
||||||
type SectorBuilder struct {
|
type SectorBuilder struct {
|
||||||
handle unsafe.Pointer
|
handle unsafe.Pointer
|
||||||
|
|
||||||
|
rateLimit chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@ -53,6 +57,10 @@ type Config struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func New(cfg *Config) (*SectorBuilder, error) {
|
func New(cfg *Config) (*SectorBuilder, error) {
|
||||||
|
if cfg.WorkerThreads <= PoStReservedWorkers {
|
||||||
|
return nil, xerrors.Errorf("minimum worker threads is %d, specified %d", PoStReservedWorkers + 1, cfg.WorkerThreads)
|
||||||
|
}
|
||||||
|
|
||||||
proverId := addressToProverID(cfg.Miner)
|
proverId := addressToProverID(cfg.Miner)
|
||||||
|
|
||||||
sbp, err := sectorbuilder.InitSectorBuilder(cfg.SectorSize, 2, 0, cfg.MetadataDir, proverId, cfg.SealedDir, cfg.StagedDir, cfg.CacheDir, 16, cfg.WorkerThreads)
|
sbp, err := sectorbuilder.InitSectorBuilder(cfg.SectorSize, 2, 0, cfg.MetadataDir, proverId, cfg.SealedDir, cfg.StagedDir, cfg.CacheDir, 16, cfg.WorkerThreads)
|
||||||
@ -62,9 +70,21 @@ func New(cfg *Config) (*SectorBuilder, error) {
|
|||||||
|
|
||||||
return &SectorBuilder{
|
return &SectorBuilder{
|
||||||
handle: sbp,
|
handle: sbp,
|
||||||
|
rateLimit: make(chan struct{}, cfg.WorkerThreads - PoStReservedWorkers),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sb *SectorBuilder) rlimit() func() {
|
||||||
|
if cap(sb.rateLimit) == len(sb.rateLimit) {
|
||||||
|
log.Warn("rate-limiting sectorbuilder call")
|
||||||
|
}
|
||||||
|
sb.rateLimit <- struct{}{}
|
||||||
|
|
||||||
|
return func() {
|
||||||
|
<-sb.rateLimit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func addressToProverID(a address.Address) [32]byte {
|
func addressToProverID(a address.Address) [32]byte {
|
||||||
var proverId [32]byte
|
var proverId [32]byte
|
||||||
copy(proverId[:], a.Payload())
|
copy(proverId[:], a.Payload())
|
||||||
@ -81,6 +101,9 @@ func (sb *SectorBuilder) AddPiece(pieceKey string, pieceSize uint64, file io.Rea
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret := sb.rlimit()
|
||||||
|
defer ret()
|
||||||
|
|
||||||
sectorID, err := sectorbuilder.AddPieceFromFile(sb.handle, pieceKey, pieceSize, f)
|
sectorID, err := sectorbuilder.AddPieceFromFile(sb.handle, pieceKey, pieceSize, f)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
@ -91,18 +114,30 @@ func (sb *SectorBuilder) AddPiece(pieceKey string, pieceSize uint64, file io.Rea
|
|||||||
|
|
||||||
// TODO: should *really really* return an io.ReadCloser
|
// TODO: should *really really* return an io.ReadCloser
|
||||||
func (sb *SectorBuilder) ReadPieceFromSealedSector(pieceKey string) ([]byte, error) {
|
func (sb *SectorBuilder) ReadPieceFromSealedSector(pieceKey string) ([]byte, error) {
|
||||||
|
ret := sb.rlimit()
|
||||||
|
defer ret()
|
||||||
|
|
||||||
return sectorbuilder.ReadPieceFromSealedSector(sb.handle, pieceKey)
|
return sectorbuilder.ReadPieceFromSealedSector(sb.handle, pieceKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *SectorBuilder) SealPreCommit(sectorID uint64, ticket SealTicket) (SealPreCommitOutput, error) {
|
func (sb *SectorBuilder) SealPreCommit(sectorID uint64, ticket SealTicket) (SealPreCommitOutput, error) {
|
||||||
|
ret := sb.rlimit()
|
||||||
|
defer ret()
|
||||||
|
|
||||||
return sectorbuilder.SealPreCommit(sb.handle, sectorID, ticket)
|
return sectorbuilder.SealPreCommit(sb.handle, sectorID, ticket)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *SectorBuilder) SealCommit(sectorID uint64, seed SealSeed) (SealCommitOutput, error) {
|
func (sb *SectorBuilder) SealCommit(sectorID uint64, seed SealSeed) (SealCommitOutput, error) {
|
||||||
|
ret := sb.rlimit()
|
||||||
|
defer ret()
|
||||||
|
|
||||||
return sectorbuilder.SealCommit(sb.handle, sectorID, seed)
|
return sectorbuilder.SealCommit(sb.handle, sectorID, seed)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sb *SectorBuilder) ResumeSealCommit(sectorID uint64) (SealCommitOutput, error) {
|
func (sb *SectorBuilder) ResumeSealCommit(sectorID uint64) (SealCommitOutput, error) {
|
||||||
|
ret := sb.rlimit()
|
||||||
|
defer ret()
|
||||||
|
|
||||||
return sectorbuilder.ResumeSealCommit(sb.handle, sectorID)
|
return sectorbuilder.ResumeSealCommit(sb.handle, sectorID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ func testStorageNode(ctx context.Context, t *testing.T, waddr address.Address, a
|
|||||||
node.Repo(r),
|
node.Repo(r),
|
||||||
node.Test(),
|
node.Test(),
|
||||||
|
|
||||||
node.Override(new(*sectorbuilder.Config), modules.SectorBuilderConfig(secbpath)),
|
node.Override(new(*sectorbuilder.Config), modules.SectorBuilderConfig(secbpath, 2)),
|
||||||
node.Override(new(api.FullNode), tnd),
|
node.Override(new(api.FullNode), tnd),
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
Loading…
Reference in New Issue
Block a user