[libvirt] [PATCH] Fix race in starting transient VMs

Daniel P. Berrange berrange at redhat.com
Fri Nov 1 10:48:48 UTC 2013


On Thu, Oct 31, 2013 at 01:00:01PM -0600, Eric Blake wrote:
> On 10/31/2013 12:41 PM, Daniel P. Berrange wrote:
> > From: "Daniel P. Berrange" <berrange at redhat.com>
> > 
> > When starting a transient VM the first thing done is to check
> > for duplicates. The check looks if there are any running VMs
> > with the matching name/uuid. It explicitly allows there to
> > be inactive VMs, so that a persistent VM can be temporarily
> > booted with a different config.
> > 
> 
> > 
> > The fix is to only allow an existing inactive VM if it is
> > marked as persistent.
> > 
> > Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> > ---
> >  src/conf/domain_conf.c | 6 ++++++
> >  1 file changed, 6 insertions(+)
> 
> ACK.  What a nasty bug to track down.
> 
> > 
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 51c4e29..454fbfe 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -2171,6 +2171,12 @@ virDomainObjListAddLocked(virDomainObjListPtr doms,
> >                                 vm->def->name);
> >                  goto error;
> >              }
> > +            if (!vm->persistent) {
> > +                virReportError(VIR_ERR_OPERATION_INVALID,
> > +                               _("domain is being started as '%s'"),
> 
> The error is a bit awkward (I ask to create a domain named 'foo', and
> the error message is 'domain is being started as 'foo''), but no worse
> than the error message a couple lines earlier ('domain is already active
> as 'foo'').  Maybe "domain '%s' is already being started" reads better.

Ok, changing it thus:

@@ -2167,7 +2167,13 @@ virDomainObjListAddLocked(virDomainObjListPtr doms,
             /* UUID & name match, but if VM is already active, refuse it */
             if (virDomainObjIsActive(vm)) {
                 virReportError(VIR_ERR_OPERATION_INVALID,
-                               _("domain is already active as '%s'"),
+                               _("domain '%s' is already active"),
+                               vm->def->name);
+                goto error;
+            }
+            if (!vm->persistent) {
+                virReportError(VIR_ERR_OPERATION_INVALID,
+                               _("domain '%s' is already being started"),
                                vm->def->name);
                 goto error;
             }

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list