github.com/Cloud-Foundations/Dominator@v0.3.4/lib/fsrateio/reader.go (about) 1 package fsrateio 2 3 import ( 4 "fmt" 5 6 "github.com/Cloud-Foundations/Dominator/lib/format" 7 "github.com/Cloud-Foundations/Dominator/lib/rateio" 8 "github.com/Cloud-Foundations/Dominator/lib/wsyscall" 9 ) 10 11 type ReadMeasurer struct { 12 blocksAtLastMeasurement uint64 13 } 14 15 func newReadMeasurer() *ReadMeasurer { 16 var measurer ReadMeasurer 17 return &measurer 18 } 19 20 func (measurer *ReadMeasurer) MeasureReadIO(bytesSinceLastMeasurement uint64) ( 21 uint64, error) { 22 var rusage wsyscall.Rusage 23 if err := wsyscall.Getrusage(wsyscall.RUSAGE_SELF, &rusage); err != nil { 24 return 0, err 25 } 26 blocks := uint64(rusage.Inblock) 27 blocksSinceLastMeasurement := blocks - measurer.blocksAtLastMeasurement 28 measurer.blocksAtLastMeasurement = blocks 29 return blocksSinceLastMeasurement, nil 30 } 31 32 func (measurer *ReadMeasurer) Reset() { 33 var rusage wsyscall.Rusage 34 wsyscall.Getrusage(wsyscall.RUSAGE_SELF, &rusage) 35 measurer.blocksAtLastMeasurement = uint64(rusage.Inblock) 36 } 37 38 func newReaderContext(maxBytesPerSecond uint64, maxBlocksPerSecond uint64, 39 speedPercent uint64) *ReaderContext { 40 var ctx ReaderContext 41 ctx.maxBytesPerSecond = maxBytesPerSecond 42 ctx.maxBlocksPerSecond = maxBlocksPerSecond 43 if maxBlocksPerSecond > 0 { 44 ctx.ctx = rateio.NewReaderContext(maxBlocksPerSecond, speedPercent, 45 newReadMeasurer()) 46 } else { 47 ctx.ctx = rateio.NewReaderContext(maxBytesPerSecond, speedPercent, 48 &rateio.ReadMeasurer{}) 49 } 50 return &ctx 51 } 52 53 func (ctx *ReaderContext) format() string { 54 var blocksString string 55 if ctx.maxBlocksPerSecond > 0 { 56 blocksString = fmt.Sprintf("(%d blocks/s)", ctx.maxBlocksPerSecond) 57 } else { 58 blocksString = "" 59 } 60 speedPercent := uint64(ctx.GetContext().SpeedPercent()) 61 return fmt.Sprintf("max speed=%s/s%s limit=%d%% %s/s(%d blocks/s)", 62 format.FormatBytes(ctx.maxBytesPerSecond), blocksString, 63 speedPercent, 64 format.FormatBytes(ctx.maxBytesPerSecond*speedPercent/100), 65 ctx.maxBlocksPerSecond*speedPercent/100) 66 }