mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
fix(access): limit writer in pipe
@formatter:off Signed-off-by: slasher <shenjie1@oppo.com>
This commit is contained in:
parent
e286733d88
commit
6b2e7926be
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user