fix(access): limit writer in pipe

@formatter:off

Signed-off-by: slasher <shenjie1@oppo.com>
This commit is contained in:
slasher 2026-06-18 17:35:29 +08:00 committed by Victor1319
parent e286733d88
commit 6b2e7926be

View File

@ -118,20 +118,20 @@ type Writer struct {
var _ io.Writer = &Writer{} var _ io.Writer = &Writer{}
func (w *Writer) Write(p []byte) (n int, err error) { func (w *Writer) Write(p []byte) (n int, err error) {
n, err = w.underlying.Write(p)
now := time.Now() now := time.Now()
reserve := w.rate.ReserveN(now, n) reserve := w.rate.ReserveN(now, len(p))
// Wait if necessary // Wait if necessary
delay := reserve.DelayFrom(now) delay := reserve.DelayFrom(now)
if delay == 0 { if delay == 0 {
n, err = w.underlying.Write(p)
return return
} }
span := trace.SpanFromContextSafe(w.ctx) span := trace.SpanFromContextSafe(w.ctx)
if !reserve.OK() { if !reserve.OK() {
span.Warnf("writer exceeds limiter n:%d, burst:%d", n, w.rate.Burst()) span.Warnf("writer exceeds limiter n:%d, burst:%d", len(p), w.rate.Burst())
n, err = w.underlying.Write(p)
return return
} }
t := time.NewTimer(delay) t := time.NewTimer(delay)
@ -143,6 +143,7 @@ func (w *Writer) Write(p []byte) (n int, err error) {
select { select {
case <-t.C: case <-t.C:
// We can proceed. // We can proceed.
n, err = w.underlying.Write(p)
return return
case <-w.ctx.Done(): case <-w.ctx.Done():
// Context was canceled before we could proceed. Cancel the // Context was canceled before we could proceed. Cancel the