|
|
76daa3 |
From 149b5fe290b6d8f52b87993d3d27fe5fca806173 Mon Sep 17 00:00:00 2001
|
|
|
76daa3 |
From: Kevin Wolf <kwolf@redhat.com>
|
|
|
76daa3 |
Date: Fri, 19 May 2017 09:38:59 +0200
|
|
|
76daa3 |
Subject: [PATCH 24/27] migration: Unify block node activation error handling
|
|
|
76daa3 |
|
|
|
76daa3 |
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
|
76daa3 |
Message-id: <1495186739-13659-3-git-send-email-kwolf@redhat.com>
|
|
|
76daa3 |
Patchwork-id: 75377
|
|
|
76daa3 |
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH v2 2/2] migration: Unify block node activation error handling
|
|
|
76daa3 |
Bugzilla: 1452148
|
|
|
76daa3 |
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
76daa3 |
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
76daa3 |
|
|
|
76daa3 |
Migration code activates all block driver nodes on the destination when
|
|
|
76daa3 |
the migration completes. It does so by calling
|
|
|
76daa3 |
bdrv_invalidate_cache_all() and blk_resume_after_migration(). There is
|
|
|
76daa3 |
one code path for precopy and one for postcopy migration, resulting in
|
|
|
76daa3 |
four function calls, which used to have three different failure modes.
|
|
|
76daa3 |
|
|
|
76daa3 |
This patch unifies the behaviour so that failure to activate all block
|
|
|
76daa3 |
nodes is non-fatal, but the error message is logged and the VM isn't
|
|
|
76daa3 |
automatically started. 'cont' will retry activating the block nodes.
|
|
|
76daa3 |
|
|
|
76daa3 |
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
|
76daa3 |
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
|
76daa3 |
(cherry picked from commit ace21a58751824f9a3d399e332317233e880de3a)
|
|
|
76daa3 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
76daa3 |
---
|
|
|
76daa3 |
migration/migration.c | 16 +++++-----------
|
|
|
76daa3 |
migration/savevm.c | 12 +++++-------
|
|
|
76daa3 |
qmp.c | 18 +++++++++---------
|
|
|
76daa3 |
3 files changed, 19 insertions(+), 27 deletions(-)
|
|
|
76daa3 |
|
|
|
76daa3 |
diff --git a/migration/migration.c b/migration/migration.c
|
|
|
76daa3 |
index fdc17bc..7a2ee01 100644
|
|
|
76daa3 |
--- a/migration/migration.c
|
|
|
76daa3 |
+++ b/migration/migration.c
|
|
|
76daa3 |
@@ -340,20 +340,14 @@ static void process_incoming_migration_bh(void *opaque)
|
|
|
76daa3 |
Error *local_err = NULL;
|
|
|
76daa3 |
MigrationIncomingState *mis = opaque;
|
|
|
76daa3 |
|
|
|
76daa3 |
- /* Make sure all file formats flush their mutable metadata */
|
|
|
76daa3 |
+ /* Make sure all file formats flush their mutable metadata.
|
|
|
76daa3 |
+ * If we get an error here, just don't restart the VM yet. */
|
|
|
76daa3 |
bdrv_invalidate_cache_all(&local_err);
|
|
|
76daa3 |
- if (local_err) {
|
|
|
76daa3 |
- migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
|
|
|
76daa3 |
- MIGRATION_STATUS_FAILED);
|
|
|
76daa3 |
- error_report_err(local_err);
|
|
|
76daa3 |
- migrate_decompress_threads_join();
|
|
|
76daa3 |
- exit(EXIT_FAILURE);
|
|
|
76daa3 |
+ if (!local_err) {
|
|
|
76daa3 |
+ blk_resume_after_migration(&local_err);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- /* If we get an error here, just don't restart the VM yet. */
|
|
|
76daa3 |
- blk_resume_after_migration(&local_err);
|
|
|
76daa3 |
if (local_err) {
|
|
|
76daa3 |
- error_free(local_err);
|
|
|
76daa3 |
+ error_report_err(local_err);
|
|
|
76daa3 |
local_err = NULL;
|
|
|
76daa3 |
autostart = false;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
diff --git a/migration/savevm.c b/migration/savevm.c
|
|
|
76daa3 |
index 21d7985..6e2f9e7 100644
|
|
|
76daa3 |
--- a/migration/savevm.c
|
|
|
76daa3 |
+++ b/migration/savevm.c
|
|
|
76daa3 |
@@ -1620,16 +1620,14 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
|
|
|
76daa3 |
|
|
|
76daa3 |
qemu_announce_self();
|
|
|
76daa3 |
|
|
|
76daa3 |
- /* Make sure all file formats flush their mutable metadata */
|
|
|
76daa3 |
+ /* Make sure all file formats flush their mutable metadata.
|
|
|
76daa3 |
+ * If we get an error here, just don't restart the VM yet. */
|
|
|
76daa3 |
bdrv_invalidate_cache_all(&local_err);
|
|
|
76daa3 |
- if (local_err) {
|
|
|
76daa3 |
- error_report_err(local_err);
|
|
|
76daa3 |
+ if (!local_err) {
|
|
|
76daa3 |
+ blk_resume_after_migration(&local_err);
|
|
|
76daa3 |
}
|
|
|
76daa3 |
-
|
|
|
76daa3 |
- /* If we get an error here, just don't restart the VM yet. */
|
|
|
76daa3 |
- blk_resume_after_migration(&local_err);
|
|
|
76daa3 |
if (local_err) {
|
|
|
76daa3 |
- error_free(local_err);
|
|
|
76daa3 |
+ error_report_err(local_err);
|
|
|
76daa3 |
local_err = NULL;
|
|
|
76daa3 |
autostart = false;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
diff --git a/qmp.c b/qmp.c
|
|
|
76daa3 |
index a744e44..847b13f 100644
|
|
|
76daa3 |
--- a/qmp.c
|
|
|
76daa3 |
+++ b/qmp.c
|
|
|
76daa3 |
@@ -196,15 +196,15 @@ void qmp_cont(Error **errp)
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
/* Continuing after completed migration. Images have been inactivated to
|
|
|
76daa3 |
- * allow the destination to take control. Need to get control back now. */
|
|
|
76daa3 |
- if (runstate_check(RUN_STATE_FINISH_MIGRATE) ||
|
|
|
76daa3 |
- runstate_check(RUN_STATE_POSTMIGRATE))
|
|
|
76daa3 |
- {
|
|
|
76daa3 |
- bdrv_invalidate_cache_all(&local_err);
|
|
|
76daa3 |
- if (local_err) {
|
|
|
76daa3 |
- error_propagate(errp, local_err);
|
|
|
76daa3 |
- return;
|
|
|
76daa3 |
- }
|
|
|
76daa3 |
+ * allow the destination to take control. Need to get control back now.
|
|
|
76daa3 |
+ *
|
|
|
76daa3 |
+ * If there are no inactive block nodes (e.g. because the VM was just
|
|
|
76daa3 |
+ * paused rather than completing a migration), bdrv_inactivate_all() simply
|
|
|
76daa3 |
+ * doesn't do anything. */
|
|
|
76daa3 |
+ bdrv_invalidate_cache_all(&local_err);
|
|
|
76daa3 |
+ if (local_err) {
|
|
|
76daa3 |
+ error_propagate(errp, local_err);
|
|
|
76daa3 |
+ return;
|
|
|
76daa3 |
}
|
|
|
76daa3 |
|
|
|
76daa3 |
blk_resume_after_migration(&local_err);
|
|
|
76daa3 |
--
|
|
|
76daa3 |
1.8.3.1
|
|
|
76daa3 |
|