All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: "Daniel P. Berrangé" <berrange@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Peter Krempa <pkrempa@redhat.com>,
	"Denis V. Lunev" <den@virtuozzo.com>,
	qemu-block@nongnu.org, Juan Quintela <quintela@redhat.com>,
	qemu-devel@nongnu.org,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Max Reitz <mreitz@redhat.com>, John Snow <jsnow@redhat.com>
Subject: Re: [PATCH v3 7/7] migration: introduce snapshot-{save, load, delete} QMP commands
Date: Tue, 01 Sep 2020 16:20:47 +0200	[thread overview]
Message-ID: <87d035tw74.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <20200827111606.1408275-8-berrange@redhat.com> ("Daniel P. =?utf-8?Q?Berrang=C3=A9=22's?= message of "Thu, 27 Aug 2020 12:16:06 +0100")

Daniel P. Berrangé <berrange@redhat.com> writes:

> savevm, loadvm and delvm are some of the few HMP commands that have never
> been converted to use QMP. The primary reason for this lack of conversion
> is that they block execution of the thread for as long as they run.

Nope.  The primary reason is that the HMP interface is bonkers.

> Despite this downside, however, libvirt and applications using libvirt
> have used these commands for as long as QMP has existed, via the
> "human-monitor-command" passthrough command. IOW, while it is clearly
> desirable to be able to fix the blocking problem, this is not an
> immediate obstacle to real world usage.
>
> Meanwhile there is a need for other features which involve adding new
> parameters to the commands. This is possible with HMP passthrough, but
> it provides no reliable way for apps to introspect features, so using
> QAPI modelling is highly desirable.
>
> This patch thus introduces new snapshot-{load,save,delete} commands to
> QMP that are intended to replace the old HMP counterparts. The new
> commands are given different names, because they will be using the new
> QEMU job framework and thus will have diverging behaviour from the HMP
> originals. It would thus be misleading to keep the same name.
>
> While this design uses the generic job framework, the current impl is
> still blocking. The intention that the blocking problem is fixed later.
> None the less applications using these new commands should assume that
> they are asynchronous and thus wait for the job status change event to
> indicate completion.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
[...]
> diff --git a/qapi/job.json b/qapi/job.json
> index 280c2f76f1..51bee470f0 100644
> --- a/qapi/job.json
> +++ b/qapi/job.json
> @@ -22,10 +22,17 @@
>  #
>  # @amend: image options amend job type, see "x-blockdev-amend" (since 5.1)
>  #
> +# @snapshot-load: snapshot load job type, see "loadvm" (since 5.2)

Do you mean 'see command @snapshot-load?

> +#
> +# @snapshot-save: snapshot save job type, see "savevm" (since 5.2)

@snapshot-save?

> +#
> +# @snapshot-delete: snapshot delete job type, see "delvm" (since 5.2)

@snapshot-delete?

> +#
>  # Since: 1.7
>  ##
>  { 'enum': 'JobType',
> -  'data': ['commit', 'stream', 'mirror', 'backup', 'create', 'amend'] }
> +  'data': ['commit', 'stream', 'mirror', 'backup', 'create', 'amend',
> +           'snapshot-load', 'snapshot-save', 'snapshot-delete'] }
>  
>  ##
>  # @JobStatus:
> diff --git a/qapi/migration.json b/qapi/migration.json
> index 5f6b06172c..d70f627b77 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -1720,3 +1720,138 @@
>  ##
>  { 'event': 'UNPLUG_PRIMARY',
>    'data': { 'device-id': 'str' } }
> +
> +##
> +# @snapshot-save:
> +#
> +# Save a VM snapshot
> +#
> +# @job-id: identifier for the newly created job
> +# @tag: name of the snapshot to create. If it already
> +# exists it will be replaced.

Sounds a bit dangerous.  Require a force flag for such an overwrite?
Not sure.

> +# @devices: list of block device node names to save a snapshot to
> +# @vmstate: block device node name to save vmstate to

Worth mentioning that omitting writable block devices is probably a bad
idea?

> +#
> +# Applications should not assume that the snapshot save is complete
> +# when this command returns.

Is it complete then with the current code?  I'm asking because such
properties have a way to sneakily become de facto ABI.  We may not be
able to do anything about that now, other than documenting "don't do
that" like you did, but I'd like to understand the state of affairs all
the same.

> +#                            Completion is indicated by the job
> +# status. Clients can wait for the JOB_STATUS_CHANGE event. If the
> +# job aborts, errors can be obtained via the 'query-jobs' command,
> +# though.

Sure we want to these job basics here?

> +#         Note that at this time most vmstate procssing errors only

Typo: processing

Whatever a "vmstate processing error" is...

> +# get printed to stderr. This limitation will be fixed at a future
> +# date.

Is that a promise?  ;)

> +#
> +# Note that the VM CPUs will be paused during the time it takes to
> +# save the snapshot

End the sentence with a period, please.

> +#
> +# If @devices is not specified, or is an empty list, then the
> +# historical default logic for picking devices will be used.

Why is this useful for QMP?

> +#
> +# If @vmstate is not specified, then the first valid block
> +# device will be used for vmstate.

Why is this useful for QMP?

