[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 13/28] migration: new state "postcopy-recover"
From: |
Peter Xu |
Subject: |
[Qemu-devel] [PATCH v5 13/28] migration: new state "postcopy-recover" |
Date: |
Tue, 5 Dec 2017 14:52:52 +0800 |
Introducing new migration state "postcopy-recover". If a migration
procedure is paused and the connection is rebuilt afterward
successfully, we'll switch the source VM state from "postcopy-paused" to
the new state "postcopy-recover", then we'll do the resume logic in the
migration thread (along with the return path thread).
This patch only do the state switch on source side. Another following up
patch will handle the state switching on destination side using the same
status bit.
Reviewed-by: Dr. David Alan Gilbert <address@hidden>
Signed-off-by: Peter Xu <address@hidden>
---
migration/migration.c | 76 ++++++++++++++++++++++++++++++++++++++-------------
qapi/migration.json | 4 ++-
2 files changed, 60 insertions(+), 20 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index a061691fe5..e00f4d0ad0 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -554,6 +554,7 @@ static bool migration_is_setup_or_active(int state)
case MIGRATION_STATUS_ACTIVE:
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
case MIGRATION_STATUS_POSTCOPY_PAUSED:
+ case MIGRATION_STATUS_POSTCOPY_RECOVER:
case MIGRATION_STATUS_SETUP:
case MIGRATION_STATUS_PRE_SWITCHOVER:
case MIGRATION_STATUS_DEVICE:
@@ -634,6 +635,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)
case MIGRATION_STATUS_PRE_SWITCHOVER:
case MIGRATION_STATUS_DEVICE:
case MIGRATION_STATUS_POSTCOPY_PAUSED:
+ case MIGRATION_STATUS_POSTCOPY_RECOVER:
/* TODO add some postcopy stats */
info->has_status = true;
info->has_total_time = true;
@@ -2250,6 +2252,13 @@ typedef enum MigThrError {
MIG_THR_ERR_FATAL = 2,
} MigThrError;
+/* Return zero if success, or <0 for error */
+static int postcopy_do_resume(MigrationState *s)
+{
+ /* TODO: do the resume logic */
+ return 0;
+}
+
/*
* We don't return until we are in a safe state to continue current
* postcopy migration. Returns MIG_THR_ERR_RECOVERED if recovered, or
@@ -2258,29 +2267,55 @@ typedef enum MigThrError {
static MigThrError postcopy_pause(MigrationState *s)
{
assert(s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE);
- migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_ACTIVE,
- MIGRATION_STATUS_POSTCOPY_PAUSED);
- /* Current channel is possibly broken. Release it. */
- assert(s->to_dst_file);
- qemu_file_shutdown(s->to_dst_file);
- qemu_fclose(s->to_dst_file);
- s->to_dst_file = NULL;
+ while (true) {
+ migrate_set_state(&s->state, s->state,
+ MIGRATION_STATUS_POSTCOPY_PAUSED);
- error_report("Detected IO failure for postcopy. "
- "Migration paused.");
+ /* Current channel is possibly broken. Release it. */
+ assert(s->to_dst_file);
+ qemu_file_shutdown(s->to_dst_file);
+ qemu_fclose(s->to_dst_file);
+ s->to_dst_file = NULL;
- /*
- * We wait until things fixed up. Then someone will setup the
- * status back for us.
- */
- while (s->state == MIGRATION_STATUS_POSTCOPY_PAUSED) {
- qemu_sem_wait(&s->postcopy_pause_sem);
- }
+ error_report("Detected IO failure for postcopy. "
+ "Migration paused.");
+
+ /*
+ * We wait until things fixed up. Then someone will setup the
+ * status back for us.
+ */
+ while (s->state == MIGRATION_STATUS_POSTCOPY_PAUSED) {
+ qemu_sem_wait(&s->postcopy_pause_sem);
+ }
- trace_postcopy_pause_continued();
+ if (s->state == MIGRATION_STATUS_POSTCOPY_RECOVER) {
+ /* Woken up by a recover procedure. Give it a shot */
+
+ /*
+ * Firstly, let's wake up the return path now, with a new
+ * return path channel.
+ */
+ qemu_sem_post(&s->postcopy_pause_rp_sem);
- return MIG_THR_ERR_RECOVERED;
+ /* Do the resume logic */
+ if (postcopy_do_resume(s) == 0) {
+ /* Let's continue! */
+ trace_postcopy_pause_continued();
+ return MIG_THR_ERR_RECOVERED;
+ } else {
+ /*
+ * Something wrong happened during the recovery, let's
+ * pause again. Pause is always better than throwing
+ * data away.
+ */
+ continue;
+ }
+ } else {
+ /* This is not right... Time to quit. */
+ return MIG_THR_ERR_FATAL;
+ }
+ }
}
static MigThrError migration_detect_error(MigrationState *s)
@@ -2545,7 +2580,10 @@ void migrate_fd_connect(MigrationState *s)
}
if (resume) {
- /* TODO: do the resume logic */
+ /* Wakeup the main migration thread to do the recovery */
+ migrate_set_state(&s->state, MIGRATION_STATUS_POSTCOPY_PAUSED,
+ MIGRATION_STATUS_POSTCOPY_RECOVER);
+ qemu_sem_post(&s->postcopy_pause_sem);
return;
}
diff --git a/qapi/migration.json b/qapi/migration.json
index 2ea12fcad4..5dfac0681d 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -91,6 +91,8 @@
#
# @postcopy-paused: during postcopy but paused. (since 2.12)
#
+# @postcopy-recover: trying to recover from a paused postcopy. (since 2.11)
+#
# @completed: migration is finished.
#
# @failed: some error occurred during migration process.
@@ -109,7 +111,7 @@
{ 'enum': 'MigrationStatus',
'data': [ 'none', 'setup', 'cancelling', 'cancelled',
'active', 'postcopy-active', 'postcopy-paused',
- 'completed', 'failed', 'colo',
+ 'postcopy-recover', 'completed', 'failed', 'colo',
'pre-switchover', 'device' ] }
##
--
2.14.3
- [Qemu-devel] [PATCH v5 05/28] migration: implement "postcopy-pause" src logic, (continued)
- [Qemu-devel] [PATCH v5 05/28] migration: implement "postcopy-pause" src logic, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 07/28] migration: allow src return path to pause, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 06/28] migration: allow dst vm pause on postcopy, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 08/28] migration: allow send_rq to fail, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 09/28] migration: allow fault thread to pause, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 10/28] qmp: hmp: add migrate "resume" option, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 11/28] migration: pass MigrationState to migrate_init(), Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 12/28] migration: rebuild channel on source, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 13/28] migration: new state "postcopy-recover",
Peter Xu <=
- [Qemu-devel] [PATCH v5 14/28] migration: wakeup dst ram-load-thread for recover, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 15/28] migration: new cmd MIG_CMD_RECV_BITMAP, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 16/28] migration: new message MIG_RP_MSG_RECV_BITMAP, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 17/28] migration: new cmd MIG_CMD_POSTCOPY_RESUME, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 18/28] migration: new message MIG_RP_MSG_RESUME_ACK, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 19/28] migration: introduce SaveVMHandlers.resume_prepare, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 20/28] migration: synchronize dirty bitmap for resume, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 22/28] migration: final handshake for the resume, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 21/28] migration: setup ramstate for resume, Peter Xu, 2017/12/05
- [Qemu-devel] [PATCH v5 23/28] migration: free SocketAddress where allocated, Peter Xu, 2017/12/05