Only hand off to stratum from getwork if we succeed in initiating the protocol.
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 48 49 50 51 52 53 54 55 56 57 58 59
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) {