Commit ef822a25ed44e447815b0b10020fd08ea2cef504

Con Kolivas 2012-10-08T11:08:04

Detect stratum outage based on either select timing out or receiving an empty buffer and properly re-establish connection by disabling the stratum_active flag, coping with empty buffers in parse_stratum.

diff --git a/cgminer.c b/cgminer.c
index c08cfe1..37eeda1 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -4163,24 +4163,28 @@ static void *stratum_thread(void *userdata)
 		 * every minute so if we fail to receive any for 2 minutes we
 		 * assume the connection has been dropped and treat this pool
 		 * as dead */
-		if (select(pool->sock + 1, &rd, NULL, NULL, &timeout) < 1) {
+		select(pool->sock + 1, &rd, NULL, NULL, &timeout);
+		s = recv_line(pool);
+		if (!s) {
 			applog(LOG_INFO, "Stratum connection to pool %d interrupted", pool->pool_no);
 			pool->getfail_occasions++;
 			total_go++;
 
+			pool->stratum_active = false;
+			if (initiate_stratum(pool) && auth_stratum(pool))
+				continue;
+
 			pool_died(pool);
 			while (!initiate_stratum(pool) || !auth_stratum(pool)) {
 				if (pool->removed)
 					goto out;
-				sleep(5);
+				sleep(30);
 			}
 			applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no);
 			pool_resus(pool);
 			continue;
 		}
-		s = recv_line(pool);
-		if (unlikely(!s))
-			continue;
+
 		if (!parse_method(pool, s) && !parse_stratum_response(s))
 			applog(LOG_INFO, "Unknown stratum msg: %s", s);
 		free(s);
diff --git a/util.c b/util.c
index d39d103..6d6409b 100644
--- a/util.c
+++ b/util.c
@@ -1103,6 +1103,9 @@ bool parse_method(struct pool *pool, char *s)
 	bool ret = false;
 	char *buf;
 
+	if (!s)
+		goto out;
+
 	val = JSON_LOADS(s, &err);
 	if (!val) {
 		applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text);
@@ -1166,7 +1169,7 @@ bool auth_stratum(struct pool *pool)
 		sret = recv_line(pool);
 		if (!parse_method(pool, sret)) {
 			clear_sock(pool);
-			applog(LOG_WARNING, "Failed to parse stratum buffer");
+			applog(LOG_INFO, "Failed to parse stratum buffer");
 			free(sret);
 			return ret;
 		}