Codebase list golang-github-vbauerster-mpb / 8006363
better proxyReader metrics Vladimir Bauer 7 years ago
2 changed file(s) with 17 addition(s) and 15 deletion(s). Raw diff Collapse all Expand all
33 "bytes"
44 "fmt"
55 "io"
6 "io/ioutil"
67 "strings"
78 "sync"
89 "time"
142143 }
143144 }
144145
145 // ProxyReader allows progress tracking against provided io.Reader.
146 // ProxyReader wraps r with metrics required for progress tracking.
146147 func (b *Bar) ProxyReader(r io.Reader) io.Reader {
147 return &proxyReader{r, b}
148 if r == nil {
149 panic("expect io.Reader, got nil")
150 }
151 rc, ok := r.(io.ReadCloser)
152 if !ok {
153 rc = ioutil.NopCloser(r)
154 }
155 return &proxyReader{rc, b, time.Now()}
148156 }
149157
150158 // ID returs id of the bar.
66
77 // proxyReader is io.Reader wrapper, for proxy read bytes
88 type proxyReader struct {
9 r io.Reader
10 b *Bar
9 io.ReadCloser
10 bar *Bar
11 iT time.Time
1112 }
1213
13 func (s *proxyReader) Read(p []byte) (n int, err error) {
14 start := time.Now()
15 n, err = s.r.Read(p)
14 func (pr *proxyReader) Read(p []byte) (n int, err error) {
15 n, err = pr.ReadCloser.Read(p)
1616 if n > 0 {
17 s.b.IncrBy(n, time.Since(start))
17 pr.bar.IncrBy(n, time.Since(pr.iT))
18 pr.iT = time.Now()
1819 }
1920 return
2021 }
21
22 func (s *proxyReader) Close() error {
23 if closer, ok := s.r.(io.Closer); ok {
24 return closer.Close()
25 }
26 return nil
27 }