We have one argument that tells us what event has happened. Signed-off-by: Juan Quintela <quint...@redhat.com> --- docs/qmp/qmp-events.txt | 16 ++++++++++++++++ migration/migration.c | 12 ++++++++++++ qapi/event.json | 14 ++++++++++++++ 3 files changed, 42 insertions(+)
diff --git a/docs/qmp/qmp-events.txt b/docs/qmp/qmp-events.txt index 4c13d48..3797709 100644 --- a/docs/qmp/qmp-events.txt +++ b/docs/qmp/qmp-events.txt @@ -473,6 +473,22 @@ Example: { "timestamp": {"seconds": 1290688046, "microseconds": 417172}, "event": "SPICE_MIGRATE_COMPLETED" } +MIGRATION +--------- + +Emitted when a migration event happens + +Data: None. + + - "status": migration status + "": error has been ignored + "report": error has been reported to the device + "stop": the VM is going to stop because of the error + +Example: + +{"timestamp": {"seconds": 1432121972, "microseconds": 744001}, + "event": "MIGRATION", "data": {"status": "completed"}} STOP ---- diff --git a/migration/migration.c b/migration/migration.c index 2925587..6b1cead 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -25,6 +25,7 @@ #include "qemu/thread.h" #include "qmp-commands.h" #include "trace.h" +#include "qapi-event.h" #define MAX_THROTTLE (32 << 20) /* Migration speed throttling */ @@ -401,6 +402,7 @@ static void migrate_fd_cleanup(void *opaque) if (s->state == MIGRATION_STATUS_CANCELLING) { migrate_set_state(s, MIGRATION_STATUS_CANCELLING, MIGRATION_STATUS_CANCELLED); + qapi_event_send_migration(MIGRATION_STATUS_CANCELLED, &error_abort); } } @@ -412,6 +414,7 @@ void migrate_fd_error(MigrationState *s) trace_migrate_fd_error(); assert(s->file == NULL); s->state = MIGRATION_STATUS_FAILED; + qapi_event_send_migration(MIGRATION_STATUS_FAILED, &error_abort); trace_migrate_set_state(MIGRATION_STATUS_FAILED); notifier_list_notify(&migration_state_notifiers, s); } @@ -430,6 +433,7 @@ static void migrate_fd_cancel(MigrationState *s) } migrate_set_state(s, old_state, MIGRATION_STATUS_CANCELLING); } while (s->state != MIGRATION_STATUS_CANCELLING); + qapi_event_send_migration(MIGRATION_STATUS_CANCELLING, &error_abort); /* * If we're unlucky the migration code might be stuck somewhere in a @@ -497,6 +501,7 @@ static MigrationState *migrate_init(const MigrationParams *params) decompress_thread_count; s->bandwidth_limit = bandwidth_limit; s->state = MIGRATION_STATUS_SETUP; + qapi_event_send_migration(MIGRATION_STATUS_SETUP, &error_abort); trace_migrate_set_state(MIGRATION_STATUS_SETUP); s->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); @@ -590,6 +595,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } else { error_set(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol"); s->state = MIGRATION_STATUS_FAILED; + qapi_event_send_migration(MIGRATION_STATUS_FAILED, &error_abort); return; } @@ -751,6 +757,7 @@ static void *migration_thread(void *opaque) qemu_savevm_state_begin(s->file, &s->params); s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start; + qapi_event_send_migration(MIGRATION_STATUS_ACTIVE, &error_abort); migrate_set_state(s, MIGRATION_STATUS_SETUP, MIGRATION_STATUS_ACTIVE); while (s->state == MIGRATION_STATUS_ACTIVE) { @@ -781,12 +788,16 @@ static void *migration_thread(void *opaque) if (ret < 0) { migrate_set_state(s, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_FAILED); + qapi_event_send_migration(MIGRATION_STATUS_FAILED, + &error_abort); break; } if (!qemu_file_get_error(s->file)) { migrate_set_state(s, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_COMPLETED); + qapi_event_send_migration(MIGRATION_STATUS_COMPLETED, + &error_abort); break; } } @@ -795,6 +806,7 @@ static void *migration_thread(void *opaque) if (qemu_file_get_error(s->file)) { migrate_set_state(s, MIGRATION_STATUS_ACTIVE, MIGRATION_STATUS_FAILED); + qapi_event_send_migration(MIGRATION_STATUS_FAILED, &error_abort); break; } current_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); diff --git a/qapi/event.json b/qapi/event.json index 378dda5..fe5e182 100644 --- a/qapi/event.json +++ b/qapi/event.json @@ -243,6 +243,20 @@ { 'event': 'SPICE_MIGRATE_COMPLETED' } ## +# @MIGRATION +# +# Emitted when a migration event happens +# +# @status: @MigrationStatus describing the current migration status. +# If this field is not returned, no migration process +# has been initiated +# +# Since: 2.4 +## +{ 'event': 'MIGRATION', + 'data': {'status': 'MigrationStatus'}} + +## # @ACPI_DEVICE_OST # # Emitted when guest executes ACPI _OST method. -- 2.4.1