38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
|
package chanfitness
|
||
|
|
||
|
import "time"
|
||
|
|
||
|
// rateLimitScale is the number of events we allow per rate limited tier.
|
||
|
// Increasing this value makes our rate limiting more lenient, decreasing it
|
||
|
// makes us less lenient.
|
||
|
const rateLimitScale = 200
|
||
|
|
||
|
// rateLimits is the set of rate limit tiers we apply to our peers based on
|
||
|
// their flap count. A peer can be placed in their tier by dividing their flap
|
||
|
// count by the rateLimitScale and returning the value at that index.
|
||
|
var rateLimits = []time.Duration{
|
||
|
time.Second,
|
||
|
time.Second * 5,
|
||
|
time.Second * 30,
|
||
|
time.Minute,
|
||
|
time.Minute * 30,
|
||
|
time.Hour,
|
||
|
}
|
||
|
|
||
|
// getRateLimit returns the value of the rate limited tier that we are on based
|
||
|
// on current flap count. If a peer's flap count exceeds the top tier, we just
|
||
|
// return our highest tier.
|
||
|
func getRateLimit(flapCount int) time.Duration {
|
||
|
// Figure out the tier we fall into based on our current flap count.
|
||
|
tier := flapCount / rateLimitScale
|
||
|
|
||
|
// If we have more events than our number of tiers, we just use the
|
||
|
// last tier
|
||
|
tierLen := len(rateLimits)
|
||
|
if tier >= tierLen {
|
||
|
tier = tierLen - 1
|
||
|
}
|
||
|
|
||
|
return rateLimits[tier]
|
||
|
}
|