Browse Source

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.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
ef822a25ed
  1. 14
      cgminer.c
  2. 5
      util.c

14
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 * every minute so if we fail to receive any for 2 minutes we
* assume the connection has been dropped and treat this pool * assume the connection has been dropped and treat this pool
* as dead */ * 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); applog(LOG_INFO, "Stratum connection to pool %d interrupted", pool->pool_no);
pool->getfail_occasions++; pool->getfail_occasions++;
total_go++; total_go++;
pool->stratum_active = false;
if (initiate_stratum(pool) && auth_stratum(pool))
continue;
pool_died(pool); pool_died(pool);
while (!initiate_stratum(pool) || !auth_stratum(pool)) { while (!initiate_stratum(pool) || !auth_stratum(pool)) {
if (pool->removed) if (pool->removed)
goto out; goto out;
sleep(5); sleep(30);
} }
applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no); applog(LOG_INFO, "Stratum connection to pool %d resumed", pool->pool_no);
pool_resus(pool); pool_resus(pool);
continue; continue;
} }
s = recv_line(pool);
if (unlikely(!s))
continue;
if (!parse_method(pool, s) && !parse_stratum_response(s)) if (!parse_method(pool, s) && !parse_stratum_response(s))
applog(LOG_INFO, "Unknown stratum msg: %s", s); applog(LOG_INFO, "Unknown stratum msg: %s", s);
free(s); free(s);

5
util.c

@ -1103,6 +1103,9 @@ bool parse_method(struct pool *pool, char *s)
bool ret = false; bool ret = false;
char *buf; char *buf;
if (!s)
goto out;
val = JSON_LOADS(s, &err); val = JSON_LOADS(s, &err);
if (!val) { if (!val) {
applog(LOG_INFO, "JSON decode failed(%d): %s", err.line, err.text); 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); sret = recv_line(pool);
if (!parse_method(pool, sret)) { if (!parse_method(pool, sret)) {
clear_sock(pool); clear_sock(pool);
applog(LOG_WARNING, "Failed to parse stratum buffer"); applog(LOG_INFO, "Failed to parse stratum buffer");
free(sret); free(sret);
return ret; return ret;
} }

Loading…
Cancel
Save