[libvirt] [PATCH] qemu: migrate: Error if we collide with an inactive domain
Daniel P. Berrange
berrange at redhat.com
Wed Oct 28 14:18:50 UTC 2009
On Wed, Oct 28, 2009 at 03:12:45PM +0100, Chris Lalancette wrote:
> Cole Robinson wrote:
> > Currently the check for a VM name/uuid collision on the migrate destination
> > only errors for active domains. Not sure why this wouldn't apply for non
> > running VMs as well, so drop the check.
> >
> > Signed-off-by: Cole Robinson <crobinso at redhat.com>
> > ---
> > src/qemu/qemu_driver.c | 11 ++++-------
> > 1 files changed, 4 insertions(+), 7 deletions(-)
> >
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 86546e5..fb952d8 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -6341,13 +6341,10 @@ qemudDomainMigratePrepare2 (virConnectPtr dconn,
> >
> > if (!vm) vm = virDomainFindByName(&driver->domains, dname);
> > if (vm) {
> > - if (virDomainIsActive(vm)) {
> > - qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> > - _("domain with the same name or UUID already exists as '%s'"),
> > - vm->def->name);
> > - goto cleanup;
> > - }
> > - virDomainObjUnlock(vm);
> > + qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
> > + _("domain with the same name or UUID already exists as '%s'"),
> > + vm->def->name);
> > + goto cleanup;
> > }
> >
> > if (!(vm = virDomainAssignDef(dconn,
>
> No, I don't think we should drop this check. This is useful for a workaround
> where you want to make a guest "persistent" on all sides of a migration. True,
> we now have migration flags that do this for you, but that's only as of 0.7.2.
> I think there is still a use-case for defining a guest on a destination, and
> then migrating over there.
>
> That being said, maybe we could tighten this check up. In particular, if the
> XML on the destination doesn't equal the incoming XML, then we should probably
> fail the migration. However, if they are the same, we should allow the migration.
It needs to match the logic in qemudDomainCreate() I believe.
/* See if a VM with matching UUID already exists */
vm = virDomainFindByUUID(&driver->domains, def->uuid);
if (vm) {
/* UUID matches, but if names don't match, refuse it */
if (STRNEQ(vm->def->name, def->name)) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(vm->def->uuid, uuidstr);
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
_("domain '%s' is already defined with uuid %s"),
vm->def->name, uuidstr);
goto cleanup;
}
/* UUID & name match, but if VM is already active, refuse it */
if (virDomainIsActive(vm)) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
_("domain is already active as '%s'"), vm->def->name);
goto cleanup;
}
virDomainObjUnlock(vm);
} else {
/* UUID does not match, but if a name matches, refuse it */
vm = virDomainFindByName(&driver->domains, def->name);
if (vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(vm->def->uuid, uuidstr);
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
_("domain '%s' is already defined with uuid %s"),
def->name, uuidstr);
goto cleanup;
}
}
ie, this is allowing a completely new incoming domain, or a matching name +
UUID for an existing domain only if it is inactive. If matching existing
domain is running, or if partial name/uuid match then it must be refused
Regards,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list