Use quotas for load-balance pool strategy.
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
diff --git a/cgminer.c b/cgminer.c
index d210520..37c7348 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -758,6 +758,7 @@ static char *set_quota(char *arg)
pool = add_url();
setup_url(pool, url);
pool->quota = quota;
+ applog(LOG_INFO, "Setting pool %d to quota %d", pool->pool_no, pool->quota);
return NULL;
}
@@ -1184,7 +1185,7 @@ static struct opt_table opt_config_table[] = {
#endif
OPT_WITHOUT_ARG("--load-balance",
set_loadbalance, &pool_strategy,
- "Change multipool strategy from failover to efficiency based balance"),
+ "Change multipool strategy from failover to quota based balance"),
OPT_WITH_ARG("--log|-l",
set_int_0_to_9999, opt_show_intval, &opt_log_interval,
"Interval in seconds between log output"),
@@ -2814,12 +2815,16 @@ static struct pool *select_balanced(struct pool *cp)
return ret;
}
-/* Select any active pool in a rotating fashion when loadbalance is chosen */
+static struct pool *priority_pool(int choice);
+static bool pool_unusable(struct pool *pool);
+
+/* Select any active pool in a rotating fashion when loadbalance is chosen if
+ * it has any quota left. */
static inline struct pool *select_pool(bool lagging)
{
static int rotating_pool = 0;
struct pool *pool, *cp;
- int tested;
+ int tested, i;
cp = current_pool();
@@ -2834,17 +2839,37 @@ static inline struct pool *select_pool(bool lagging)
/* Try to find the first pool in the rotation that is usable */
tested = 0;
while (!pool && tested++ < total_pools) {
- if (++rotating_pool >= total_pools)
- rotating_pool = 0;
pool = pools[rotating_pool];
+ if (pool->quota_used++ >= pool->quota) {
+ pool->quota_used = 0;
+ pool = NULL;
+ if (++rotating_pool >= total_pools)
+ rotating_pool = 0;
+ continue;
+ }
if (!pool_unworkable(pool))
break;
pool = NULL;
}
+
+ /* If there are no alive pools with quota, choose according to
+ * priority. */
+ if (!pool) {
+ for (i = 0; i < total_pools; i++) {
+ struct pool *tp = priority_pool(i);
+
+ if (!pool_unusable(tp)) {
+ pool = tp;
+ break;
+ }
+ }
+ }
+
/* If still nothing is usable, use the current pool */
if (!pool)
pool = cp;
+ applog(LOG_DEBUG, "Selecting pool %d for work", pool->pool_no);
return pool;
}
@@ -3573,7 +3598,7 @@ void switch_pools(struct pool *selected)
}
switch (pool_strategy) {
- /* Both of these set to the master pool */
+ /* All of these set to the master pool */
case POOL_BALANCE:
case POOL_FAILOVER:
case POOL_LOADBALANCE:
diff --git a/miner.h b/miner.h
index 8fd3f78..4fc863b 100644
--- a/miner.h
+++ b/miner.h
@@ -1121,6 +1121,7 @@ struct pool {
int diff1;
char diff[8];
int quota;
+ int quota_used;
double diff_accepted;
double diff_rejected;