|
@@ -4676,6 +4676,28 @@ static void clear_stratum_shares(struct pool *pool)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* We only need to maintain a secondary pool connection when we need the
|
|
|
|
|
+ * capacity to get work from the backup pools while still on the primary */
|
|
|
|
|
+static bool cnx_needed(struct pool *pool)
|
|
|
|
|
+{
|
|
|
|
|
+ struct pool *cp;
|
|
|
|
|
+
|
|
|
|
|
+ if (pool_strategy == POOL_BALANCE)
|
|
|
|
|
+ return true;
|
|
|
|
|
+ if (pool_strategy == POOL_LOADBALANCE)
|
|
|
|
|
+ return true;
|
|
|
|
|
+ if (opt_fail_only)
|
|
|
|
|
+ return true;
|
|
|
|
|
+ cp = current_pool();
|
|
|
|
|
+ if (cp == pool)
|
|
|
|
|
+ return true;
|
|
|
|
|
+ if (!cp->has_gbt && !cp->has_stratum)
|
|
|
|
|
+ return true;
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+static void wait_lpcurrent(struct pool *pool);
|
|
|
|
|
+
|
|
|
/* One stratum thread per pool that has stratum waits on the socket checking
|
|
/* One stratum thread per pool that has stratum waits on the socket checking
|
|
|
* for new messages and for the integrity of the socket connection. We reset
|
|
* for new messages and for the integrity of the socket connection. We reset
|
|
|
* the connection based on the integrity of the receive side only as the send
|
|
* the connection based on the integrity of the receive side only as the send
|
|
@@ -4696,6 +4718,22 @@ static void *stratum_thread(void *userdata)
|
|
|
if (unlikely(pool->removed))
|
|
if (unlikely(pool->removed))
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
+ /* Check to see whether we need to maintain this connection
|
|
|
|
|
+ * indefinitely or just bring it up when we switch to this
|
|
|
|
|
+ * pool */
|
|
|
|
|
+ if (!cnx_needed(pool)) {
|
|
|
|
|
+ suspend_stratum(pool);
|
|
|
|
|
+ wait_lpcurrent(pool);
|
|
|
|
|
+ if (!initiate_stratum(pool) || !auth_stratum(pool)) {
|
|
|
|
|
+ pool_died(pool);
|
|
|
|
|
+ while (!initiate_stratum(pool) || !auth_stratum(pool)) {
|
|
|
|
|
+ if (pool->removed)
|
|
|
|
|
+ goto out;
|
|
|
|
|
+ sleep(30);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
FD_ZERO(&rd);
|
|
FD_ZERO(&rd);
|
|
|
FD_SET(pool->sock, &rd);
|
|
FD_SET(pool->sock, &rd);
|
|
|
timeout.tv_sec = 90;
|
|
timeout.tv_sec = 90;
|