Commit ba4ba7f65c4c5e66cd2adeccd721fc671a89dadf

Con Kolivas 2011-07-14T11:26:56

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