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