diff --git a/src/ckpool.h b/src/ckpool.h index 0f00e926..12b35a83 100644 --- a/src/ckpool.h +++ b/src/ckpool.h @@ -277,6 +277,7 @@ enum stratum_msgtype { SM_WORKINFO, SM_SUGGESTDIFF, SM_BLOCK, + SM_PONG, SM_NONE }; @@ -298,6 +299,7 @@ static const char __maybe_unused *stratum_msgs[] = { "workinfo", "suggestdiff", "block", + "pong", "" }; diff --git a/src/connector.c b/src/connector.c index cbeb4535..d0135854 100644 --- a/src/connector.c +++ b/src/connector.c @@ -1094,11 +1094,21 @@ static void parse_remote_submitblock(ckpool_t *ckp, const json_t *val, const cha send_proc(ckp->generator, gbt_block); } +static void ping_upstream(cdata_t *cdata) +{ + char *buf; + + ASPRINTF(&buf, "{\"method\":\"ping\"}\n"); + ckmsgq_add(cdata->upstream_sends, buf); +} + static void *urecv_process(void *arg) { ckpool_t *ckp = (ckpool_t *)arg; cdata_t *cdata = ckp->data; connsock_t *cs = &cdata->upstream_cs; + bool alive = true; + ckp->proxy = true; rename_proc("ureceiver"); @@ -1114,12 +1124,16 @@ static void *urecv_process(void *arg) cksem_wait(&cs->sem); ret = read_socket_line(cs, &timeout); if (ret < 1) { - if (likely(!ret)) + ping_upstream(cdata); + if (likely(!ret)) { LOGDEBUG("No message from upstream pool"); - else + } else { LOGNOTICE("Failed to read from upstream pool"); + alive = false; + } goto nomsg; } + alive = true; val = json_loads(cs->buf, 0, NULL); if (unlikely(!val)) { LOGWARNING("Received non-json msg from upstream pool %s", @@ -1135,10 +1149,15 @@ static void *urecv_process(void *arg) } if (!safecmp(method, "submitblock")) parse_remote_submitblock(ckp, val, cs->buf); + else if (!safecmp(method, "pong")) + LOGDEBUG("Received upstream pong"); else LOGWARNING("Unrecognised upstream method %s", method); nomsg: cksem_post(&cs->sem); + + if (!alive) + sleep(5); } return NULL; } diff --git a/src/stratifier.c b/src/stratifier.c index 68603b72..ae482593 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -5999,6 +5999,14 @@ static void parse_remote_block(sdata_t *sdata, json_t *val, const char *buf) reset_bestshares(sdata); } +static void send_remote_pong(sdata_t *sdata, stratum_instance_t *client) +{ + json_t *json_msg; + + JSON_CPACK(json_msg, "{ss}", "method", "pong"); + stratum_add_send(sdata, json_msg, client->id, SM_PONG); +} + static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf, stratum_instance_t *client) { @@ -6019,6 +6027,8 @@ static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const parse_remote_blocksubmit(ckp, val, buf, client); else if (!safecmp(method, "block")) parse_remote_block(sdata, val, buf); + else if (!safecmp(method, "ping")) + send_remote_pong(sdata, client); else LOGWARNING("unrecognised trusted message %s", buf); }