|
|
|
@ -2868,6 +2868,7 @@ static inline struct pool *select_pool(bool lagging)
@@ -2868,6 +2868,7 @@ static inline struct pool *select_pool(bool lagging)
|
|
|
|
|
{ |
|
|
|
|
static int rotating_pool = 0; |
|
|
|
|
struct pool *pool, *cp; |
|
|
|
|
bool avail = false; |
|
|
|
|
int tested, i; |
|
|
|
|
|
|
|
|
|
cp = current_pool(); |
|
|
|
@ -2883,14 +2884,28 @@ static inline struct pool *select_pool(bool lagging)
@@ -2883,14 +2884,28 @@ static inline struct pool *select_pool(bool lagging)
|
|
|
|
|
} else |
|
|
|
|
pool = NULL; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < total_pools; i++) { |
|
|
|
|
struct pool *tp = pools[i]; |
|
|
|
|
|
|
|
|
|
if (tp->quota_used < tp->quota_gcd) { |
|
|
|
|
avail = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* There are no pools with quota, so reset them. */ |
|
|
|
|
if (!avail) { |
|
|
|
|
for (i = 0; i < total_pools; i++) |
|
|
|
|
pools[i]->quota_used = 0; |
|
|
|
|
if (++rotating_pool >= total_pools) |
|
|
|
|
rotating_pool = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Try to find the first pool in the rotation that is usable */ |
|
|
|
|
tested = 0; |
|
|
|
|
while (!pool && tested++ < total_pools) { |
|
|
|
|
pool = pools[rotating_pool]; |
|
|
|
|
if (pool->quota_used++ >= pool->quota_gcd) { |
|
|
|
|
pool->quota_used = 0; |
|
|
|
|
pool = NULL; |
|
|
|
|
} else { |
|
|
|
|
if (pool->quota_used++ < pool->quota_gcd) { |
|
|
|
|
if (!pool_unworkable(pool)) |
|
|
|
|
break; |
|
|
|
|
/* Failover-only flag for load-balance means distribute
|
|
|
|
|