Commit 7a01578cc56726242ec78ddf5fe0b74653a75685

Con Kolivas 2012-10-06T10:14:30

Only hand off to stratum from getwork if we succeed in initiating the protocol.

diff --git a/cgminer.c b/cgminer.c
index 01527bc..b40a77a 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -4206,6 +4206,18 @@ static void init_stratum_thread(struct pool *pool)
 
 static void *longpoll_thread(void *userdata);
 
+static bool stratum_works(struct pool *pool)
+{
+	applog(LOG_INFO, "Testing pool %d stratum %s", pool->pool_no, pool->stratum_url);
+	if (!extract_sockaddr(pool, pool->stratum_url))
+		return false;
+
+	if (!initiate_stratum(pool))
+		return false;
+
+	return true;
+}
+
 static bool pool_active(struct pool *pool, bool pinging)
 {
 	struct timeval tv_getwork, tv_getwork_reply;
@@ -4244,18 +4256,13 @@ retry_stratum:
 	gettimeofday(&tv_getwork_reply, NULL);
 
 	/* Detect if a http getwork pool has an X-Stratum header at startup,
-	 * and if so, switch to that in preference to getwork. Currently no
-	 * proxy support so don't try to switch if a proxy is in use. */
-	if (unlikely(pool->stratum_url)) {
+	 * and if so, switch to that in preference to getwork if it works */
+	if (pool->stratum_url && stratum_works(pool)) {
 		applog(LOG_NOTICE, "Switching pool %d %s to %s", pool->pool_no, pool->rpc_url, pool->stratum_url);
 		pool->has_stratum = true;
-		pool->rpc_url = pool->stratum_url;
-		/* pool->stratum_url will be set again in extract_sockaddr */
-		pool->stratum_url = NULL;
-		extract_sockaddr(pool, pool->rpc_url);
 		curl_easy_cleanup(curl);
 
-		goto  retry_stratum;
+		goto retry_stratum;
 	}
 
 	if (val) {
diff --git a/util.c b/util.c
index 0fd6b54..d39d103 100644
--- a/util.c
+++ b/util.c
@@ -1309,7 +1309,8 @@ out:
 		json_decref(val);
 
 	if (ret) {
-		pool->stratum_url = pool->sockaddr_url;
+		if (!pool->stratum_url)
+			pool->stratum_url = pool->sockaddr_url;
 		pool->stratum_active = true;
 		pool->swork.diff = 1;
 		if (opt_protocol) {