From 7c19984fd69c966b0c4ff8b004cb04fbca01148c Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 7 Sep 2013 12:12:24 +1000 Subject: [PATCH] Use quotas for load-balance pool strategy. --- cgminer.c | 37 +++++++++++++++++++++++++++++++------ miner.h | 1 + 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/cgminer.c b/cgminer.c index d2105207..37c73482 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 8fd3f780..4fc863b3 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;