fix small Read() big rate for slow.Reader

This commit is contained in:
bel
2025-05-17 20:53:15 -06:00
parent d73b63f43c
commit 8f18cbae3a
3 changed files with 33 additions and 9 deletions

View File

@@ -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