From 48681dd4bb572f64552d295d523f3875ae89e03c Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 16 Sep 2013 12:40:11 +1000 Subject: [PATCH] Reset quotas on load balance for all pools at the same time to avoid running out during selection and unintentionally dropping to fallback. --- cgminer.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/cgminer.c b/cgminer.c index 9bfebf19..7c89f73f 100644 --- a/cgminer.c +++ b/cgminer.c @@ -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) } 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