daemon: Integrate checking for an existing pidfile into daemonize_start().
authorBen Pfaff <blp@nicira.com>
Thu, 31 Mar 2011 16:44:30 +0000 (09:44 -0700)
committerBen Pfaff <blp@nicira.com>
Mon, 4 Apr 2011 17:58:55 +0000 (10:58 -0700)
Until now, it has been the responsibility of an individual daemon to call
die_if_already_running() at an appropriate time.  A long time ago, this
had to happen *before* daemonizing, because once the process daemonized
itself there was no way to report failure to the process that originally
started the daemon.  With the introduction of daemonize_start(), this is
now possible, but we haven't been taking advantage of it.

Therefore, this commit integrates the die_if_already_running() call into
daemonize_start() and deletes the calls to it from individual daemons.

13 files changed:
debian/ovs-monitor-ipsec
lib/daemon.c
lib/daemon.h
ovsdb/ovsdb-server.c
python/ovs/daemon.py
tests/test-daemon.py
tests/test-jsonrpc.c
tests/test-jsonrpc.py
utilities/ovs-controller.c
utilities/ovs-openflowd.c
vswitchd/ovs-brcompatd.c
vswitchd/ovs-vswitchd.c
xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync

index 17f399767c60a5475245bb47e8c88b73411e48a3..febd5691d3ebdb4caed920cd835bc3be25995eed 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/python
-# Copyright (c) 2009, 2010 Nicira Networks
+# Copyright (c) 2009, 2010, 2011 Nicira Networks
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -450,8 +450,6 @@ def main(argv):
                          "(use --help for help)\n" % ovs.util.PROGRAM_NAME)
         sys.exit(1)
 
-    ovs.daemon.die_if_already_running()
     remote = args[0]
     idl = ovs.db.idl.Idl(remote, "Open_vSwitch", monitor_uuid_schema_cb)
 
index 173dabe6f5c172e257c9d080cbbe4a0e96039b42..a9cada86646ddae0d6b9acbc98fea54c1d596238 100644 (file)
@@ -107,9 +107,9 @@ is_chdir_enabled(void)
     return chdir_;
 }
 
