Suspend stratum connections when we know they've failed and don't try to recv data from them once the socket no longer exists.
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
diff --git a/util.c b/util.c
index 4f38f0d..f04dabe 100644
--- a/util.c
+++ b/util.c
@@ -1012,9 +1012,11 @@ bool stratum_send(struct pool *pool, char *s, ssize_t len)
break;
case SEND_SELECTFAIL:
applog(LOG_DEBUG, "Write select failed on pool %d sock", pool->pool_no);
+ suspend_stratum(pool);
break;
case SEND_SENDFAIL:
- applog(LOG_DEBUG, "Failed to curl_easy_send in stratum_send");
+ applog(LOG_DEBUG, "Failed to send in stratum_send");
+ suspend_stratum(pool);
break;
case SEND_INACTIVE:
applog(LOG_DEBUG, "Stratum send failed due to no pool stratum_active");
@@ -1061,7 +1063,10 @@ static void clear_sock(struct pool *pool)
mutex_lock(&pool->stratum_lock);
do {
- n = recv(pool->sock, pool->sockbuf, RECVSIZE, 0);
+ if (pool->sock)
+ n = recv(pool->sock, pool->sockbuf, RECVSIZE, 0);
+ else
+ n = 0;
} while (n > 0);
mutex_unlock(&pool->stratum_lock);
@@ -1114,11 +1119,13 @@ char *recv_line(struct pool *pool)
n = recv(pool->sock, s, RECVSIZE, 0);
if (!n) {
applog(LOG_DEBUG, "Socket closed waiting in recv_line");
+ suspend_stratum(pool);
break;
}
if (n < 0) {
if (!sock_blocks() || !socket_full(pool, false)) {
applog(LOG_DEBUG, "Failed to recv sock in recv_line");
+ suspend_stratum(pool);
break;
}
} else {