]> git.itanic.dy.fi Git - rrdd/commitdiff
process: Always kick job scheduler when a worker finishes
authorTimo Kokkonen <timo.t.kokkonen@iki.fi>
Sat, 21 Nov 2020 09:34:59 +0000 (11:34 +0200)
committerTimo Kokkonen <timo.t.kokkonen@iki.fi>
Sat, 21 Nov 2020 09:34:59 +0000 (11:34 +0200)
If we happen to have a very long running job, it is not desired that
all other jobs remain stuck waiting this job to complete. This can
happen if we first start all jobs, causing the scheduler to wait
indefinitely for a "kick", then the last job takes forever to finish.

To fix this, every time a job finishes, it is better to reschedule the
job poller in case new job has become schedulable.

Signed-off-by: Timo Kokkonen <timo.t.kokkonen@iki.fi>
process.c

index 2f5bccdc8a0d16c1c8602acaf2929710591fb2b7..12b77aa69821810137f7eec567d66aaebd9c1527 100644 (file)
--- a/process.c
+++ b/process.c
@@ -134,15 +134,17 @@ out_unlock:
         * ensures next time we start spawning worker threads
         * the first thread will have number zero on its name.
         */
-       if (!workers_active) {
+       if (!workers_active)
                worker_count = 0;
 
-               /*
-                * Kick the job poller, just to print the time of next
-                * update on the logs
-                */
-               notify_job_request();
-       }
+       /*
+        * Kick the job poller. If all jobs were active at this point
+        * the scheduler thread will wait indefinitely until someone
+        * tells it to do something. We may now know when next job is
+        * available, so it is better for the scheduler to recalculate
+        * its sleep time.
+        */
+       notify_job_request();
 
        mutex_unlock(&work_stats_mutex);