qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH 2/2] migrate: Tests for migrating to an already


From: Richard Palethorpe
Subject: [Qemu-devel] [RFC PATCH 2/2] migrate: Tests for migrating to an already used QEMU
Date: Tue, 27 Feb 2018 12:56:51 +0100

Currently this appears to work for X86_64, but PPC64 fails due to some
unexpected data on the serial port after migration. This probably requires
quite a bit more work.
---
 tests/migration-test.c | 113 +++++++++++++++++++++++++++++++++++++------------
 1 file changed, 85 insertions(+), 28 deletions(-)

diff --git a/tests/migration-test.c b/tests/migration-test.c
index 74f9361bdd..8217d2e83e 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -125,19 +125,17 @@ static void init_bootfile_ppc(const char *bootpath)
  * we get an 'A' followed by an endless string of 'B's
  * but on the destination we won't have the A.
  */
-static void wait_for_serial(const char *side)
+static void wait_for_serial(const char *side, gboolean started)
 {
     char *serialpath = g_strdup_printf("%s/%s", tmpfs, side);
     FILE *serialfile = fopen(serialpath, "r");
     const char *arch = qtest_get_arch();
-    int started = (strcmp(side, "src_serial") == 0 &&
-                   strcmp(arch, "ppc64") == 0) ? 0 : 1;
 
     g_free(serialpath);
     do {
         int readvalue = fgetc(serialfile);
 
-        if (!started) {
+        if (!started && !strcmp(arch, "ppc64")) {
             /* SLOF prints its banner before starting test,
              * to ignore it, mark the start of the test with '_',
              * ignore all characters until this marker
@@ -358,16 +356,21 @@ static void migrate_set_capability(QTestState *who, const 
char *capability,
     QDECREF(rsp);
 }
 
-static void migrate(QTestState *who, const char *uri)
+static void migrate(QTestState *who, const char *uri, gboolean incoming)
 {
     QDict *rsp;
+    const gchar *cmd_name = incoming ? "migrate-incoming" : "migrate";
     gchar *cmd;
 
-    cmd = g_strdup_printf("{ 'execute': 'migrate',"
+    cmd = g_strdup_printf("{ 'execute': '%s',"
                           "'arguments': { 'uri': '%s' } }",
-                          uri);
+                          cmd_name, uri);
     rsp = qtest_qmp(who, cmd);
     g_free(cmd);
+    while (qdict_haskey(rsp, "event")) {
+        QDECREF(rsp);
+        rsp = qtest_qmp_receive(who);
+    }
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);
 }
@@ -382,15 +385,22 @@ static void migrate_start_postcopy(QTestState *who)
 }
 
 static void test_migrate_start(QTestState **from, QTestState **to,
-                               const char *uri)
+                               const char *uri, gboolean incoming)
 {
-    gchar *cmd_src, *cmd_dst;
+    gchar *cmd_src;
+    GString *cmd_dst = g_string_new(NULL);
     char *bootpath = g_strdup_printf("%s/bootsect", tmpfs);
+    char *bootpath_dst;
     const char *arch = qtest_get_arch();
     const char *accel = "kvm:tcg";
 
     got_stop = false;
 
+    if (incoming)
+        bootpath_dst = bootpath;
+    else
+        bootpath_dst = g_strdup_printf("%s/bootsect_dst", tmpfs);
+
     if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
         init_bootfile_x86(bootpath);
         cmd_src = g_strdup_printf("-machine accel=%s -m 150M"
@@ -398,12 +408,14 @@ static void test_migrate_start(QTestState **from, 
QTestState **to,
                                   " -serial file:%s/src_serial"
                                   " -drive file=%s,format=raw",
                                   accel, tmpfs, bootpath);
-        cmd_dst = g_strdup_printf("-machine accel=%s -m 150M"
-                                  " -name target,debug-threads=on"
-                                  " -serial file:%s/dest_serial"
-                                  " -drive file=%s,format=raw"
-                                  " -incoming %s",
-                                  accel, tmpfs, bootpath, uri);
+        if (!incoming)
+            init_bootfile_x86(bootpath_dst);
+
+        g_string_printf(cmd_dst, "-machine accel=%s -m 150M"
+                        " -name target,debug-threads=on"
+                        " -serial file:%s/dest_serial"
+                        " -drive file=%s,format=raw",
+                        accel, tmpfs, bootpath_dst);
     } else if (strcmp(arch, "ppc64") == 0) {
 
         /* On ppc64, the test only works with kvm-hv, but not with kvm-pr */
@@ -416,22 +428,29 @@ static void test_migrate_start(QTestState **from, 
QTestState **to,
                                   " -serial file:%s/src_serial"
                                   " -drive file=%s,if=pflash,format=raw",
                                   accel, tmpfs, bootpath);
-        cmd_dst = g_strdup_printf("-machine accel=%s -m 256M"
-                                  " -name target,debug-threads=on"
-                                  " -serial file:%s/dest_serial"
-                                  " -incoming %s",
-                                  accel, tmpfs, uri);
+        g_string_printf(cmd_dst, "-machine accel=%s -m 256M"
+                        " -name target,debug-threads=on"
+                        " -serial file:%s/dest_serial",
+                        accel, tmpfs);
+        if (!incoming) {
+            g_string_append_printf(cmd_dst,
+                                   " -drive file=%s,if=pflash,format=raw",
+                                   bootpath);
+        }
     } else {
         g_assert_not_reached();
     }
 
+    if (incoming)
+        g_string_append_printf(cmd_dst, " -incoming %s", uri);
+
     g_free(bootpath);
 
     *from = qtest_start(cmd_src);
     g_free(cmd_src);
 
-    *to = qtest_init(cmd_dst);
-    g_free(cmd_dst);
+    *to = qtest_init(cmd_dst->str);
+    g_string_free(cmd_dst, TRUE);
 }
 
 static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest)
@@ -518,7 +537,7 @@ static void test_migrate(void)
     char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
     QTestState *from, *to;
 
-    test_migrate_start(&from, &to, uri);
+    test_migrate_start(&from, &to, uri, TRUE);
 
     migrate_set_capability(from, "postcopy-ram", "true");
     migrate_set_capability(to, "postcopy-ram", "true");
@@ -531,9 +550,9 @@ static void test_migrate(void)
     migrate_set_parameter(from, "downtime-limit", "1");
 
     /* Wait for the first serial output from the source */
-    wait_for_serial("src_serial");
+    wait_for_serial("src_serial", FALSE);
 
-    migrate(from, uri);
+    migrate(from, uri, FALSE);
 
     wait_for_migration_pass(from);
 
@@ -545,7 +564,7 @@ static void test_migrate(void)
 
     qtest_qmp_eventwait(to, "RESUME");
 
-    wait_for_serial("dest_serial");
+    wait_for_serial("dest_serial", TRUE);
     wait_for_migration_complete(from);
 
     g_free(uri);
@@ -560,8 +579,8 @@ static void test_baddest(void)
     const char *status;
     bool failed;
 
-    test_migrate_start(&from, &to, "tcp:0:0");
-    migrate(from, "tcp:0:0");
+    test_migrate_start(&from, &to, "tcp:0:0", TRUE);
+    migrate(from, "tcp:0:0", FALSE);
     do {
         rsp = wait_command(from, "{ 'execute': 'query-migrate' }");
         rsp_return = qdict_get_qdict(rsp, "return");
@@ -584,6 +603,43 @@ static void test_baddest(void)
     test_migrate_end(from, to, false);
 }
 
+static void test_migrate_to_used(void)
+{
+    char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
+    QTestState *from, *to;
+
+    test_migrate_start(&from, &to, uri, FALSE);
+
+    migrate_set_capability(from, "postcopy-ram", "true");
+    migrate_set_capability(to, "postcopy-ram", "true");
+
+    migrate_set_parameter(from, "max-bandwidth", "100000000");
+    migrate_set_parameter(from, "downtime-limit", "1");
+
+    wait_for_serial("dest_serial", FALSE);
+    migrate(to, uri, TRUE);
+
+    wait_for_serial("src_serial", FALSE);
+    migrate(from, uri, FALSE);
+
+    wait_for_migration_pass(from);
+
+    migrate_start_postcopy(from);
+
+    if (!got_stop) {
+        qtest_qmp_eventwait(from, "STOP");
+    }
+
+    qtest_qmp_eventwait(to, "RESUME");
+
+    wait_for_serial("dest_serial", TRUE);
+    wait_for_migration_complete(from);
+
+    g_free(uri);
+
+    test_migrate_end(from, to, true);
+}
+
 int main(int argc, char **argv)
 {
     char template[] = "/tmp/migration-test-XXXXXX";
@@ -604,6 +660,7 @@ int main(int argc, char **argv)
     module_call_init(MODULE_INIT_QOM);
 
     qtest_add_func("/migration/postcopy/unix", test_migrate);
+    qtest_add_func("/migration/postcopy/to_used", test_migrate_to_used);
     qtest_add_func("/migration/deprecated", test_deprecated);
     qtest_add_func("/migration/bad_dest", test_baddest);
 
-- 
2.16.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]