Reset quotas on load balance for all pools at the same time to avoid running out during selection and unintentionally dropping to fallback.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
diff --git a/cgminer.c b/cgminer.c
index 9bfebf1..7c89f73 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