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  }