More ratelimit optimizations
This commit is contained in:
@@ -34,7 +34,7 @@
|
|||||||
*
|
*
|
||||||
* uc_ratelimit_init(&r,20, 1, time(NULL));
|
* uc_ratelimit_init(&r,20, 1, time(NULL));
|
||||||
*
|
*
|
||||||
* NOTE. 2 * (period + 1) * tickets * tickets must not exceed the range of the RateLimit.funds
|
* NOTE. (period + 1) * tickets must not exceed the range of the RateLimit.funds
|
||||||
*
|
*
|
||||||
* for (;;) {
|
* for (;;) {
|
||||||
* int fd = accept(..);
|
* int fd = accept(..);
|
||||||
@@ -67,7 +67,7 @@ struct RateLimit {
|
|||||||
* Initialize a struct RateLimit, which can hand out @tickets per @period
|
* Initialize a struct RateLimit, which can hand out @tickets per @period
|
||||||
* the perioid must be in the same units as the current_ts
|
* the perioid must be in the same units as the current_ts
|
||||||
*
|
*
|
||||||
* NOTE. 2 * (period + 1) * tickets * tickets must not exceed the range of the RateLimit.funds
|
* NOTE. 2 * (period + 1) * tickets must not exceed the range of the RateLimit.funds
|
||||||
*
|
*
|
||||||
* @param r RateLimit to initialize
|
* @param r RateLimit to initialize
|
||||||
* @param tickets number of tickets (bucket depth)
|
* @param tickets number of tickets (bucket depth)
|
||||||
|
|||||||
+8
-7
@@ -5,11 +5,7 @@ void uc_ratelimit_init(struct RateLimit *r, long tickets, long period, long curr
|
|||||||
{
|
{
|
||||||
r->tickets = tickets;
|
r->tickets = tickets;
|
||||||
|
|
||||||
if (tickets > period) {
|
r->ticket_cost = period;
|
||||||
r->ticket_cost = tickets * period;
|
|
||||||
} else {
|
|
||||||
r->ticket_cost = period;
|
|
||||||
}
|
|
||||||
|
|
||||||
r->period = period;
|
r->period = period;
|
||||||
r->funds = r->ticket_cost * tickets;
|
r->funds = r->ticket_cost * tickets;
|
||||||
@@ -48,8 +44,13 @@ int uc_ratelimit_allow(struct RateLimit *r, long current_ts)
|
|||||||
|
|
||||||
//Calculate the cost of tickets that became available since
|
//Calculate the cost of tickets that became available since
|
||||||
//the last time.
|
//the last time.
|
||||||
r->funds += diff_period *
|
r->funds += diff_period * r->tickets;
|
||||||
((r->tickets * r->ticket_cost) / r->period);
|
|
||||||
|
//the below is the real algorithm, with ticket_cost =
|
||||||
|
//tickets * period.
|
||||||
|
//we have optimized this to the expression used above
|
||||||
|
//r->funds += diff_period *
|
||||||
|
// ((r->tickets * r->ticket_cost) / r->period);
|
||||||
|
|
||||||
//throttle handing out tickets
|
//throttle handing out tickets
|
||||||
if (r->funds > r->ticket_cost * r->tickets) {
|
if (r->funds > r->ticket_cost * r->tickets) {
|
||||||
|
|||||||
Reference in New Issue
Block a user