add migration state change notifiers
This patch adds functions to register and unregister notifiers for migration state changes and a function to query the migration state. The notifier is called on every state change. Once after establishing a new migration object (which is in active state then) and once when the state changes from active to completed, canceled or error. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
0bfe006c53
commit
99a0db9b8d
28
migration.c
28
migration.c
@ -36,6 +36,9 @@ static int64_t max_throttle = (32 << 20);
|
||||
|
||||
static MigrationState *current_migration;
|
||||
|
||||
static NotifierList migration_state_notifiers =
|
||||
NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
|
||||
|
||||
int qemu_start_incoming_migration(const char *uri)
|
||||
{
|
||||
const char *p;
|
||||
@ -121,6 +124,7 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data)
|
||||
}
|
||||
|
||||
current_migration = s;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -272,6 +276,7 @@ void migrate_fd_error(FdMigrationState *s)
|
||||
{
|
||||
DPRINTF("setting error state\n");
|
||||
s->state = MIG_STATE_ERROR;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
migrate_fd_cleanup(s);
|
||||
}
|
||||
|
||||
@ -329,6 +334,7 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)
|
||||
monitor_resume(s->mon);
|
||||
}
|
||||
s->state = MIG_STATE_ERROR;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -389,6 +395,7 @@ void migrate_fd_put_ready(void *opaque)
|
||||
state = MIG_STATE_ERROR;
|
||||
}
|
||||
s->state = state;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
}
|
||||
}
|
||||
|
||||
@ -408,6 +415,7 @@ void migrate_fd_cancel(MigrationState *mig_state)
|
||||
DPRINTF("cancelling migration\n");
|
||||
|
||||
s->state = MIG_STATE_CANCELLED;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
qemu_savevm_state_cancel(s->mon, s->file);
|
||||
|
||||
migrate_fd_cleanup(s);
|
||||
@ -421,6 +429,7 @@ void migrate_fd_release(MigrationState *mig_state)
|
||||
|
||||
if (s->state == MIG_STATE_ACTIVE) {
|
||||
s->state = MIG_STATE_CANCELLED;
|
||||
notifier_list_notify(&migration_state_notifiers);
|
||||
migrate_fd_cleanup(s);
|
||||
}
|
||||
qemu_free(s);
|
||||
@ -452,3 +461,22 @@ int migrate_fd_close(void *opaque)
|
||||
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
||||
return s->close(s);
|
||||
}
|
||||
|
||||
void add_migration_state_change_notifier(Notifier *notify)
|
||||
{
|
||||
notifier_list_add(&migration_state_notifiers, notify);
|
||||
}
|
||||
|
||||
void remove_migration_state_change_notifier(Notifier *notify)
|
||||
{
|
||||
notifier_list_remove(&migration_state_notifiers, notify);
|
||||
}
|
||||
|
||||
int get_migration_state(void)
|
||||
{
|
||||
if (current_migration) {
|
||||
return migrate_fd_get_status(current_migration);
|
||||
} else {
|
||||
return MIG_STATE_ERROR;
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include "qdict.h"
|
||||
#include "qemu-common.h"
|
||||
#include "notify.h"
|
||||
|
||||
#define MIG_STATE_ERROR -1
|
||||
#define MIG_STATE_COMPLETED 0
|
||||
@ -134,4 +135,8 @@ static inline FdMigrationState *migrate_to_fms(MigrationState *mig_state)
|
||||
return container_of(mig_state, FdMigrationState, mig_state);
|
||||
}
|
||||
|
||||
void add_migration_state_change_notifier(Notifier *notify);
|
||||
void remove_migration_state_change_notifier(Notifier *notify);
|
||||
int get_migration_state(void);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user