@@ -7,21 +7,25 @@ import (
77 "time"
88
99 "github.com/zeebo/xxh3"
10- "golang.org/x/time/rate"
10+
11+ "github.com/SenseUnit/dumbproxy/rate"
1112)
1213
1314const copyChunkSize = 128 * 1024
1415
1516type BWLimit struct {
16- d []rate.Limiter
17- u []rate.Limiter
17+ limit rate.Limit
18+ burst int64
19+ d []rate.Limiter
20+ u []rate.Limiter
1821}
1922
2023func NewBWLimit (bytesPerSecond float64 , burst int64 , buckets uint , separate bool ) * BWLimit {
2124 if buckets == 0 {
2225 buckets = 1
2326 }
24- lim := * (rate .NewLimiter (rate .Limit (bytesPerSecond ), max (copyChunkSize , burst )))
27+ burst = max (copyChunkSize , burst )
28+ lim := * (rate .NewLimiter (burst ))
2529 d := make ([]rate.Limiter , buckets )
2630 for i := range d {
2731 d [i ] = lim
@@ -34,8 +38,10 @@ func NewBWLimit(bytesPerSecond float64, burst int64, buckets uint, separate bool
3438 }
3539 }
3640 return & BWLimit {
37- d : d ,
38- u : u ,
41+ limit : rate .Limit (bytesPerSecond ),
42+ burst : burst ,
43+ d : d ,
44+ u : u ,
3945 }
4046}
4147
@@ -47,7 +53,7 @@ func (l *BWLimit) copy(ctx context.Context, rl *rate.Limiter, dst io.Writer, src
4753 var n int64
4854 for {
4955 t := time .Now ()
50- r := rl .ReserveN (t , copyChunkSize )
56+ r := rl .ReserveN (l . limit , l . burst , t , copyChunkSize )
5157 if ! r .OK () {
5258 err = errors .New ("can't get rate limit reservation" )
5359 return
@@ -64,9 +70,9 @@ func (l *BWLimit) copy(ctx context.Context, rl *rate.Limiter, dst io.Writer, src
6470 n , err = io .Copy (dst , lim )
6571 written += n
6672 if n < copyChunkSize {
67- r .CancelAt (t )
73+ r .CancelAt (l . limit , l . burst , t )
6874 if n > 0 {
69- rl .ReserveN (t , n )
75+ rl .ReserveN (l . limit , l . burst , t , n )
7076 }
7177 }
7278 if err != nil {
0 commit comments