> +#
> +# Returns: nothing
> +#
> +# Example:
> +#
> +# -> { "execute": "snapshot-save",
> +#      "data": {
> +#         "job-id": "snapsave0",
> +#         "tag": "my-snap",
> +#         "vmstate": "disk0",
> +#         "devices": ["disk0", "disk1"]
> +#      }
> +#    }
> +# <- { "return": { } }
> +#
> +# Since: 5.2
> +##
> +{ 'command': 'snapshot-save',
> +  'data': { 'job-id': 'str',
> +            'tag': 'str',
> +            '*vmstate': 'str',
> +            '*devices': ['str'] } }
> +
> +##
> +# @snapshot-load:
> +#
> +# Load a VM snapshot
> +#
> +# @job-id: identifier for the newly created job
> +# @tag: name of the snapshot to load.
> +# @devices: list of block device node names to load a snapshot from
> +# @vmstate: block device node name to load vmstate from

Worth mentioning that omitting block devices that may have changed since
the save is probably a bad idea?

> +#
> +# Applications should not assume that the snapshot load is complete
> +# when this command returns. Completion is indicated by the job
> +# status. Clients can wait for the JOB_STATUS_CHANGE event. If the
> +# job aborts, errors can be obtained via the 'query-jobs' command,
> +# though. Note that at this time most vmstate procssing errors only
> +# get printed to stderr. This limitation will be fixed at a future
> +# date.

Comments on snapshot-load apply.

> +#
> +# If @devices is not specified, or is an empty list, then the
> +# historical default logic for picking devices will be used.

Why is this useful for QMP?

> +#
> +# If @vmstate is not specified, then the first valid block
> +# device will be used for vmstate.

Why is this useful for QMP?

A more useful default could be "if exactly one the block devices being
restored contains a vmstate, use that".

> +#
> +# Returns: nothing
> +#
> +# Example:
> +#
> +# -> { "execute": "snapshot-load",
> +#      "data": {
> +#         "job-id": "snapload0",
> +#         "tag": "my-snap",
> +#         "vmstate": "disk0",
> +#         "devices": ["disk0", "disk1"]
> +#      }
> +#    }
> +# <- { "return": { } }
> +#
> +# Since: 5.2
> +##
> +{ 'command': 'snapshot-load',
> +  'data': { 'job-id': 'str',
> +            'tag': 'str',
> +            '*vmstate': 'str',
> +            '*devices': ['str'] } }
> +
> +##
> +# @snapshot-delete:
> +#
> +# Delete a VM snapshot
> +#
> +# @job-id: identifier for the newly created job
> +# @tag: name of the snapshot to delete.
> +# @devices: list of block device node names to delete a snapshot from
> +#
> +# Applications should not assume that the snapshot load is complete
> +# when this command returns. Completion is indicated by the job
> +# status. Clients can wait for the JOB_STATUS_CHANGE event.

Comments on snapshot-load apply.

One difference: no "If the job aborts, ..."  Intentional?

> +#
> +# Note that the VM CPUs will be paused during the time it takes to
> +# delete the snapshot
> +#
> +# If @devices is not specified, or is an empty list, then the
> +# historical default logic for picking devices will be used.

Why is this useful for QMP?

> +#
> +# Returns: nothing
> +#
> +# Example:
> +#
> +# -> { "execute": "snapshot-delete",
> +#      "data": {
> +#         "job-id": "snapdelete0",
> +#         "tag": "my-snap",
> +#         "devices": ["disk0", "disk1"]
> +#      }
> +#    }
> +# <- { "return": { } }
> +#
> +# Since: 5.2
> +##
> +{ 'command': 'snapshot-delete',
> +  'data': { 'job-id': 'str',
> +            'tag': 'str',
> +            '*devices': ['str'] } }
[...]



  reply	other threads:[~2020-09-01 14:44 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-27 11:15 [PATCH v3 0/7] migration: bring improved savevm/loadvm/delvm to QMP Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 1/7] migration: improve error reporting of block driver state name Daniel P. Berrangé
2020-08-27 17:17   ` Dr. David Alan Gilbert
2020-08-27 11:16 ` [PATCH v3 2/7] block: push error reporting into bdrv_all_*_snapshot functions Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 3/7] migration: stop returning errno from load_snapshot() Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 4/7] block: add ability to specify list of blockdevs during snapshot Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 5/7] block: allow specifying name of block device for vmstate storage Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 6/7] iotests: add support for capturing and matching QMP events Daniel P. Berrangé
2020-08-27 11:16 ` [PATCH v3 7/7] migration: introduce snapshot-{save, load, delete} QMP commands Daniel P. Berrangé
2020-09-01 14:20   ` Markus Armbruster [this message]
2020-09-01 16:47     ` Daniel P. Berrangé
2020-09-02  9:27       ` Markus Armbruster
2020-09-02 11:05         ` Daniel P. Berrangé
2020-09-03  9:48           ` Markus Armbruster
2020-09-03 10:17             ` Kevin Wolf
2020-09-03 10:21               ` Daniel P. Berrangé
2020-09-03 10:44                 ` Markus Armbruster
2020-09-11 11:52 ` [PATCH v3 0/7] migration: bring improved savevm/loadvm/delvm to QMP Dr. David Alan Gilbert
2020-09-11 16:45   ` Daniel P. Berrangé

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87d035tw74.fsf@dusky.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=den@virtuozzo.com \
    --cc=dgilbert@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pavel.dovgaluk@ispras.ru \
    --cc=pbonzini@redhat.com \
    --cc=pkrempa@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.