github.com/Cloud-Foundations/Dominator@v0.3.4/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 }