fix small Read() big rate for slow.Reader
This commit is contained in:
@@ -9,30 +9,36 @@ import (
|
||||
|
||||
type Reader struct {
|
||||
ctx context.Context
|
||||
limiter *rate.Limiter
|
||||
limiter rate.Limiter
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
var _ io.Reader = Reader{}
|
||||
var _ io.Reader = &Reader{}
|
||||
|
||||
func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) Reader {
|
||||
return Reader{
|
||||
func NewReader(ctx context.Context, bps rate.Limit, r io.Reader) *Reader {
|
||||
return &Reader{
|
||||
ctx: ctx,
|
||||
limiter: rate.NewLimiter(bps, int(bps)),
|
||||
limiter: *rate.NewLimiter(bps, int(bps)),
|
||||
r: r,
|
||||
}
|
||||
}
|
||||
|
||||
func (r Reader) Read(b []byte) (int, error) {
|
||||
func (r *Reader) Read(b []byte) (int, error) {
|
||||
n, err := r.r.Read(b)
|
||||
|
||||
m := 0
|
||||
burst := r.limiter.Burst()
|
||||
for m < n {
|
||||
if err := r.limiter.WaitN(r.ctx, burst); err != nil {
|
||||
page := burst
|
||||
if left := n - m; page > left {
|
||||
page = left
|
||||
}
|
||||
|
||||
if err := r.limiter.WaitN(r.ctx, page); err != nil {
|
||||
return n, err
|
||||
}
|
||||
m += burst
|
||||
|
||||
m += page
|
||||
}
|
||||
|
||||
return n, err
|
||||
|
||||
Reference in New Issue
Block a user