diff mbox

[11/11] migration: Add migration events on target side

Message ID 1434505833-11234-12-git-send-email-quintela@redhat.com
State New
Headers show

Commit Message

Juan Quintela June 17, 2015, 1:50 a.m. UTC
We reuse the migration events from the source side, sending them on the
appropiate place.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 migration/migration.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Dr. David Alan Gilbert June 18, 2015, 10:53 a.m. UTC | #1
* Juan Quintela (quintela@redhat.com) wrote:
> We reuse the migration events from the source side, sending them on the
> appropiate place.
> 
> Signed-off-by: Juan Quintela <quintela@redhat.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> ---
>  migration/migration.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/migration/migration.c b/migration/migration.c
> index 3637d36..2b4fd55 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -218,6 +218,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp)
>  {
>      const char *p;
> 
> +    qapi_event_send_migration(MIGRATION_STATUS_SETUP, &error_abort);

Try and avoid error_abort - you don't want to trigger an assert (and associated
core etc) if it's just something like the monitor disconnecting.
(And anyway in this case you have an errp).

Dave

>      if (!strcmp(uri, "defer")) {
>          deferred_incoming_migration(errp);
>      } else if (strstart(uri, "tcp:", &p)) {
> @@ -246,7 +247,7 @@ static void process_incoming_migration_co(void *opaque)
>      int ret;
> 
>      migration_incoming_state_new(f);
> -
> +    qapi_event_send_migration(MIGRATION_STATUS_ACTIVE, &error_abort);
>      ret = qemu_loadvm_state(f);
> 
>      qemu_fclose(f);
> @@ -254,10 +255,12 @@ static void process_incoming_migration_co(void *opaque)
>      migration_incoming_state_destroy();
> 
>      if (ret < 0) {
> +        qapi_event_send_migration(MIGRATION_STATUS_FAILED, &error_abort);
>          error_report("load of migration failed: %s", strerror(-ret));
>          migrate_decompress_threads_join();
>          exit(EXIT_FAILURE);
>      }
> +    qapi_event_send_migration(MIGRATION_STATUS_COMPLETED, &error_abort);
>      qemu_announce_self();
> 
>      /* Make sure all file formats flush their mutable metadata */
> -- 
> 2.4.3
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Eric Blake June 18, 2015, 12:19 p.m. UTC | #2
On 06/18/2015 04:53 AM, Dr. David Alan Gilbert wrote:
> * Juan Quintela (quintela@redhat.com) wrote:
>> We reuse the migration events from the source side, sending them on the
>> appropiate place.

s/appropiate/appropriate/

>>
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
>> ---
>>  migration/migration.c | 5 ++++-
>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/migration/migration.c b/migration/migration.c
>> index 3637d36..2b4fd55 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -218,6 +218,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp)
>>  {
>>      const char *p;
>>
>> +    qapi_event_send_migration(MIGRATION_STATUS_SETUP, &error_abort);
> 
> Try and avoid error_abort - you don't want to trigger an assert (and associated
> core etc) if it's just something like the monitor disconnecting.
> (And anyway in this case you have an errp).

But this use is fine, matching the idiom of ALL OTHER qapi_event_send_*
calls.  (Arguably, if sending an event can never fail, then maybe we
shouldn't have made it a parameter; OOM failures already abort, and if
the only other possible failure is malformed json but the whole point of
a generated code guarantees that we cannot hit that bug, or if the only
failure is a disconnected monitor but you can't report the error because
you have no monitor left, then being able to catch an error doesn't help).
Dr. David Alan Gilbert June 18, 2015, 12:51 p.m. UTC | #3
* Eric Blake (eblake@redhat.com) wrote:
> On 06/18/2015 04:53 AM, Dr. David Alan Gilbert wrote:
> > * Juan Quintela (quintela@redhat.com) wrote:
> >> We reuse the migration events from the source side, sending them on the
> >> appropiate place.
> 
> s/appropiate/appropriate/
> 
> >>
> >> Signed-off-by: Juan Quintela <quintela@redhat.com>
> >> Reviewed-by: Eric Blake <eblake@redhat.com>
> >> ---
> >>  migration/migration.c | 5 ++++-
> >>  1 file changed, 4 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/migration/migration.c b/migration/migration.c
> >> index 3637d36..2b4fd55 100644
> >> --- a/migration/migration.c
> >> +++ b/migration/migration.c
> >> @@ -218,6 +218,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp)
> >>  {
> >>      const char *p;
> >>
> >> +    qapi_event_send_migration(MIGRATION_STATUS_SETUP, &error_abort);
> > 
> > Try and avoid error_abort - you don't want to trigger an assert (and associated
> > core etc) if it's just something like the monitor disconnecting.
> > (And anyway in this case you have an errp).
> 
> But this use is fine, matching the idiom of ALL OTHER qapi_event_send_*
> calls.  (Arguably, if sending an event can never fail, then maybe we
> shouldn't have made it a parameter; OOM failures already abort, and if
> the only other possible failure is malformed json but the whole point of
> a generated code guarantees that we cannot hit that bug, or if the only
> failure is a disconnected monitor but you can't report the error because
> you have no monitor left, then being able to catch an error doesn't help).

I think you're right the current stuff hung off qapi_event_send_migration never
uses the error pointer.  Still, it would be nice to try and avoid error_abort
where possible; you can see some implementation of an event sender deciding
to throw an error if it can't write to whatever event log it's got, and then
you don't want to cause an assert() - you might want an error printed and an 
exit, but you dont want an assert.

Anyway, since as you say, since all callers are equally broken, and this
was my only issue with this patch:

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

Dave

> 
> -- 
> Eric Blake   eblake redhat com    +1-919-301-3266
> Libvirt virtualization library http://libvirt.org
> 


--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff mbox

Patch

diff --git a/migration/migration.c b/migration/migration.c
index 3637d36..2b4fd55 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -218,6 +218,7 @@  void qemu_start_incoming_migration(const char *uri, Error **errp)
 {
     const char *p;

+    qapi_event_send_migration(MIGRATION_STATUS_SETUP, &error_abort);
     if (!strcmp(uri, "defer")) {
         deferred_incoming_migration(errp);
     } else if (strstart(uri, "tcp:", &p)) {
@@ -246,7 +247,7 @@  static void process_incoming_migration_co(void *opaque)
     int ret;

     migration_incoming_state_new(f);
-
+    qapi_event_send_migration(MIGRATION_STATUS_ACTIVE, &error_abort);
     ret = qemu_loadvm_state(f);

     qemu_fclose(f);
@@ -254,10 +255,12 @@  static void process_incoming_migration_co(void *opaque)
     migration_incoming_state_destroy();

     if (ret < 0) {
+        qapi_event_send_migration(MIGRATION_STATUS_FAILED, &error_abort);
         error_report("load of migration failed: %s", strerror(-ret));
         migrate_decompress_threads_join();
         exit(EXIT_FAILURE);
     }
+    qapi_event_send_migration(MIGRATION_STATUS_COMPLETED, &error_abort);
     qemu_announce_self();

     /* Make sure all file formats flush their mutable metadata */