"expect daemon" and daemons being ready to serve requests
Robie Basak
robie.basak at ubuntu.com
Tue Oct 1 16:21:03 UTC 2013
Currently, when libvirtd is started (process A) with "-d" to daemonize,
it:
1) Forks process B.
2) Forks process C (from B).
3) Binds a Unix socket (in C).
4) Listens on a Unix socket (in C).
5) Causes process A to exit (using an internal pipe to communicate
between processes C and A).
libvirtd's packaging in Ubuntu (libvirt-bin) currently uses an upstart
script that calls "libvirtd -d" and uses "expect daemon".
Upstart detects that the daemon has started at step 2 above. This
creates a race: libvirt-bin.postinst finishes before step 4, and so a
subsequent uvtool.postinst that depends on libvirt-bin fails when it
tries to set up a libvirt volume storage pool and cannot connect to
libvirtd.
I have other solutions in the bug: making uvtool.postinst explicitly
wait for the Unix socket to appear, and switching to "expect stop".
But libvirtd's behaviour seems reasonable to me. And in the Sys V world,
an init.d script would only exit after step 5 above, so there would be
no race. So it feels bad to introduce the SIGSTOP hack into libvirt in
order to solve this problem.
Could upstart wait() on process A before concluding that the service is
started, in the case of "expect daemon" (and also, presumably, "expect
fork")? Would changing upstart's behaviour to do this cause any problems or
regressions that I haven't thought of?
libvirt bug: https://launchpad.net/bugs/1228210
Thanks,
Robie
More information about the upstart-devel
mailing list