From bb49287449160533324108f6adaf8667118a0f89 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 7 Jul 2011 14:29:39 +1000 Subject: [PATCH] Make longpoll aware of when new block detection has detected a new block first and avoid flushing the work queue twice. --- main.c | 23 ++++++++++++++++++----- util.c | 1 - 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 913ebe4d..e8851ce1 100644 --- a/main.c +++ b/main.c @@ -157,6 +157,7 @@ int hw_errors; static int total_queued; static unsigned int getwork_requested = 0; static char current_block[37]; +static char longpoll_block[37]; static char blank[37]; static void applog_and_exit(const char *fmt, ...) @@ -766,15 +767,16 @@ static void *stage_thread(void *userdata) if (likely(strncmp(current_block, blank, 36))) { if (unlikely(strncmp(hexstr, current_block, 36))) { if (want_longpoll) - applog(LOG_WARNING, "New block detected, possible missed longpoll, flushing work queue "); + applog(LOG_WARNING, "New block detected, possible missed longpoll, flushing work queue"); else - applog(LOG_WARNING, "New block detected, flushing work queue "); + applog(LOG_WARNING, "New block detected, flushing work queue "); /* As we can't flush the work from here, signal * the wakeup thread to restart all the * threads */ work_restart[stage_thr_id].restart = 1; } - } + } else + memcpy(longpoll_block, hexstr, 36); memcpy(current_block, hexstr, 36); free(hexstr); @@ -1448,6 +1450,7 @@ static void *longpoll_thread(void *userdata) char *copy_start, *hdr_path, *lp_url = NULL; bool need_slash = false; int failures = 0; + unsigned int i; hdr_path = tq_pop(mythr->q, NULL); if (!hdr_path) @@ -1480,6 +1483,9 @@ static void *longpoll_thread(void *userdata) goto out; } + for (i = 0; i < 36; i++) + strcat(longpoll_block, "0"); + while (1) { json_t *val; @@ -1489,8 +1495,14 @@ static void *longpoll_thread(void *userdata) failures = 0; json_decref(val); - applog(LOG_WARNING, "LONGPOLL detected new block "); - restart_threads(true); + /* Keep track of who ordered a restart_threads to make + * sure it's only done once per new block */ + if (likely(!strncmp(longpoll_block, blank, 36) || + !strncmp(longpoll_block, current_block, 36))) { + applog(LOG_WARNING, "LONGPOLL detected new block, flushing work queue "); + restart_threads(true); + } else + applog(LOG_WARNING, "LONGPOLL received - new block detected and work flushed already "); } else { if (failures++ < 10) { sleep(30); @@ -1502,6 +1514,7 @@ static void *longpoll_thread(void *userdata) goto out; } } + memcpy(longpoll_block, current_block, 36); } out: diff --git a/util.c b/util.c index db3c127c..a0d8b5b9 100644 --- a/util.c +++ b/util.c @@ -276,7 +276,6 @@ json_t *json_rpc_call(CURL *curl, const char *url, /* If X-Long-Polling was found, activate long polling */ if (hi.lp_path) { have_longpoll = true; - opt_scantime = 60; tq_push(thr_info[longpoll_thr_id].q, hi.lp_path); } else free(hi.lp_path);