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) @@ -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);

5
util.c

@ -1103,6 +1103,9 @@ bool parse_method(struct pool *pool, char *s) @@ -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) @@ -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;
}

Loading…
Cancel
Save