Add percentage based limiting

This commit is contained in:
Leonid Bugaev
2014-10-26 13:23:17 +03:00
parent de143e4268
commit 58c7e12d1f
2 changed files with 55 additions and 0 deletions
+5
View File
@@ -6,6 +6,7 @@ import (
"strconv"
"strings"
"time"
"math/rand"
)
type Limiter struct {
@@ -39,6 +40,10 @@ func NewLimiter(plugin interface{}, options string) io.ReadWriter {
}
func (l *Limiter) isLimited() bool {
if (l.isPercent) {
return l.limit <= rand.Intn(100)
}
if (time.Now().UnixNano() - l.currentTime) > time.Second.Nanoseconds() {
l.currentTime = time.Now().UnixNano()
l.currentRPS = 0
+50
View File
@@ -51,5 +51,55 @@ func TestInputLimiter(t *testing.T) {
wg.Wait()
close(quit)
}
// Should limit all requests
func TestPercentLimiter1(t *testing.T) {
wg := new(sync.WaitGroup)
quit := make(chan int)
input := NewTestInput()
output := NewLimiter(NewTestOutput(func(data []byte) {
wg.Done()
}), "0%")
Plugins.Inputs = []io.Reader{input}
Plugins.Outputs = []io.Writer{output}
go Start(quit)
for i := 0; i < 100; i++ {
input.EmitGET()
}
wg.Wait()
close(quit)
}
// Should not limit at all
func TestPercentLimiter2(t *testing.T) {
wg := new(sync.WaitGroup)
quit := make(chan int)
input := NewTestInput()
output := NewLimiter(NewTestOutput(func(data []byte) {
wg.Done()
}), "100%")
wg.Add(100)
Plugins.Inputs = []io.Reader{input}
Plugins.Outputs = []io.Writer{output}
go Start(quit)
for i := 0; i < 100; i++ {
input.EmitGET()
}
wg.Wait()
close(quit)
}