-/* Normally, die_if_already_running() will terminate the program with a message
- * if a locked pidfile already exists.  If this function is called,
- * die_if_already_running() will merely log a warning. */
+/* Normally, daemonize() or damonize_start() will terminate the program with a
+ * message if a locked pidfile already exists.  If this function is called, an
+ * existing pidfile will be replaced, with a warning. */
 void
 ignore_existing_pidfile(void)
 {
@@ -141,7 +141,7 @@ daemon_set_monitor(void)
 
 /* If a locked pidfile exists, issue a warning message and, unless
  * ignore_existing_pidfile() has been called, terminate the program. */
-void
+static void
 die_if_already_running(void)
 {
     pid_t pid;
@@ -449,6 +449,7 @@ daemonize_start(void)
         /* Running in daemon process. */
     }
 
+    die_if_already_running();
     make_pidfile();
 
     /* Make sure that the unixctl commands for vlog get registered in a
index 8f4fe39029ecc17e3705bfc7de8f7a0aac226393..4af98f624b193f97189981cfd491c19a1627d400 100644 (file)
@@ -67,7 +67,6 @@ void daemon_set_monitor(void);
 void daemonize(void);
 void daemonize_start(void);
 void daemonize_complete(void);
-void die_if_already_running(void);
 void ignore_existing_pidfile(void);
 void daemon_usage(void);
 pid_t read_pidfile(const char *name);
index df0bc953ab8cde46b2a08bce75c78eb8e8fe4563..c9b0fdd951378d661ef9c15fc5e6fe40b9b7fb2c 100644 (file)
@@ -101,7 +101,6 @@ main(int argc, char *argv[])
     parse_options(argc, argv, &file_name, &remotes, &unixctl_path,
                   &run_command);
 
-    die_if_already_running();
     daemonize_start();
 
     error = ovsdb_file_open(file_name, false, &db, &file);
index 4df23715944e657e6664b0b284bd652c74de2e12..cfb417831421d20942eb20c33794d2d7347b6599 100644 (file)
@@ -89,9 +89,9 @@ def is_chdir_enabled():
     return _chdir
 
 def ignore_existing_pidfile():
-    """Normally, die_if_already_running() will terminate the program with a
-    message if a locked pidfile already exists.  If this function is called,
-    die_if_already_running() will merely log a warning."""
+    """Normally, daemonize() or daemonize_start() will terminate the program
+    with a message if a locked pidfile already exists.  If this function is
+    called, an existing pidfile will be replaced, with a warning."""
     global _overwrite_pidfile
     _overwrite_pidfile = True
 
@@ -111,7 +111,7 @@ def set_monitor():
     global _monitor
     _monitor = True
 
-def die_if_already_running():
+def _die_if_already_running():
     """If a locked pidfile exists, issue a warning message and, unless
     ignore_existing_pidfile() has been called, terminate the program."""
     if _pidfile is None:
@@ -343,6 +343,7 @@ def daemonize_start():
             _monitor_daemon(daemon_pid)
         # Running in daemon process
     
+    _die_if_already_running()
     _make_pidfile()
 
 def daemonize_complete():
index 386445d4434201aee064792a1aa271c036f1c972..586e0ec3606ab50422907816eb450c231d0e6405 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2010 Nicira Networks.
+# Copyright (c) 2010, 2011 Nicira Networks.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -45,7 +45,6 @@ def main(argv):
                              % (ovs.util.PROGRAM_NAME, key))
             sys.exit(1)
 
-    ovs.daemon.die_if_already_running()
     ovs.daemon.daemonize_start()
     if bail:
         sys.stderr.write("%s: exiting after daemonize_start() as requested\n"
index 44edda84a429af541c3988d572eb88e3a4b5c6f9..12bbc975eb954439dfd3205eecbd8715d0e5ceef 100644 (file)
@@ -182,8 +182,6 @@ do_listen(int argc OVS_UNUSED, char *argv[])
     bool done;
     int error;
 
-    die_if_already_running();
-
     error = jsonrpc_pstream_open(argv[1], &pstream);
     if (error) {
         ovs_fatal(error, "could not listen on \"%s\"", argv[1]);
index a8bf553e2c573c02e0e9dae4b9827cd8d1539e2e..064457e2908f8f04d229d07608fa26f0b7f5b159 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2009, 2010 Nicira Networks
+# Copyright (c) 2009, 2010, 2011 Nicira Networks
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -49,8 +49,6 @@ def handle_rpc(rpc, msg):
     return done
 
 def do_listen(name):
-    ovs.daemon.die_if_already_running()
-
     error, pstream = ovs.stream.PassiveStream.open(name)
     if error:
         sys.stderr.write("could not listen on \"%s\": %s\n"
index af9e11f0d749083925f4b16da6955f163990ef2f..ae0ea3da1b2c5d0699d4a8bcd6267a9a2c1f426b 100644 (file)
@@ -139,7 +139,6 @@ main(int argc, char *argv[])
         ovs_fatal(0, "no active or passive switch connections");
     }
 
-    die_if_already_running();
     daemonize_start();
 
     retval = unixctl_server_create(unixctl_path, &unixctl);
index a58a9d219467b7f034523b6fb1196f193125270b..86f5ca5926e6b755e7b6a99d5a819f74a81abe7a 100644 (file)
@@ -103,7 +103,6 @@ main(int argc, char *argv[])
     parse_options(argc, argv, &s);
     signal(SIGPIPE, SIG_IGN);
 
-    die_if_already_running();
     daemonize_start();
 
     /* Start listening for ovs-appctl requests. */
index 667aa661bdfc2287bd2ac5644439fcf66193f106..9d5cdfb13d2686cdd9cd2dcddd3eba7da3eaea8e 100644 (file)
@@ -1289,7 +1289,6 @@ main(int argc, char *argv[])
     process_init();
     ovsrec_init();
 
-    die_if_already_running();
     daemonize_start();
 
     retval = unixctl_server_create(NULL, &unixctl);
index bae03dd0f61892871063c6bab35029015fc826ed..b9a24618404c6cd753f7b7bdf1034d8a8ea24ff9 100644 (file)
@@ -74,7 +74,6 @@ main(int argc, char *argv[])
     process_init();
     ovsrec_init();
 
-    die_if_already_running();
     daemonize_start();
 
     retval = unixctl_server_create(NULL, &unixctl);
index 07995d0609d75872d25e5d7a30e1edec549a6c61..273ec04d894ca0837944f47d10d805452cd5dd80 100755 (executable)
@@ -254,8 +254,6 @@ def main(argv):
                          "(use --help for help)\n" % ovs.util.PROGRAM_NAME)
         sys.exit(1)
 
-    ovs.daemon.die_if_already_running()
-
     remote = args[0]
     idl = ovs.db.idl.Idl(remote, "Open_vSwitch", monitor_uuid_schema_cb)