mirror of
https://github.com/ergochat/ergo.git
synced 2024-12-01 16:39:26 +01:00
fix fakelag double-rate issue
Basically, fakelag was counting the time imposed by its own sleeps as though the user had themselves paused for that amount of time. Therefore, if a user sent a large number of consecutive commands, every other command would pause for the expected throttle interval, but the subsequent command would be processed instantly (you'd get two back-to-back commands). This resulted in throttled users being able to send at double the expected rate.
This commit is contained in:
parent
c75d2c91c5
commit
f6d2dade4e
@ -85,9 +85,10 @@ func (fl *Fakelag) Touch() {
|
|||||||
}
|
}
|
||||||
// space them out by at least window/messagesperwindow
|
// space them out by at least window/messagesperwindow
|
||||||
sleepDuration := time.Duration((int64(fl.window) / int64(fl.throttleMessagesPerWindow)) - int64(elapsed))
|
sleepDuration := time.Duration((int64(fl.window) / int64(fl.throttleMessagesPerWindow)) - int64(elapsed))
|
||||||
if sleepDuration < 0 {
|
if sleepDuration > 0 {
|
||||||
sleepDuration = 0
|
fl.sleepFunc(sleepDuration)
|
||||||
|
// the touch time should take into account the time we slept
|
||||||
|
fl.lastTouch = fl.nowFunc()
|
||||||
}
|
}
|
||||||
fl.sleepFunc(sleepDuration)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,13 +83,15 @@ func TestFakelag(t *testing.T) {
|
|||||||
t.Fatalf("incorrect sleep time: %v != %v", expected, duration)
|
t.Fatalf("incorrect sleep time: %v != %v", expected, duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// send another message without a pause; we should have to sleep for 500 msec
|
||||||
fl.Touch()
|
fl.Touch()
|
||||||
if fl.state != FakelagThrottled {
|
if fl.state != FakelagThrottled {
|
||||||
t.Fatalf("should be throttled")
|
t.Fatalf("should be throttled")
|
||||||
}
|
}
|
||||||
slept, duration = mt.lastSleep()
|
slept, duration = mt.lastSleep()
|
||||||
if duration != interval {
|
expected, _ = time.ParseDuration("500ms")
|
||||||
t.Fatalf("incorrect sleep time: %v != %v", interval, duration)
|
if duration != expected {
|
||||||
|
t.Fatalf("incorrect sleep time: %v != %v", duration, expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
mt.pause(interval * 6)
|
mt.pause(interval * 6)
|
||||||
|
Loading…
Reference in New Issue
Block a user