Commit d56e5ae61b2211f579c91e36b0a43edfd74e175e

Con Kolivas 2012-01-01T14:40:31

Force fresh curl connections on any detected rpc failure in case of dead persistent connections..

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++;