qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
To: qemu-devel@nongnu.org
Cc: quintela@redhat.com, ashijeetacharya@gmail.com, amit@kernel.org,
	pbutsykin@virtuozzo.com, zhang.zhanghailiang@huawei.com
Subject: [Qemu-devel] [PULL 10/14] COLO: Don't process failover request while loading VM's state
Date: Mon, 13 Feb 2017 17:50:29 +0000	[thread overview]
Message-ID: <20170213175033.7314-11-dgilbert@redhat.com> (raw)
In-Reply-To: <20170213175033.7314-1-dgilbert@redhat.com>

From: zhanghailiang <zhang.zhanghailiang@huawei.com>

We should not do failover work while the main thread is loading
VM's state. Otherwise the consistent of VM's memory and
device state will be broken.

We will restart the loading process after jump over the stage,
The new failover status 'RELAUNCH' will help to record if we
need to restart the process.

Cc: Eric Blake <eblake@redhat.com>
Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Message-Id: <1484657864-21708-4-git-send-email-zhang.zhanghailiang@huawei.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
   Added a missing '(Since 2.9)'
---
 migration/colo.c | 26 ++++++++++++++++++++++++++
 qapi-schema.json |  4 +++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/migration/colo.c b/migration/colo.c
index 3222812..712308e 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -20,6 +20,8 @@
 #include "qapi/error.h"
 #include "migration/failover.h"
 
+static bool vmstate_loading;
+
 #define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024)
 
 bool colo_supported(void)
@@ -51,6 +53,19 @@ static void secondary_vm_do_failover(void)
     int old_state;
     MigrationIncomingState *mis = migration_incoming_get_current();
 
+    /* Can not do failover during the process of VM's loading VMstate, Or
+     * it will break the secondary VM.
+     */
+    if (vmstate_loading) {
+        old_state = failover_set_state(FAILOVER_STATUS_ACTIVE,
+                        FAILOVER_STATUS_RELAUNCH);
+        if (old_state != FAILOVER_STATUS_ACTIVE) {
+            error_report("Unknown error while do failover for secondary VM,"
+                         "old_state: %s", FailoverStatus_lookup[old_state]);
+        }
+        return;
+    }
+
     migrate_set_state(&mis->state, MIGRATION_STATUS_COLO,
                       MIGRATION_STATUS_COMPLETED);
 
@@ -548,13 +563,23 @@ void *colo_process_incoming_thread(void *opaque)
 
         qemu_mutex_lock_iothread();
         qemu_system_reset(VMRESET_SILENT);
+        vmstate_loading = true;
         if (qemu_loadvm_state(fb) < 0) {
             error_report("COLO: loadvm failed");
             qemu_mutex_unlock_iothread();
             goto out;
         }
+
+        vmstate_loading = false;
         qemu_mutex_unlock_iothread();
 
+        if (failover_get_state() == FAILOVER_STATUS_RELAUNCH) {
+            failover_set_state(FAILOVER_STATUS_RELAUNCH,
+                            FAILOVER_STATUS_NONE);
+            failover_request_active(NULL);
+            goto out;
+        }
+
         colo_send_message(mis->to_src_file, COLO_MESSAGE_VMSTATE_LOADED,
                      &local_err);
         if (local_err) {
@@ -563,6 +588,7 @@ void *colo_process_incoming_thread(void *opaque)
     }
 
 out:
+    vmstate_loading = false;
     /* Throw the unreported error message after exited from loop */
     if (local_err) {
         error_report_err(local_err);
diff --git a/qapi-schema.json b/qapi-schema.json
index 9330541..5edb08d 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1193,10 +1193,12 @@
 #
 # @completed: finish the process of failover
 #
+# @relaunch: restart the failover process, from 'none' -> 'completed' (Since 2.9)
+#
 # Since: 2.8
 ##
 { 'enum': 'FailoverStatus',
-  'data': [ 'none', 'require', 'active', 'completed'] }
+  'data': [ 'none', 'require', 'active', 'completed', 'relaunch' ] }
 
 ##
 # @x-colo-lost-heartbeat:
-- 
2.9.3

  parent reply	other threads:[~2017-02-13 17:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-13 17:50 [Qemu-devel] [PULL 00/14] migration queue Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 01/14] migration: remove myself as maintainer Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 02/14] MAINTAINERS: update my email address Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 03/14] migration: add MigrationState arg for ram_save_/compressed_/page() Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 04/14] add 'release-ram' migrate capability Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 05/14] migration: discard non-dirty ram pages after the start of postcopy Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 06/14] migrate: Introduce zero RAM checks to skip RAM migration Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 07/14] migration: consolidate VMStateField.start Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 08/14] COLO: fix setting checkpoint-delay not working properly Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 09/14] COLO: Shutdown related socket fd while do failover Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` Dr. David Alan Gilbert (git) [this message]
2017-02-13 17:50 ` [Qemu-devel] [PULL 11/14] migration: Add VMSTATE_UNUSED_VARRAY_UINT32 Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 12/14] migration: Add VMSTATE_WITH_TMP Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 13/14] tests/migration: Add test for VMSTATE_WITH_TMP Dr. David Alan Gilbert (git)
2017-02-13 17:50 ` [Qemu-devel] [PULL 14/14] virtio/migration: Migrate virtio-net to VMState Dr. David Alan Gilbert (git)
2017-02-14  9:52 ` [Qemu-devel] [PULL 00/14] migration queue Peter Maydell

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=20170213175033.7314-11-dgilbert@redhat.com \
    --to=dgilbert@redhat.com \
    --cc=amit@kernel.org \
    --cc=ashijeetacharya@gmail.com \
    --cc=pbutsykin@virtuozzo.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=zhang.zhanghailiang@huawei.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).