From: "Daniel P. Berrange" <berrange@redhat.com>
To: "Benoît Canet" <benoit.canet@gmail.com>
Cc: aliguori@us.ibm.com, qemu-devel@nongnu.org,
"Benoît Canet" <benoit@irqsave.net>
Subject: Re: [Qemu-devel] [PATCH 1/2] migration: Allow the migrate command to work on file: urls
Date: Thu, 23 Aug 2012 13:34:01 +0100 [thread overview]
Message-ID: <20120823123401.GD10833@redhat.com> (raw)
In-Reply-To: <1345724888-30204-2-git-send-email-benoit@irqsave.net>
On Thu, Aug 23, 2012 at 02:28:07PM +0200, Benoît Canet wrote:
> Usage:
> (qemu) migrate file:/path/to/vm_statefile
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> migration-fd.c | 4 ++--
> migration.c | 20 +++++++++++++++++++-
> migration.h | 2 +-
> 3 files changed, 22 insertions(+), 4 deletions(-)
>
> diff --git a/migration-fd.c b/migration-fd.c
> index 50138ed..d39e44a 100644
> --- a/migration-fd.c
> +++ b/migration-fd.c
> @@ -73,9 +73,9 @@ static int fd_close(MigrationState *s)
> return 0;
> }
>
> -int fd_start_outgoing_migration(MigrationState *s, const char *fdname)
> +int fd_start_outgoing_migration(MigrationState *s, const char *fdname, int fd)
> {
> - s->fd = monitor_get_fd(cur_mon, fdname);
> + s->fd = fd ? fd : monitor_get_fd(cur_mon, fdname);
> if (s->fd == -1) {
> DPRINTF("fd_migration: invalid file descriptor identifier\n");
> goto err_after_get_fd;
> diff --git a/migration.c b/migration.c
> index 1edeec5..679847d 100644
> --- a/migration.c
> +++ b/migration.c
> @@ -239,9 +239,14 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
> static int migrate_fd_cleanup(MigrationState *s)
> {
> int ret = 0;
> + struct stat st;
>
> qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
>
> + if (!fstat(s->fd, &st) && S_ISREG(st.st_mode)) {
> + fsync(s->fd);
> + }
> +
> if (s->file) {
> DPRINTF("closing file\n");
> ret = qemu_fclose(s->file);
> @@ -475,6 +480,17 @@ void migrate_del_blocker(Error *reason)
> migration_blockers = g_slist_remove(migration_blockers, reason);
> }
>
> +static int file_start_outgoing_migration(MigrationState *s,
> + const char *filename)
> +{
> + int fd;
> + fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR);
> + if (fd < 0) {
> + return -errno;
> + }
> + return fd_start_outgoing_migration(s, NULL, fd);
'fd_start_outgoing_migration' requires that the FD you give it
supports non-blocking I/O. File descriptors opened from plain
files or block devices do not honour that requirement. So this
proposed code will cause the entire QEMU process to block while
migration is taking place. This is why no on has ever implemented
the 'file:' protocol in QEMU before.
To deal with this issue you'd either have to use the POSIX
async I/O APIs (or QEMU's internal equivalent), or spawn a
separate 'dd' helper process and give QEMU a pipe FD instead.
The latter is what libvirt does to implement migrate to file.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
next prev parent reply other threads:[~2012-08-23 12:34 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-23 12:28 [Qemu-devel] [PATCH 0/2] Add file url support to migration Benoît Canet
2012-08-23 12:28 ` [Qemu-devel] [PATCH 1/2] migration: Allow the migrate command to work on file: urls Benoît Canet
2012-08-23 12:34 ` Daniel P. Berrange [this message]
2012-08-23 12:48 ` Benoît Canet
2012-08-23 12:58 ` Daniel P. Berrange
2012-08-23 13:34 ` Benoît Canet
2012-08-27 7:36 ` Benoît Canet
2012-08-28 13:11 ` Luiz Capitulino
2012-08-23 12:28 ` [Qemu-devel] [PATCH 2/2] migration: Allow -incoming " Benoît Canet
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=20120823123401.GD10833@redhat.com \
--to=berrange@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=benoit.canet@gmail.com \
--cc=benoit@irqsave.net \
--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).