Browse Source

Only restart threads that are not stuck waiting on lp staged work, and add one mandatory queued work item for each restart.

Con Kolivas 14 years ago
parent
commit
ba4ba7f65c
1 changed files with 9 additions and 1 deletions
  1. 9 1
      main.c

+ 9 - 1
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);
 			}