[libvirt] [PATCH 7/7] qemu: snapshot: Correctly revert snapshots in PMSUSPENDED state
Eric Blake
eblake at redhat.com
Fri Jul 18 23:12:27 UTC 2014
On 07/18/2014 10:11 AM, Peter Krempa wrote:
> PMSUSPENDED state implies the qemu process running, so we should treat
> it that way. This increases the possible state space of transitions that
> may happen during the snapshot revert so this patch documents them as
> well.
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1079162
> ---
> src/qemu/qemu_driver.c | 67 ++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 48 insertions(+), 19 deletions(-)
I think this needs some rework - current qemu treats it as reverting to
a pm wakeup event, and the guest will start running again (unless the
user requested to revert as paused).
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 1f98f4a..f93e0fd 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -14052,22 +14052,29 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> virDomainDefPtr config = NULL;
> virQEMUDriverConfigPtr cfg = NULL;
> virCapsPtr caps = NULL;
> - int oldState = vm->state.state;
> + int oldState;
>
> virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING |
> VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED |
> VIR_DOMAIN_SNAPSHOT_REVERT_FORCE, -1);
>
> /* We have the following transitions, which create the following events:
> - * 1. inactive -> inactive: none
> - * 2. inactive -> running: EVENT_STARTED
> - * 3. inactive -> paused: EVENT_STARTED, EVENT_PAUSED
> - * 4. running -> inactive: EVENT_STOPPED
> - * 5. running -> running: none
> - * 6. running -> paused: EVENT_PAUSED
> - * 7. paused -> inactive: EVENT_STOPPED
> - * 8. paused -> running: EVENT_RESUMED
> - * 9. paused -> paused: none
> + * 1. inactive -> inactive: none
> + * 2. inactive -> running: EVENT_STARTED
> + * 3. inactive -> paused: EVENT_STARTED, EVENT_PAUSED
> + * 4. running -> inactive: EVENT_STOPPED
> + * 5. running -> running: none
> + * 6. running -> paused: EVENT_PAUSED
> + * 7. paused -> inactive: EVENT_STOPPED
> + * 8. paused -> running: EVENT_RESUMED
> + * 9. paused -> paused: none
> + * 10. pmsuspended -> pmsuspended: none
this state is not possible with current qemu
> + * 11. pmsuspended -> inactive: EVENT_STOPPED
> + * 12. pmsuspended -> running: EVENT_RESUMED
> + * 13. pmsuspended -> paused: EVENT_PAUSED
> + * 14. inactive -> pmsuspended: EVENT_STARTED, EVENT_PMSUSPENDED
> + * 15. paused -> pmsuspended: EVENT_PMSUSPENDED
> + * 16. running -> pmsuspended: EVENT_PMSUSPENDED
and these three states are not possible
> * Also, several transitions occur even if we fail partway through,
> * and use of FORCE can cause multiple transitions.
> */
> @@ -14075,6 +14082,8 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> if (!(vm = qemuDomObjFromSnapshot(snapshot)))
> return -1;
>
> + oldState = vm->state.state;
> +
> cfg = virQEMUDriverGetConfig(driver);
>
> if (virDomainRevertToSnapshotEnsureACL(snapshot->domain->conn, vm->def) < 0)
> @@ -14127,6 +14136,14 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
> }
> }
>
> + if (snap->def->state == VIR_DOMAIN_PMSUSPENDED &&
> + (flags & VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING ||
> + flags & VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED)) {
> + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
> + _("snapshot of a VM in PMSUSPENDED state cannot be "
> + "reverted to a running or paused state"));
actually, I think that we need to tackle it differently - we can't
CREATE a snapshot in the pmsuspended state (just as we can't migrate in
that state - the mere act of migration is a wakeup event). So, if you
eliminate all snapshots in the pmsuspended state as invalid, the set of
state transitions is smaller.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 604 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140718/b9f2f288/attachment-0001.sig>
More information about the libvir-list
mailing list