summaryrefslogtreecommitdiff
path: root/src/core/manager.h
diff options
context:
space:
mode:
authorDavid Tardon <dtardon@redhat.com>2018-04-24 15:19:38 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-05-19 11:37:00 +0200
commita7a7163df7fc8a9f794f6803b2f6c9c9b0745a1f (patch)
treece0eec239faa850f51854f73cafcf0aa3c47c7ca /src/core/manager.h
parent90bc77af29abeb4be2de67939568da73fcec26e9 (diff)
downloadsystemd-a7a7163df7fc8a9f794f6803b2f6c9c9b0745a1f.tar.gz
fix race between daemon-reload and other commands
When "systemctl daemon-reload" is run at the same time as "systemctl start foo", the latter might hang. That's because commands like start wait for JobRemoved signal to know when the job is finished. But if the job is finished during reloading, the signal is never sent. The hang can be easily reproduced by running # for ((N=1; N>0; N++)) ; do echo $N ; systemctl daemon-reload ; done # for ((N=1; N>0; N++)) ; do echo $N ; systemctl start systemd-coredump.socket ; done in two different terminals. The start command will hang after 1-2 iterations. This keeps track of jobs that were started before reload and finished during it and sends JobRemoved after the reload has finished.
Diffstat (limited to 'src/core/manager.h')
-rw-r--r--src/core/manager.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/core/manager.h b/src/core/manager.h
index f41cce1c09..1f97c15365 100644
--- a/src/core/manager.h
+++ b/src/core/manager.h
@@ -300,6 +300,9 @@ struct Manager {
/* non-zero if we are reloading or reexecuting, */
int n_reloading;
+ /* A set which contains all jobs that started before reload and finished
+ * during it */
+ Set *pending_finished_jobs;
unsigned n_installed_jobs;
unsigned n_failed_jobs;