[libvirt] PATCH: Allow virtual networks to survive daemon restarts

Daniel Veillard veillard at redhat.com
Fri Jan 16 15:02:11 UTC 2009


On Wed, Jan 14, 2009 at 12:44:50PM +0000, Daniel P. Berrange wrote:
> On Wed, Jan 14, 2009 at 08:55:46AM +0000, Mark McLoughlin wrote:
> > On Tue, 2009-01-13 at 20:49 +0000, Daniel P. Berrange wrote:
> > > Currently when we shutdown  the virtual networks are all shutdown too.
> > > This is less than useful if we're letting guest VMs hang around post
> > > shutdown of libvirtd, because it means we're tearing their network
> > > connection out from under them. This patch fixes that allowing networks
> > > to survive restarts, and be re-detected next time around.
> > > 
> > > When starting a virtual network we write the live config into
> > > 
> > >   /var/lib/libvirt/network/$NAME.xml
> > > 
> > > This is because the bridge device name is potentially auto-generated
> > > and we need to keep track of that
> > > 
> > > We change dnsmasq args to include an explicit pidfile location
> > > 
> > >   /var/run/libvirt/network/$NAME.pid
> > > 
> > > and also tell it to put itself into the background - ie daemonize. This
> > > is because we want dnsmasq to survive the daemon.
> > > 
> > > Now, when libvirtd starts up it
> > > 
> > >  - Looks for the live config, and if found loads it. 
> > >  - Calls a new method brHasBridge() to see if its desired bridge
> > >    actually exists (and thus whether the network is running).
> > >    If it exists,the network is marked active
> > >  - If DHCP is configured, then reads the dnsmasq PIDfile, and sends
> > >    kill($PID, 0) to check if the process is actually alive
> > > 
> > > In addition I cleanup the network code to remove the configFile and
> > > autostartLink fields in virNetworkObjPtr, so it matches virDomaiObjPtr
> > > usage.
> > > 
> > > With all this applied you can now restart the daemon, and virbr0 is
> > > left happily running.
> > 
> > It all sounds and looks good to me. Some comments below, but nothing
> > major.
> 
> Here's an updated patch with all your comments incorporated.

  Sounds a real user improvement, patch looks fine but I'm concerned
about this:

> +            /* Finally try and read dnsmasq pid if any DHCP ranges are set */
> +            if (obj->def->nranges &&
> +                virFileReadPid(NETWORK_PID_DIR, obj->def->name,
> +                               &obj->dnsmasqPid) == 0) {
> +
> +                /* Check its still alive */
> +                if (kill(obj->dnsmasqPid, 0) != 0)
> +                    obj->dnsmasqPid = -1;
> +
> +                /* XXX ideally we'd check this was actually
> +                 * the dnsmasq process, not a stale pid file
> +                 * with someone else's process. But how ?
> +                 */

   OS specific but check in configure about the location of dnsmasq
export it as DNSMASQ_PATH, then compare to file pointed by /proc/pid/exe

#ifdef __linux__
    char *pidpath;

    virAsprintf(&pidpath, "/proc/%d/exe", obj->dnsmasqPid);
    if (virFileLinkPointsTo(pidpath, DNSMASQ_PATH) == 0))
        obj->dnsmasqPid = -1;
    VIR_FREE(pidpath);
#endif

  I'm sure one can find a Solaris equivalent.


  Patch looks fine to me,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list