Commit 48681dd4bb572f64552d295d523f3875ae89e03c

Con Kolivas 2013-09-16T12:40:11

Reset quotas on load balance for all pools at the same time to avoid running out during selection and unintentionally dropping to fallback.

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