Force fresh curl connections on any detected rpc failure in case of dead persistent connections..
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
diff --git a/main.c b/main.c
index 714de49..cf5fabe 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++;