aboutsummaryrefslogtreecommitdiff
path: root/lib/daemon.c
diff options
context:
space:
mode:
authorGurucharan Shetty <gshetty@nicira.com>2013-04-28 19:25:55 -0700
committerGurucharan Shetty <gshetty@nicira.com>2013-04-29 15:09:48 -0700
commit7ffd3f6972b41827d7b03e10dcbb0a4c20e4d919 (patch)
tree488e7186435678f9c6bd67f6f64f17ea1b04c27a /lib/daemon.c
parent9f27568d9f6615b486bd13324b9a607864ef8780 (diff)
worker: Prevent worker from being responsible for pidfile deletion.
Currently we are creating the worker process after creation of the pidfile. This means that the responsibility of deleting the pidfile after process termination rests with the worker process. When we restart openvswitch using the startup scripts, we SIGTERM the main process and once it is cleaned up, we start ovs-vswitchd again. This results in a race condition. The new ovs-vswitchd will create a pidfile because it is unlocked. But, if the old worker process exits after the start of new ovs-vswitchd, it will simply delete the pidfile underneath the new ovs-vswitchd. This will eventually result in multiple ovs-vswitchd daemons. This patch gives the responsibility of deleting the pidfile to the main process. Bug #16669. Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
Diffstat (limited to 'lib/daemon.c')
-rw-r--r--lib/daemon.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/daemon.c b/lib/daemon.c
index e7ee56ce..e12bc14a 100644
--- a/lib/daemon.c
+++ b/lib/daemon.c
@@ -163,6 +163,26 @@ daemon_save_fd(int fd)
save_fds[fd] = true;
}
+/* Unregisters pidfile from being unlinked when the program terminates via
+* exit() or a fatal signal. */
+void
+remove_pidfile_from_unlink(void)
+{
+ if (pidfile) {
+ fatal_signal_remove_file_to_unlink(pidfile);
+ }
+}
+
+/* Registers pidfile to be unlinked when the program terminates via exit() or a
+ * fatal signal. */
+void
+add_pidfile_to_unlink(void)
+{
+ if (pidfile) {
+ fatal_signal_add_file_to_unlink(pidfile);
+ }
+}
+
/* If a pidfile has been configured, creates it and stores the running
* process's pid in it. Ensures that the pidfile will be deleted when the
* process exits. */
@@ -240,8 +260,6 @@ make_pidfile(void)
pidfile_dev = s.st_dev;
pidfile_ino = s.st_ino;
free(tmpfile);
- free(pidfile);
- pidfile = NULL;
}
/* If configured with set_pidfile() or set_detach(), creates the pid file and
@@ -529,6 +547,11 @@ daemonize_start(void)
void
daemonize_complete(void)
{
+ if (pidfile) {
+ free(pidfile);
+ pidfile = NULL;
+ }
+
if (!detached) {
detached = true;