From: Anthony Liguori <anthony@codemonkey.ws>
To: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Jes.Sorensen@redhat.com, qemu-devel@nongnu.org, avi@redhat.com
Subject: Re: [Qemu-devel] [patch 2/3] Add support for live block copy
Date: Wed, 23 Feb 2011 13:06:46 -0600 [thread overview]
Message-ID: <4D655AC6.3090503@codemonkey.ws> (raw)
In-Reply-To: <20110222170115.710717278@redhat.com>
On 02/22/2011 11:00 AM, Marcelo Tosatti wrote:
> Index: qemu/qerror.h
> ===================================================================
> --- qemu.orig/qerror.h
> +++ qemu/qerror.h
> @@ -171,4 +171,13 @@ QError *qobject_to_qerror(const QObject
> #define QERR_VNC_SERVER_FAILED \
> "{ 'class': 'VNCServerFailed', 'data': { 'target': %s } }"
>
> +#define QERR_BLOCKCOPY_IN_PROGRESS \
> + "{ 'class': 'BlockCopyInProgress', 'data': { 'device': %s } }"
>
The caller already knows the device name by virtue of issuing the
command so this is redundant.
I think a better approach would be a QERR_IN_PROGRESS 'data': {
'operation': %s }
For block copy, we'd say QERR_IN_PROGRESS("block copy").
> +
> +#define QERR_BLOCKCOPY_IMAGE_SIZE_DIFFERS \
> + "{ 'class': 'BlockCopyImageSizeDiffers', 'data': {} }"
> +
> +#define QERR_MIGRATION_IN_PROGRESS \
> + "{ 'class': 'MigrationInProgress', 'data': {} }"
>
Then QERR_IN_PROGRESS("live migration")
> #endif /* QERROR_H */
> Index: qemu/qmp-commands.hx
> ===================================================================
> --- qemu.orig/qmp-commands.hx
> +++ qemu/qmp-commands.hx
> @@ -581,6 +581,75 @@ Example:
> EQMP
>
> {
> + .name = "block_copy",
> + .args_type = "device:s,filename:s,commit_filename:s?,inc:-i",
> + .params = "device filename [commit_filename] [-i]",
> + .help = "live block copy device to image"
> + "\n\t\t\t optional commit filename "
> + "\n\t\t\t -i for incremental copy "
> + "(base image shared between src and destination)",
> + .user_print = monitor_user_noop,
> + .mhandler.cmd_new = do_bdrv_copy,
> + },
> +
> +SQMP
> +block-copy
> +-------
> +
> +Live block copy.
>
I'm not sure copy really describes what we're doing here. Maybe
migrate-block?
> +Arguments:
> +
> +- "device": device name (json-string)
> +- "filename": target image filename (json-string)
>
Is this a created image? Is this an image to create?
To future proof for blockdev, we should make this argument optional and
if it's not specified throw an error about missing argument. This let's
us introduce an optional blockdev argument such that we can use a
blockdev name.
> +- "commit_filename": target commit filename (json-string, optional)
>
I think we should drop this.
> +- "inc": incremental disk copy (json-bool, optional)
>
Let's use the full name (incremental) and we need to describe in detail
what the semantics of this are. Will it scan the target block device to
identify identical blocks?
> +Example:
> +
> +-> { "execute": "block_copy",
> + "arguments": { "device": "ide0-hd1",
> + "filename": "/mnt/new-disk.img",
> + "commit_filename: "/mnt/commit-new-disk.img"
> + } }
> +
> +<- { "return": {} }
> +
> +Notes:
> +
> +(1) The 'query-block-copy' command should be used to check block copy progress
> + and final result (this information is provided by the 'status' member)
> +(2) Boolean argument "inc" defaults to false
>
We should also document error semantics. What errors are expected and why?
> +EQMP
> +
> + {
> + .name = "block_copy_cancel",
> + .args_type = "device:s",
> + .params = "device",
> + .help = "cancel live block copy",
> + .user_print = monitor_user_noop,
> + .mhandler.cmd_new = do_bdrv_copy_cancel,
> + },
> +
> +SQMP
> +block_copy_cancel
> +--------------
> +
> +Cancel live block copy.
> +
> +Arguments:
> +
> +- device: device name (json-string)
> +
> +Example:
> +
> +-> { "execute": "block_copy_cancel", "arguments": { "device": "ide0-hd1" } }
> +<- { "return": {} }
>
cancel-block-migration?
What happens if:
- No block copy is active anymore (it's completed)
- A block copy was never started
- device refers to a device that no longer exists
- device refers to a device with no media present
If this command succeeds, what the state of target? If I resume the
operation with the incremental flag set, will it Just Work?
> +
> +EQMP
> +
> + {
> .name = "netdev_add",
> .args_type = "netdev:O",
> .params = "[user|tap|socket],id=str[,prop=value][,...]",
> @@ -1740,6 +1809,44 @@ Examples:
> EQMP
>
> SQMP
> +query-block-copy
> +-------------
> +
> +Live block copy status.
> +
> +Each block copy instance information is stored in a json-object and the returned
> +value is a json-array of all instances.
> +
> +Each json-object contains the following:
> +
> +- "device": device name (json-string)
> +- "status": block copy status (json-string)
> + - Possible values: "active", "failed", "completed"
> +- "info": A json-object with the statistics information, if status is "active":
> + - "percentage": percentage completed (json-int)
>
So let's fold this into query-block
And let's also report the statistics as MigrationStats which is the format:
{ 'MigrationStats': {'transferred': 'int', 'remaining': 'int', 'total':
'int' } }
So I'd propose changing:
{ 'BlockDeviceStats': {'rd_bytes': 'int', 'wr_bytes': 'int',
'rd_operations': 'int', 'wr_operations': 'int',
'wr_highest_offset': 'int' } }
{ 'BlockStats': {'*device': 'str', 'stats': 'BlockDeviceStats',
'*parent': 'BlockStats'} }
[ 'query-blockstats', {}, {}, ['BlockStats'] ]
To:
{ 'BlockMigrationStatus': [ 'active', 'inactive', 'cancelled' ] }
{ 'BlockMigrationInfo': {'status': 'BlockMigrationStatus', 'stats':
'BlockMigrationStats', '*target_filename': 'str' } }
{ 'BlockDeviceStats': {'rd_bytes': 'int', 'wr_bytes': 'int',
'rd_operations': 'int', 'wr_operations': 'int',
'wr_highest_offset': 'int', '*migration':
'BlockMigrationInfo' } }
{ 'BlockStats': {'*device': 'str', 'stats': 'BlockDeviceStats',
'*parent': 'BlockStats'} }
[ 'query-blockstats', {}, {}, ['BlockStats'] ]
Regards,
Anthony Liguori
> +
> +Example:
> +
> +Block copy for "ide1-hd0" active and block copy for "ide1-hd1" failed:
> +
> +-> { "execute": "query-block-copy" }
> +<- {
> + "return":[
> + {"device":"ide1-hd0",
> + "status":"active",
> + "info":{
> + "percentage":23,
> + }
> + },
> + {"device":"ide1-hd1",
> + "status":"failed"
> + }
> + ]
> + }
> +
> +EQMP
> +
> +SQMP
> query-balloon
> -------------
>
> Index: qemu/Makefile.objs
> ===================================================================
> --- qemu.orig/Makefile.objs
> +++ qemu/Makefile.objs
> @@ -98,7 +98,7 @@ common-obj-y += buffered_file.o migratio
> common-obj-y += qemu-char.o savevm.o #aio.o
> common-obj-y += msmouse.o ps2.o
> common-obj-y += qdev.o qdev-properties.o
> -common-obj-y += block-migration.o
> +common-obj-y += block-migration.o block-copy.o
> common-obj-y += pflib.o
>
> common-obj-$(CONFIG_BRLAPI) += baum.o
> Index: qemu/sysemu.h
> ===================================================================
> --- qemu.orig/sysemu.h
> +++ qemu/sysemu.h
> @@ -46,6 +46,7 @@ void qemu_del_vm_change_state_handler(VM
> #define VMSTOP_SAVEVM 6
> #define VMSTOP_LOADVM 7
> #define VMSTOP_MIGRATE 8
> +#define VMSTOP_BLOCKCOPY 9
>
> void vm_start(void);
> void vm_stop(int reason);
>
>
>
next prev parent reply other threads:[~2011-02-23 19:07 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-22 17:00 [Qemu-devel] [patch 0/3] live block copy (v2) Marcelo Tosatti
2011-02-22 17:00 ` [Qemu-devel] [patch 1/3] add migration_active function Marcelo Tosatti
2011-02-22 17:00 ` [Qemu-devel] [patch 2/3] Add support for live block copy Marcelo Tosatti
2011-02-22 20:50 ` [Qemu-devel] " Anthony Liguori
2011-02-22 21:07 ` Marcelo Tosatti
2011-02-22 21:11 ` Anthony Liguori
2011-02-22 23:09 ` Marcelo Tosatti
2011-02-22 23:14 ` Anthony Liguori
2011-02-23 13:01 ` Avi Kivity
2011-02-23 14:35 ` Anthony Liguori
2011-02-23 15:31 ` Avi Kivity
2011-02-23 16:01 ` Anthony Liguori
2011-02-23 16:14 ` Avi Kivity
2011-02-23 16:28 ` Anthony Liguori
2011-02-23 17:18 ` Avi Kivity
2011-02-23 20:18 ` Anthony Liguori
2011-02-23 20:44 ` Marcelo Tosatti
2011-02-23 21:41 ` Anthony Liguori
2011-02-24 14:39 ` Marcelo Tosatti
2011-02-24 7:37 ` Markus Armbruster
2011-02-24 8:54 ` Avi Kivity
2011-02-24 15:00 ` Anthony Liguori
2011-02-24 15:22 ` Avi Kivity
2011-02-24 17:58 ` Anthony Liguori
2011-02-27 9:10 ` Avi Kivity
2011-02-27 9:55 ` Dor Laor
2011-02-27 13:49 ` Anthony Liguori
2011-02-27 16:02 ` Dor Laor
2011-02-27 17:25 ` Anthony Liguori
2011-02-28 8:58 ` Dor Laor
2011-02-27 14:00 ` Anthony Liguori
2011-02-27 15:31 ` Avi Kivity
2011-02-27 17:41 ` Anthony Liguori
2011-02-28 8:38 ` Avi Kivity
2011-02-28 12:45 ` Anthony Liguori
2011-02-28 13:21 ` Avi Kivity
2011-02-28 17:33 ` Anthony Liguori
2011-02-28 17:47 ` Avi Kivity
2011-02-28 18:12 ` Anthony Liguori
[not found] ` <4D6CB556.5060401@redhat.c! om>
[not found] ` <4D6CBECF.8090805@redhat.c! om>
2011-03-01 8:59 ` Dor Laor
2011-03-02 12:39 ` Anthony Liguori
2011-03-02 13:00 ` Avi Kivity
2011-03-02 15:07 ` Anthony Liguori
2011-03-01 9:39 ` Avi Kivity
2011-03-01 15:51 ` Anthony Liguori
2011-03-01 22:27 ` Dor Laor
2011-03-02 16:30 ` Avi Kivity
2011-03-02 21:55 ` Anthony Liguori
2011-02-28 18:56 ` Marcelo Tosatti
2011-03-01 9:45 ` Avi Kivity
2011-02-23 16:17 ` Peter Maydell
2011-02-23 16:30 ` Anthony Liguori
2011-02-24 5:41 ` [Qemu-devel] Unsubsribing James Brown
2011-02-24 10:00 ` Stefan Hajnoczi
2011-02-23 17:26 ` [Qemu-devel] Re: [patch 2/3] Add support for live block copy Markus Armbruster
2011-02-23 20:06 ` Anthony Liguori
2011-02-24 12:15 ` Markus Armbruster
2011-02-25 7:16 ` Stefan Hajnoczi
2011-02-23 17:49 ` Marcelo Tosatti
2011-02-24 8:58 ` Avi Kivity
2011-02-24 15:14 ` Marcelo Tosatti
2011-02-24 15:28 ` Avi Kivity
2011-02-24 16:39 ` Marcelo Tosatti
2011-02-24 17:32 ` Avi Kivity
2011-02-24 17:45 ` Anthony Liguori
2011-02-27 9:22 ` Avi Kivity
2011-02-23 12:46 ` Avi Kivity
2011-02-22 20:50 ` Anthony Liguori
2011-02-22 21:16 ` [Qemu-devel] " Anthony Liguori
2011-02-23 19:06 ` Anthony Liguori [this message]
2011-02-26 0:02 ` Marcelo Tosatti
2011-02-26 13:45 ` Anthony Liguori
2011-02-28 19:09 ` Marcelo Tosatti
2011-03-01 2:35 ` Marcelo Tosatti
2011-02-26 15:32 ` Anthony Liguori
2011-02-22 17:00 ` [Qemu-devel] [patch 3/3] do not allow migration if block copy in progress Marcelo Tosatti
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=4D655AC6.3090503@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=Jes.Sorensen@redhat.com \
--cc=avi@redhat.com \
--cc=mtosatti@redhat.com \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).