Only restart threads that are not stuck waiting on lp staged work, and add one mandatory queued work item for each restart.
diff --git a/main.c b/main.c
index 216444e..c03b024 100644
--- a/main.c
+++ b/main.c
@@ -1924,8 +1924,16 @@ static void *watchdog_thread(void *userdata)
for (i = 0; i < mining_threads; i++) {
struct thr_info *thr = &thr_info[i];
- if (now.tv_sec - thr->last.tv_sec > 60) {
+ /* Do not kill threads waiting on longpoll staged work */
+ if (now.tv_sec - thr->last.tv_sec > 60 && !lp_staged) {
applog(LOG_ERR, "Attempting to restart thread %d, idle for more than 60 seconds", i);
+ /* Create one mandatory work item */
+ inc_staged(1, true);
+ if (unlikely(!queue_request())) {
+ applog(LOG_ERR, "Failed to queue_request in watchdog_thread");
+ kill_work();
+ break;
+ }
reinit_thread(i);
applog(LOG_WARNING, "Thread %d restarted", i);
}