fix traffic limiter

This commit is contained in:
ginuerzh
2022-12-19 19:33:29 +08:00
parent 1cb719f694
commit 15feb7599e
6 changed files with 438 additions and 246 deletions

View File

@ -2,6 +2,9 @@ package traffic
import (
"context"
"fmt"
"sort"
"strconv"
limiter "github.com/go-gost/core/limiter/traffic"
"golang.org/x/time/rate"
@ -26,5 +29,48 @@ func (l *llimiter) Wait(ctx context.Context, n int) int {
}
func (l *llimiter) Limit() int {
return l.limiter.Burst()
return int(l.limiter.Limit())
}
func (l *llimiter) Set(n int) {
l.limiter.SetLimit(rate.Limit(n))
l.limiter.SetBurst(n)
}
func (l *llimiter) String() string {
return strconv.Itoa(int(l.limiter.Limit()))
}
type limiterGroup struct {
limiters []limiter.Limiter
}
func newLimiterGroup(limiters ...limiter.Limiter) *limiterGroup {
sort.Slice(limiters, func(i, j int) bool {
return limiters[i].Limit() < limiters[j].Limit()
})
return &limiterGroup{limiters: limiters}
}
func (l *limiterGroup) Wait(ctx context.Context, n int) int {
for i := range l.limiters {
if v := l.limiters[i].Wait(ctx, n); v < n {
n = v
}
}
return n
}
func (l *limiterGroup) Limit() int {
if len(l.limiters) == 0 {
return 0
}
return l.limiters[0].Limit()
}
func (l *limiterGroup) Set(n int) {}
func (l *limiterGroup) String() string {
return fmt.Sprintf("%v", l.limiters)
}