diff --git a/main.c b/main.c index 714de49e..cf5fabef 100644 --- a/main.c +++ b/main.c @@ -444,6 +444,16 @@ static bool pool_tclear(struct pool *pool, bool *var) return ret; } +static bool pool_isset(struct pool *pool, bool *var) +{ + bool ret; + + mutex_lock(&pool->pool_lock); + ret = *var; + mutex_unlock(&pool->pool_lock); + return ret; +} + static struct pool *current_pool(void) { struct pool *pool; @@ -2292,6 +2302,11 @@ static bool submit_upstream_work(const struct work *work) if (opt_debug) applog(LOG_DEBUG, "DBG: sending %s submit RPC call: %s", pool->rpc_url, sd); + /* Force a fresh connection in case there are dead persistent + * connections to this pool */ + if (pool_isset(pool, &pool->submit_fail)) + curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1); + /* issue JSON-RPC request */ val = json_rpc_call(curl, pool->rpc_url, pool->rpc_userpass, s, false, false, &rolltime, pool); if (unlikely(!val)) { @@ -2448,8 +2463,12 @@ retry: } rc = work_decode(json_object_get(val, "result"), work); - if (!rc && retries < 3) + if (!rc && retries < 3) { + /* Force a fresh connection in case there are dead persistent + * connections */ + curl_easy_setopt(curl, CURLOPT_FRESH_CONNECT, 1); goto retry; + } work->pool = pool; total_getworks++; pool->getwork_requested++;