[libvirt] PATCH: 4/12: Refactoring URI probing

Daniel Veillard veillard at redhat.com
Fri Nov 14 12:46:11 UTC 2008


On Fri, Nov 14, 2008 at 11:35:16AM +0000, Daniel P. Berrange wrote:
> On Fri, Nov 14, 2008 at 11:26:49AM +0100, Daniel Veillard wrote:
> > On Thu, Nov 13, 2008 at 05:25:53PM +0000, Daniel P. Berrange wrote:
> > > This patch changes the way hypervisor URIs are probed when NULL is passed
> > > to the virConnectOpen() method. Previously we had an explicit probe method
> > > called in each driver. This does not work when we move some drivers out of
> > > libvirt.so and into libvirtd daemon. So I've refactored the way this works
> > > so that we simply pass a NULL uri into the individual driver open methods.
> > > If they see a NULL uri, they will make an attempt to open, and return a
> > > VIR_DRV_OPEN_DECLINED code if its not suitable. This also works for the
> > > remote driver, probing supported URI inside the daemon. Quite alot of code
> > > churn but the end result should be functionally the same
> > 
> >   Okay, makes sense,
> > 
> > [...]
> > > +++ b/src/datatypes.c	Wed Nov 12 21:59:20 2008 +0000
> > > @@ -174,7 +174,7 @@
> > >   */
> > >  static void
> > >  virReleaseConnect(virConnectPtr conn) {
> > > -    DEBUG("release connection %p %s", conn, conn->name);
> > > +    DEBUG("release connection %p", conn);
> > 
> >   maybe conn->name should have been kept to help with debug,
> > each time conn->uri was set it should be easy to keep name too.
> > not a blocker, just a suggestion...
> 
> The reason I remove it, was because once we store the xmlUriPtr there
> was not actually any functional code which used the 'name' field. All
> the drivers' open methods will now potentially have to set 'uri', so
> I felt it easier to just remove 'name', and not have possibility of one
> driver forgetting to also change 'name' when changing the 'uri'.

  okay

> > > +    if (name) {
> > > +        /* Convert xen -> xen:/// for back compat */
> > > +        if (STRCASEEQ(name, "xen"))
> > > +            name = "xen:///";
> > > +
> > > +        /* Convert xen:// -> xen:/// because xmlParseURI cannot parse the
> > > +         * former.  This allows URIs such as xen://localhost to work.
> > > +         */
> > > +        if (STREQ (name, "xen://"))
> > > +            name = "xen:///";
> > > +
> > > +        ret->uri = xmlParseURI (name);
> > > +        if (!ret->uri) {
> > > +            virLibConnError (ret, VIR_ERR_INVALID_ARG,
> > > +                             _("could not parse connection URI"));
> > > +            goto failed;
> > > +        }
> > > +
> > > +        DEBUG("name \"%s\" to URI components:\n"
> > > +              "  scheme %s\n"
> > > +              "  opaque %s\n"
> > > +              "  authority %s\n"
> > > +              "  server %s\n"
> > > +              "  user %s\n"
> > > +              "  port %d\n"
> > > +              "  path %s\n",
> > > +              name,
> > > +              ret->uri->scheme, ret->uri->opaque,
> > > +              ret->uri->authority, ret->uri->server,
> > > +              ret->uri->user, ret->uri->port,
> > > +              ret->uri->path);
> > 
> >   Hum... that could crash on some OSes, many of those strings might get
> > NULL, actually opaque will be NULL if you have path.
> 
> Hmm, doesn't printf just turn NULL into the string '(null)' ? We kind

  Linux one yes, others no :-)

> of rely on that not crashing, more or less everywhere in libvirt.c
> for the DEBUG macros. Some of these are false positives, but the vast
> majority have potential for the %s argument to be NULL, since they're
> accepting input directly from the public API.
> 
> $ grep DEBUG src/libvirt.c | grep '%s'
>     DEBUG ("registering %s as driver %d",
>     DEBUG("libVir=%p, type=%s, typeVer=%p", libVer, type, typeVer);
>     DEBUG("Using LIBVIRT_DEFAULT_URI %s", defname);
>     DEBUG("Probed %s", latest);
>     DEBUG("Could not probe any hypervisor defaulting to %s",
>     DEBUG("Using %s as default URI, %d hypervisor found",
>     DEBUG("name \"%s\" to URI components:\n"
>     DEBUG("trying driver %d (%s) ...",
>     DEBUG("driver %d %s returned %s",
>     DEBUG("network driver %d %s returned %s",
>     DEBUG("storage driver %d %s returned %s",
>     DEBUG("name=%s", name);
>     DEBUG("name=%s", name);
>     DEBUG("name=%s, auth=%p, flags=%d", name, auth, flags);
>     DEBUG("conn=%p, type=%s", conn, type);
>     DEBUG("conn=%p, xmlDesc=%s, flags=%d", conn, xmlDesc, flags);
>     DEBUG("conn=%p, uuid=%s", conn, uuid);
>     DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
>     DEBUG("conn=%p, name=%s", conn, name);
>     DEBUG("domain=%p, to=%s", domain, to);
>     DEBUG("conn=%p, from=%s", conn, from);
>     DEBUG("domain=%p, to=%s, flags=%d", domain, to, flags);
>     DEBUG("domain=%p, dconn=%p, flags=%lu, dname=%s, uri=%s, bandwidth=%lu",
>     DEBUG("dconn=%p, cookie=%p, cookielen=%p, uri_in=%s, uri_out=%p, flags=%lu, dname=%s, bandwidth=%lu", dconn, cookie, cookielen, uri_in, uri_out, flags, dname, bandwidth);
>     DEBUG("domain=%p, cookie=%p, cookielen=%d, uri=%s, flags=%lu, dname=%s, bandwidth=%lu", domain, cookie, cookielen, uri, flags, dname, bandwidth);
>     DEBUG("dconn=%p, dname=%s, cookie=%p, cookielen=%d, uri=%s, flags=%lu", dconn, dname, cookie, cookielen, uri, flags);
>     DEBUG("domain=%p, path=%s, stats=%p, size=%zi", dom, path, stats, size);
>     DEBUG("domain=%p, path=%s, stats=%p, size=%zi", dom, path, stats, size);
>     DEBUG("domain=%p, path=%s, offset=%lld, size=%zi, buffer=%p",
>     DEBUG("conn=%p, xml=%s", conn, xml);
>     DEBUG("domain=%p, xml=%s", domain, xml);
>     DEBUG("domain=%p, xml=%s", domain, xml);
>     DEBUG("conn=%p, name=%s", conn, name);
>     DEBUG("conn=%p, uuid=%s", conn, uuid);
>     DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
>     DEBUG("conn=%p, xmlDesc=%s", conn, xmlDesc);
>     DEBUG("conn=%p, xml=%s", conn, xml);
>     DEBUG("conn=%p, name=%s", conn, name);
>     DEBUG("conn=%p, uuid=%s", conn, uuid);
>     DEBUG("conn=%p, uuidstr=%s", conn, uuidstr);
>     DEBUG("conn=%p, xmlDesc=%s", conn, xmlDesc);
>     DEBUG("conn=%p, xml=%s", conn, xml);
>     DEBUG("pool=%p, name=%s", pool, name);
>     DEBUG("conn=%p, key=%s", conn, key);
>     DEBUG("conn=%p, path=%s", conn, path);

  Let's keep as-is that can be handled separately

> 
> >   Okay, the remote extension and the auto-spawn of a user daemon for
> > testing makes it a more complex than expected fix, but I don't see any
> > simpler way. Only testing will tell us if something is missing
> > compatibility wise, so let's push it and wait for feedback !
> 
> The auto-spawn & daemon stuff is the bit I tested most carefully in this
> patch, so hopefully no bad surprises there...

  Okidoc :-)

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