[PATCH v2 01/11] migration: support file: uri for source migration

Nikolay Borisov posted 11 patches 3 years, 4 months ago
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, Peter Xu <peterx@redhat.com>, David Hildenbrand <david@redhat.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, "Daniel P. Berrangé" <berrange@redhat.com>, Juan Quintela <quintela@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>, Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>, John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>
[PATCH v2 01/11] migration: support file: uri for source migration
Posted by Nikolay Borisov 3 years, 4 months ago
Implement support for a "file:" uri so that a migration can be initiated
directly to a file from QEMU.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
---
 migration/file.c      | 23 +++++++++++++++++++++++
 migration/file.h      |  9 +++++++++
 migration/meson.build |  1 +
 migration/migration.c |  3 +++
 4 files changed, 36 insertions(+)
 create mode 100644 migration/file.c
 create mode 100644 migration/file.h

diff --git a/migration/file.c b/migration/file.c
new file mode 100644
index 000000000000..02896a7cab99
--- /dev/null
+++ b/migration/file.c
@@ -0,0 +1,23 @@
+#include "qemu/osdep.h"
+#include "channel.h"
+#include "io/channel-file.h"
+#include "file.h"
+#include "qemu/error-report.h"
+
+
+void file_start_outgoing_migration(MigrationState *s, const char *fname, Error **errp)
+{
+	QIOChannelFile *ioc;
+
+	ioc = qio_channel_file_new_path(fname, O_CREAT|O_TRUNC|O_WRONLY, 0660, errp);
+	if (!ioc) {
+		error_report("Error creating a channel");
+		return;
+	}
+
+	qio_channel_set_name(QIO_CHANNEL(ioc), "migration-file-outgoing");
+	migration_channel_connect(s, QIO_CHANNEL(ioc), NULL, NULL);
+	object_unref(OBJECT(ioc));
+}
+
+
diff --git a/migration/file.h b/migration/file.h
new file mode 100644
index 000000000000..d476eb1157f9
--- /dev/null
+++ b/migration/file.h
@@ -0,0 +1,9 @@
+#ifndef QEMU_MIGRATION_FILE_H
+#define QEMU_MIGRATION_FILE_H
+
+void file_start_outgoing_migration(MigrationState *s,
+                                   const char *filename,
+                                   Error **errp);
+
+#endif
+
diff --git a/migration/meson.build b/migration/meson.build
index 690487cf1a81..30a8392701c3 100644
--- a/migration/meson.build
+++ b/migration/meson.build
@@ -17,6 +17,7 @@ softmmu_ss.add(files(
   'colo.c',
   'exec.c',
   'fd.c',
+  'file.c',
   'global_state.c',
   'migration.c',
   'multifd.c',
diff --git a/migration/migration.c b/migration/migration.c
index bb8bbddfe467..8813b78b9a6b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -20,6 +20,7 @@
 #include "migration/blocker.h"
 #include "exec.h"
 #include "fd.h"
+#include "file.h"
 #include "socket.h"
 #include "sysemu/runstate.h"
 #include "sysemu/sysemu.h"
@@ -2414,6 +2415,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
         exec_start_outgoing_migration(s, p, &local_err);
     } else if (strstart(uri, "fd:", &p)) {
         fd_start_outgoing_migration(s, p, &local_err);
+    } else if (strstart(uri, "file:", &p)) {
+	file_start_outgoing_migration(s, p, &local_err);
     } else {
         if (!(has_resume && resume)) {
             yank_unregister_instance(MIGRATION_YANK_INSTANCE);
-- 
2.34.1
Re: [PATCH v2 01/11] migration: support file: uri for source migration
Posted by Daniel P. Berrangé 3 years, 3 months ago
On Mon, Oct 10, 2022 at 04:33:58PM +0300, Nikolay Borisov wrote:
> Implement support for a "file:" uri so that a migration can be initiated
> directly to a file from QEMU.

Can we add a reminder here

  Unlike other migration protocol backends, the 'file' protocol cannot
  honour non-blocking mode. POSIX file/block storage will always report
  ready to read/write, regardless of how slow the underlying storage
  will be at servicing the request.

  For outgoing migration this limitation is not a serious problem as
  the migration data transfer always happens in a dedicated thread.
  It may, however, result in delays in honouring a request to cancel
  the migration operation.

> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
>  migration/file.c      | 23 +++++++++++++++++++++++
>  migration/file.h      |  9 +++++++++
>  migration/meson.build |  1 +
>  migration/migration.c |  3 +++
>  4 files changed, 36 insertions(+)
>  create mode 100644 migration/file.c
>  create mode 100644 migration/file.h
> 
> diff --git a/migration/file.c b/migration/file.c
> new file mode 100644
> index 000000000000..02896a7cab99
> --- /dev/null
> +++ b/migration/file.c
> @@ -0,0 +1,23 @@
> +#include "qemu/osdep.h"
> +#include "channel.h"
> +#include "io/channel-file.h"
> +#include "file.h"
> +#include "qemu/error-report.h"
> +
> +
> +void file_start_outgoing_migration(MigrationState *s, const char *fname, Error **errp)
> +{
> +	QIOChannelFile *ioc;
> +
> +	ioc = qio_channel_file_new_path(fname, O_CREAT|O_TRUNC|O_WRONLY, 0660, errp);
> +	if (!ioc) {
> +		error_report("Error creating a channel");
> +		return;
> +	}
> +
> +	qio_channel_set_name(QIO_CHANNEL(ioc), "migration-file-outgoing");
> +	migration_channel_connect(s, QIO_CHANNEL(ioc), NULL, NULL);
> +	object_unref(OBJECT(ioc));
> +}
> +
> +
> diff --git a/migration/file.h b/migration/file.h
> new file mode 100644
> index 000000000000..d476eb1157f9
> --- /dev/null
> +++ b/migration/file.h
> @@ -0,0 +1,9 @@
> +#ifndef QEMU_MIGRATION_FILE_H
> +#define QEMU_MIGRATION_FILE_H
> +
> +void file_start_outgoing_migration(MigrationState *s,
> +                                   const char *filename,
> +                                   Error **errp);
> +
> +#endif
> +
> diff --git a/migration/meson.build b/migration/meson.build
> index 690487cf1a81..30a8392701c3 100644
> --- a/migration/meson.build
> +++ b/migration/meson.build
> @@ -17,6 +17,7 @@ softmmu_ss.add(files(
>    'colo.c',
>    'exec.c',
>    'fd.c',
> +  'file.c',
>    'global_state.c',
>    'migration.c',
>    'multifd.c',
> diff --git a/migration/migration.c b/migration/migration.c
> index bb8bbddfe467..8813b78b9a6b 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -20,6 +20,7 @@
>  #include "migration/blocker.h"
>  #include "exec.h"
>  #include "fd.h"
> +#include "file.h"
>  #include "socket.h"
>  #include "sysemu/runstate.h"
>  #include "sysemu/sysemu.h"
> @@ -2414,6 +2415,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
>          exec_start_outgoing_migration(s, p, &local_err);
>      } else if (strstart(uri, "fd:", &p)) {
>          fd_start_outgoing_migration(s, p, &local_err);
> +    } else if (strstart(uri, "file:", &p)) {
> +	file_start_outgoing_migration(s, p, &local_err);
>      } else {
>          if (!(has_resume && resume)) {
>              yank_unregister_instance(MIGRATION_YANK_INSTANCE);
> -- 
> 2.34.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
Re: [PATCH v2 01/11] migration: support file: uri for source migration
Posted by Nikolay Borisov 3 years, 3 months ago

On 18.10.22 г. 12:10 ч., Daniel P. Berrangé wrote:
> On Mon, Oct 10, 2022 at 04:33:58PM +0300, Nikolay Borisov wrote:
>> Implement support for a "file:" uri so that a migration can be initiated
>> directly to a file from QEMU.
> 
> Can we add a reminder here
> 
>    Unlike other migration protocol backends, the 'file' protocol cannot
>    honour non-blocking mode. POSIX file/block storage will always report
>    ready to read/write, regardless of how slow the underlying storage
>    will be at servicing the request.
> 
>    For outgoing migration this limitation is not a serious problem as
>    the migration data transfer always happens in a dedicated thread.
>    It may, however, result in delays in honouring a request to cancel
>    the migration operation.

Sure, I assume the same text should be added to the incoming migration 
patch as well and emphasize that it could be more problematic there?

In any case I'd wait to gather more feedback before sending v3

> 
>>
>> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
>> ---
>>   migration/file.c      | 23 +++++++++++++++++++++++
>>   migration/file.h      |  9 +++++++++
>>   migration/meson.build |  1 +
>>   migration/migration.c |  3 +++
>>   4 files changed, 36 insertions(+)
>>   create mode 100644 migration/file.c
>>   create mode 100644 migration/file.h
>>
>> diff --git a/migration/file.c b/migration/file.c
>> new file mode 100644
>> index 000000000000..02896a7cab99
>> --- /dev/null
>> +++ b/migration/file.c
>> @@ -0,0 +1,23 @@
>> +#include "qemu/osdep.h"
>> +#include "channel.h"
>> +#include "io/channel-file.h"
>> +#include "file.h"
>> +#include "qemu/error-report.h"
>> +
>> +
>> +void file_start_outgoing_migration(MigrationState *s, const char *fname, Error **errp)
>> +{
>> +	QIOChannelFile *ioc;
>> +
>> +	ioc = qio_channel_file_new_path(fname, O_CREAT|O_TRUNC|O_WRONLY, 0660, errp);
>> +	if (!ioc) {
>> +		error_report("Error creating a channel");
>> +		return;
>> +	}
>> +
>> +	qio_channel_set_name(QIO_CHANNEL(ioc), "migration-file-outgoing");
>> +	migration_channel_connect(s, QIO_CHANNEL(ioc), NULL, NULL);
>> +	object_unref(OBJECT(ioc));
>> +}
>> +
>> +
>> diff --git a/migration/file.h b/migration/file.h
>> new file mode 100644
>> index 000000000000..d476eb1157f9
>> --- /dev/null
>> +++ b/migration/file.h
>> @@ -0,0 +1,9 @@
>> +#ifndef QEMU_MIGRATION_FILE_H
>> +#define QEMU_MIGRATION_FILE_H
>> +
>> +void file_start_outgoing_migration(MigrationState *s,
>> +                                   const char *filename,
>> +                                   Error **errp);
>> +
>> +#endif
>> +
>> diff --git a/migration/meson.build b/migration/meson.build
>> index 690487cf1a81..30a8392701c3 100644
>> --- a/migration/meson.build
>> +++ b/migration/meson.build
>> @@ -17,6 +17,7 @@ softmmu_ss.add(files(
>>     'colo.c',
>>     'exec.c',
>>     'fd.c',
>> +  'file.c',
>>     'global_state.c',
>>     'migration.c',
>>     'multifd.c',
>> diff --git a/migration/migration.c b/migration/migration.c
>> index bb8bbddfe467..8813b78b9a6b 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -20,6 +20,7 @@
>>   #include "migration/blocker.h"
>>   #include "exec.h"
>>   #include "fd.h"
>> +#include "file.h"
>>   #include "socket.h"
>>   #include "sysemu/runstate.h"
>>   #include "sysemu/sysemu.h"
>> @@ -2414,6 +2415,8 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
>>           exec_start_outgoing_migration(s, p, &local_err);
>>       } else if (strstart(uri, "fd:", &p)) {
>>           fd_start_outgoing_migration(s, p, &local_err);
>> +    } else if (strstart(uri, "file:", &p)) {
>> +	file_start_outgoing_migration(s, p, &local_err);
>>       } else {
>>           if (!(has_resume && resume)) {
>>               yank_unregister_instance(MIGRATION_YANK_INSTANCE);
>> -- 
>> 2.34.1
>>
> 
> With regards,
> Daniel

Re: [PATCH v2 01/11] migration: support file: uri for source migration
Posted by Daniel P. Berrangé 3 years, 3 months ago
On Mon, Oct 10, 2022 at 04:33:58PM +0300, Nikolay Borisov wrote:
> Implement support for a "file:" uri so that a migration can be initiated
> directly to a file from QEMU.
> 
> Signed-off-by: Nikolay Borisov <nborisov@suse.com>
> ---
>  migration/file.c      | 23 +++++++++++++++++++++++
>  migration/file.h      |  9 +++++++++
>  migration/meson.build |  1 +
>  migration/migration.c |  3 +++
>  4 files changed, 36 insertions(+)
>  create mode 100644 migration/file.c
>  create mode 100644 migration/file.h

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|