From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: Laurent Vivier <lvivier@redhat.com>,
"Daniel P . Berrange" <berrange@redhat.com>,
Alexey Perevalov <a.perevalov@samsung.com>,
Juan Quintela <quintela@redhat.com>,
Andrea Arcangeli <aarcange@redhat.com>,
"Dr . David Alan Gilbert" <dgilbert@redhat.com>,
peterx@redhat.com
Subject: [Qemu-devel] [RFC v2 17/33] migration: new state "postcopy-recover"
Date: Wed, 30 Aug 2017 16:32:14 +0800 [thread overview]
Message-ID: <1504081950-2528-18-git-send-email-peterx@redhat.com> (raw)
In-Reply-To: <1504081950-2528-1-git-send-email-peterx@redhat.com>
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.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 76 ++++++++++++++++++++++++++++++++++++++-------------
qapi-schema.json | 4 ++-
2 files changed, 60 insertions(+), 20 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index deb947b..30dd566 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -495,6 +495,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:
return true;
@@ -571,6 +572,7 @@ MigrationInfo *qmp_query_migrate(Error **errp)
case MIGRATION_STATUS_CANCELLING:
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
case MIGRATION_STATUS_POSTCOPY_PAUSED:
+ case MIGRATION_STATUS_POSTCOPY_RECOVER:
/* TODO add some postcopy stats */
info->has_status = true;
info->has_total_time = true;
@@ -2035,6 +2037,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
@@ -2043,29 +2052,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)
@@ -2330,7 +2365,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-schema.json b/qapi-schema.json
index ba41f2c..989f95a 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -669,6 +669,8 @@
#
# @postcopy-paused: during postcopy but paused. (since 2.11)
#
+# @postcopy-recover: trying to recover from a paused postcopy. (since 2.11)
+#
# @completed: migration is finished.
#
# @failed: some error occurred during migration process.
@@ -682,7 +684,7 @@
{ 'enum': 'MigrationStatus',
'data': [ 'none', 'setup', 'cancelling', 'cancelled',
'active', 'postcopy-active', 'postcopy-paused',
- 'completed', 'failed', 'colo' ] }
+ 'postcopy-recover', 'completed', 'failed', 'colo' ] }
##
# @MigrationInfo:
--
2.7.4
next prev parent reply other threads:[~2017-08-30 8:34 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-30 8:31 [Qemu-devel] [RFC v2 00/33] Migration: postcopy failure recovery Peter Xu
2017-08-30 8:31 ` [Qemu-devel] [RFC v2 01/33] bitmap: remove BITOP_WORD() Peter Xu
2017-09-20 8:41 ` Juan Quintela
2017-08-30 8:31 ` [Qemu-devel] [RFC v2 02/33] bitmap: introduce bitmap_count_one() Peter Xu
2017-09-20 8:25 ` Juan Quintela
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 03/33] bitmap: provide to_le/from_le helpers Peter Xu
2017-09-21 17:35 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 04/33] migration: dump str in migrate_set_state trace Peter Xu
2017-09-06 14:36 ` Dr. David Alan Gilbert
2017-09-20 8:44 ` Juan Quintela
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 05/33] migration: better error handling with QEMUFile Peter Xu
2017-09-21 17:51 ` Dr. David Alan Gilbert
2017-09-26 8:48 ` Peter Xu
2017-09-26 8:53 ` Dr. David Alan Gilbert
2017-09-26 9:13 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 06/33] migration: reuse mis->userfault_quit_fd Peter Xu
2017-09-20 8:47 ` Juan Quintela
2017-09-20 9:06 ` Juan Quintela
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 07/33] migration: provide postcopy_fault_thread_notify() Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 08/33] migration: new postcopy-pause state Peter Xu
2017-09-21 17:57 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 09/33] migration: implement "postcopy-pause" src logic Peter Xu
2017-09-21 19:21 ` Dr. David Alan Gilbert
2017-09-26 9:35 ` Peter Xu
2017-10-09 15:32 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 10/33] migration: allow dst vm pause on postcopy Peter Xu
2017-09-21 19:29 ` Dr. David Alan Gilbert
2017-09-27 7:34 ` Peter Xu
2017-10-09 18:58 ` Dr. David Alan Gilbert
2017-10-10 9:38 ` Peter Xu
2017-10-10 11:31 ` Peter Xu
2017-10-31 18:57 ` Dr. David Alan Gilbert
2017-10-10 12:30 ` Dr. David Alan Gilbert
2017-10-11 3:00 ` Peter Xu
2017-10-12 12:19 ` Dr. David Alan Gilbert
2017-10-13 5:08 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 11/33] migration: allow src return path to pause Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 12/33] migration: allow send_rq to fail Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 13/33] migration: allow fault thread to pause Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 14/33] qmp: hmp: add migrate "resume" option Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 15/33] migration: pass MigrationState to migrate_init() Peter Xu
2017-09-22 9:09 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 16/33] migration: rebuild channel on source Peter Xu
2017-09-22 9:56 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` Peter Xu [this message]
2017-09-22 10:08 ` [Qemu-devel] [RFC v2 17/33] migration: new state "postcopy-recover" Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 18/33] migration: wakeup dst ram-load-thread for recover Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 19/33] migration: new cmd MIG_CMD_RECV_BITMAP Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 20/33] migration: new message MIG_RP_MSG_RECV_BITMAP Peter Xu
2017-09-22 11:05 ` Dr. David Alan Gilbert
2017-09-27 10:04 ` Peter Xu
2017-10-09 19:12 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 21/33] migration: new cmd MIG_CMD_POSTCOPY_RESUME Peter Xu
2017-09-22 11:08 ` Dr. David Alan Gilbert
2017-09-27 10:11 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 22/33] migration: new message MIG_RP_MSG_RESUME_ACK Peter Xu
2017-09-22 11:13 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 23/33] migration: introduce SaveVMHandlers.resume_prepare Peter Xu
2017-09-22 11:17 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 24/33] migration: synchronize dirty bitmap for resume Peter Xu
2017-09-22 11:33 ` Dr. David Alan Gilbert
2017-09-28 2:30 ` Peter Xu
2017-10-02 11:04 ` Dr. David Alan Gilbert
2017-10-09 3:55 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 25/33] migration: setup ramstate " Peter Xu
2017-09-22 11:53 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 26/33] migration: final handshake for the resume Peter Xu
2017-09-22 11:56 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 27/33] migration: free SocketAddress where allocated Peter Xu
2017-09-22 20:08 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 28/33] migration: return incoming task tag for sockets Peter Xu
2017-09-22 20:11 ` Dr. David Alan Gilbert
2017-09-28 3:12 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 29/33] migration: return incoming task tag for exec Peter Xu
2017-09-22 20:15 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 30/33] migration: return incoming task tag for fd Peter Xu
2017-09-22 20:15 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 31/33] migration: store listen task tag Peter Xu
2017-09-22 20:17 ` Dr. David Alan Gilbert
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 32/33] migration: allow migrate_incoming for paused VM Peter Xu
2017-09-22 20:32 ` Dr. David Alan Gilbert
2017-09-28 6:54 ` Peter Xu
2017-10-09 17:28 ` Dr. David Alan Gilbert
2017-10-10 10:08 ` Peter Xu
2017-08-30 8:32 ` [Qemu-devel] [RFC v2 33/33] migration: init dst in migration_object_init too Peter Xu
2017-09-22 20:37 ` Dr. David Alan Gilbert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1504081950-2528-18-git-send-email-peterx@redhat.com \
--to=peterx@redhat.com \
--cc=a.perevalov@samsung.com \
--cc=aarcange@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=lvivier@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).