[libvirt] [PATCH] qemu: Do not override config XML in case of snapshot revert
Daniel Henrique Barboza
danielhb413 at gmail.com
Mon May 13 18:48:28 UTC 2019
Tried to reproduce the error using my x86 laptop but got hit by
https://bugzilla.redhat.com/show_bug.cgi?id=1689216 when trying
to create the snapshot using upstream code:
$ sudo ./run tools/virsh snapshot-create-as ub1810-cpu-hotplug snap
error: operation failed: Failed to take snapshot: Error: Nested VMX
virtualization does not support live migration yet
Since this issue is arch independent I tried it out with a Power server.
Here's the behavior with current upstream:
- relevant piece of VM XML:
<domain type='kvm'>
<name>dhb</name>
<uuid>d3fe0169-2be6-431c-85a5-cc178601bb69</uuid>
<memory unit='KiB'>67108864</memory>
<currentMemory unit='KiB'>67108864</currentMemory>
<vcpu placement='static' current='4'>16</vcpu>
$ sudo ./run tools/virsh setvcpus dhb 8 --live
$
$ sudo ./run tools/virsh snapshot-create-as dhb snap1
Domain snapshot snap1 created
$
$ sudo ./run tools/virsh snapshot-revert dhb snap1
$
$ sudo ./run tools/virsh dumpxml --inactive dhb
<domain type='kvm'>
<name>dhb</name>
<uuid>d3fe0169-2be6-431c-85a5-cc178601bb69</uuid>
<memory unit='KiB'>67108864</memory>
<currentMemory unit='KiB'>67108864</currentMemory>
<vcpu placement='static' current='8'>16</vcpu>
<vcpus>
The inactive XML got overwritten by the vcpu hotplug, which is not intended.
After the patch, the problem isn't reproduced: the inactive VM XML was
preserved after the snapshot-revert.
Maxiwell, you (or the commiter) can add the following in the commit-msg:
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1689216
Since the bug you're fixing here also fixes this RH bugzilla.
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
Tested-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
On 4/30/19 2:54 PM, Maxiwell S. Garcia wrote:
> Snapshot create operation saves the live XML and uses it to replace the
> domain definition in case of revert. But the VM config XML is not saved
> and the revert operation does not address this issue. This commit
> prevents the config XML from being overridden by snapshot definition.
>
> An active domain stores both current and new definitions. The current
> definition (vm->def) stores the live XML and the new definition
> (vm->newDef) stores the config XML. In an inactive domain, only the
> config XML is persistent, and it's saved in vm->def.
>
> The revert operation uses the virDomainObjAssignDef() to set the
> snapshot definition in vm->newDef, if domain is active, or in vm->def
> otherwise. But before that, it saves the old value to return to
> caller. This return is used here to restore the config XML after
> all snapshot startup process finish.
>
> Signed-off-by: Maxiwell S. Garcia <maxiwell at linux.ibm.com>
> ---
> src/qemu/qemu_driver.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index b2ac737d1f..a73122454a 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -16251,6 +16251,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> qemuDomainObjPrivatePtr priv;
> int rc;
> virDomainDefPtr config = NULL;
> + virDomainDefPtr inactiveConfig = NULL;
> virQEMUDriverConfigPtr cfg = NULL;
> virCapsPtr caps = NULL;
> bool was_stopped = false;
> @@ -16465,7 +16466,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> goto endjob;
> }
> if (config) {
> - virDomainObjAssignDef(vm, config, false, NULL);
> + virDomainObjAssignDef(vm, config, false, &inactiveConfig);
> virCPUDefFree(priv->origCPU);
> VIR_STEAL_PTR(priv->origCPU, origCPU);
> }
> @@ -16474,7 +16475,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> load:
> was_stopped = true;
> if (config)
> - virDomainObjAssignDef(vm, config, false, NULL);
> + virDomainObjAssignDef(vm, config, false, &inactiveConfig);
>
> /* No cookie means libvirt which saved the domain was too old to
> * mess up the CPU definitions.
> @@ -16533,6 +16534,9 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> detail);
> }
> }
> + if (inactiveConfig)
> + VIR_STEAL_PTR(vm->newDef, inactiveConfig);
> +
> break;
>
> case VIR_DOMAIN_SNAPSHOT_SHUTDOWN:
> @@ -16560,8 +16564,11 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> qemuProcessEndJob(driver, vm);
> goto cleanup;
> }
> - if (config)
> - virDomainObjAssignDef(vm, config, false, NULL);
> + if (config) {
> + virDomainObjAssignDef(vm, config, false, &inactiveConfig);
> + if (inactiveConfig)
> + VIR_STEAL_PTR(vm->newDef, inactiveConfig);
> + }
>
> if (flags & (VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
> VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190513/2ff2284e/attachment-0001.htm>
More information about the libvir-list
mailing list