forked from TrueCloudLab/frostfs-node
27 lines
465 B
Go
27 lines
465 B
Go
|
package engine
|
||
|
|
||
|
import "context"
|
||
|
|
||
|
type rebuildLimiter struct {
|
||
|
semaphore chan struct{}
|
||
|
}
|
||
|
|
||
|
func newRebuildLimiter(workersCount uint32) *rebuildLimiter {
|
||
|
return &rebuildLimiter{
|
||
|
semaphore: make(chan struct{}, workersCount),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (l *rebuildLimiter) AcquireWorkSlot(ctx context.Context) error {
|
||
|
select {
|
||
|
case l.semaphore <- struct{}{}:
|
||
|
return nil
|
||
|
case <-ctx.Done():
|
||
|
return ctx.Err()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (l *rebuildLimiter) ReleaseWorkSlot() {
|
||
|
<-l.semaphore
|
||
|
}
|