github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/rateio/api.go (about)

     1  package rateio
     2  
     3  import (
     4  	"io"
     5  	"time"
     6  
     7  	"github.com/Cloud-Foundations/tricorder/go/tricorder"
     8  	"github.com/Cloud-Foundations/tricorder/go/tricorder/units"
     9  )
    10  
    11  type ReadIOMeasurer interface {
    12  	MeasureReadIO(bytesSinceLastMeasurement uint64) (uint64, error)
    13  	Reset()
    14  }
    15  
    16  type ReadMeasurer struct{}
    17  
    18  func (measurer *ReadMeasurer) MeasureReadIO(bytesSinceLastMeasurement uint64) (
    19  	uint64, error) {
    20  	return bytesSinceLastMeasurement, nil
    21  }
    22  
    23  func (measurer *ReadMeasurer) Reset() {}
    24  
    25  type ReaderContext struct {
    26  	maxIOPerSecond        uint64
    27  	speedPercent          uint64
    28  	measurer              ReadIOMeasurer
    29  	bytesSinceLastPause   uint64
    30  	chunklen              uint64
    31  	timeOfLastPause       time.Time
    32  	sleepTimeDistribution *tricorder.CumulativeDistribution
    33  }
    34  
    35  func NewReaderContext(maxIOPerSecond uint64, speedPercent uint64,
    36  	measurer ReadIOMeasurer) *ReaderContext {
    37  	return newReaderContext(maxIOPerSecond, speedPercent, measurer)
    38  }
    39  
    40  func (ctx *ReaderContext) InitialiseMaximumSpeed(maxSpeed uint64) {
    41  	ctx.initialiseMaximumSpeed(maxSpeed)
    42  }
    43  
    44  func (ctx *ReaderContext) MaximumSpeed() uint64 { return ctx.maxIOPerSecond }
    45  
    46  func (ctx *ReaderContext) SpeedPercent() uint { return uint(ctx.speedPercent) }
    47  
    48  func (ctx *ReaderContext) SetSpeedPercent(percent uint) {
    49  	ctx.setSpeedPercent(percent)
    50  }
    51  
    52  func (ctx *ReaderContext) NewReader(rd io.Reader) *Reader {
    53  	return ctx.newReader(rd)
    54  }
    55  
    56  func (ctx *ReaderContext) RegisterMetrics(dir *tricorder.DirectorySpec,
    57  	unit units.Unit, description string) error {
    58  	return ctx.registerMetrics(dir, unit, description)
    59  }
    60  
    61  func (ctx *ReaderContext) String() string {
    62  	return ctx.format()
    63  }
    64  
    65  type Reader struct {
    66  	ctx *ReaderContext
    67  	rd  io.Reader
    68  }
    69  
    70  func (rd *Reader) Read(b []byte) (n int, err error) {
    71  	return rd.read(b)
    72  }