[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xenstored: Delay forking until after listening sockets are



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1206537702 0
# Node ID 21d9575c669ee6e88fb77052e775f74bfbeaf7e6
# Parent  f471ea3665469a0610cec53c1931c1d85d54efb7
xenstored: Delay forking until after listening sockets are
opened. Also, in startup xend script, delay further startup until
xenstored initial child process has exited. This serialises xenstored
startup with that of other daemons (e.g., xenconsoled).

Signed-off-by: Bastian Blank <waldi@xxxxxxxxxx>
---
 tools/misc/xend                 |   16 +++++++++++-----
 tools/xenstore/xenstored_core.c |   25 +++++++++++++------------
 2 files changed, 24 insertions(+), 17 deletions(-)

diff -r f471ea366546 -r 21d9575c669e tools/misc/xend
--- a/tools/misc/xend   Wed Mar 26 13:15:33 2008 +0000
+++ b/tools/misc/xend   Wed Mar 26 13:21:42 2008 +0000
@@ -95,11 +95,17 @@ def start_xenstored():
         f.close()
     except:
         pass
-    XENSTORED_TRACE = os.getenv("XENSTORED_TRACE")
-    cmd = "xenstored --pid-file /var/run/xenstore.pid"
-    if XENSTORED_TRACE:
-        cmd += " -T /var/log/xen/xenstored-trace.log"
-    s,o = commands.getstatusoutput(cmd)
+    args = ['xenstored', "--pid-file", pidfname]
+    if os.getenv("XENSTORED_TRACE"):
+        args.extend(["-T", "/var/log/xen/xenstored-trace.log"])
+    pid = os.fork()
+    if pid == 0:
+        os.execvp('xenstored', args)
+    p, status = os.waitpid(pid, 0)
+    if os.WIFEXITED(status):
+        status = os.WEXITSTATUS(status)
+        if status:
+            raise RuntimeError("Failed to start xenstored: %d" % status)
 
 def start_consoled():
     if os.fork() == 0:
diff -r f471ea366546 -r 21d9575c669e tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Wed Mar 26 13:15:33 2008 +0000
+++ b/tools/xenstore/xenstored_core.c   Wed Mar 26 13:21:42 2008 +0000
@@ -1839,13 +1839,6 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (dofork) {
-               openlog("xenstored", 0, LOG_DAEMON);
-               daemonize();
-       }
-       if (pidfile)
-               write_pidfile(pidfile);
-
        /* Talloc leak reports go to stderr, which is closed if we fork. */
        if (!dofork)
                talloc_enable_leak_report_full();
@@ -1899,22 +1892,30 @@ int main(int argc, char *argv[])
        /* Restore existing connections. */
        restore_existing_connections();
 
-       if (outputpid) {
-               printf("%ld\n", (long)getpid());
-               fflush(stdout);
-       }
-
        /* redirect to /dev/null now we're ready to accept connections */
        if (dofork) {
                int devnull = open("/dev/null", O_RDWR);
                if (devnull == -1)
                        barf_perror("Could not open /dev/null\n");
+
+               openlog("xenstored", 0, LOG_DAEMON);
+
+               daemonize();
+
+               if (outputpid) {
+                       printf("%ld\n", (long)getpid());
+                       fflush(stdout);
+               }
+
                dup2(devnull, STDIN_FILENO);
                dup2(devnull, STDOUT_FILENO);
                dup2(devnull, STDERR_FILENO);
                close(devnull);
                xprintf = trace;
        }
+
+       if (pidfile)
+               write_pidfile(pidfile);
 
        signal(SIGHUP, trigger_reopen_log);
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.