From: Juan Quintela <quintela@redhat.com>
To: qemu-devel@nongnu.org
Cc: Eric Blake <eblake@redhat.com>, Thomas Huth <thuth@redhat.com>,
Fabiano Rosas <farosas@suse.de>,
Leonardo Bras <leobras@redhat.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>,
Markus Armbruster <armbru@redhat.com>,
Peter Xu <peterx@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>,
Fam Zheng <fam@euphon.net>, Stefan Hajnoczi <stefanha@redhat.com>,
Li Zhijian <lizhijian@fujitsu.com>, John Snow <jsnow@redhat.com>,
qemu-block@nongnu.org, Cleber Rosa <crosa@redhat.com>,
Juan Quintela <quintela@redhat.com>,
Laurent Vivier <lvivier@redhat.com>
Subject: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration
Date: Tue, 17 Oct 2023 10:29:36 +0200 [thread overview]
Message-ID: <20231017083003.15951-12-quintela@redhat.com> (raw)
In-Reply-To: <20231017083003.15951-1-quintela@redhat.com>
From: Fabiano Rosas <farosas@suse.de>
Add basic tests for file-based migration.
Note that we cannot use test_precopy_common because that routine
expects it to be possible to run the migration live. With the file
transport there is no live migration because we must wait for the
source to finish writing the migration data to the file before the
destination can start reading. Add a new migration function
specifically to handle the file migration.
Reviewed-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Message-ID: <20230712190742.22294-7-farosas@suse.de>
---
tests/qtest/migration-test.c | 147 +++++++++++++++++++++++++++++++++++
1 file changed, 147 insertions(+)
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index cef5081f8c..e1c110537b 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -68,6 +68,10 @@ static bool got_dst_resume;
#define ANALYZE_SCRIPT "scripts/analyze-migration.py"
+#define QEMU_VM_FILE_MAGIC 0x5145564d
+#define FILE_TEST_FILENAME "migfile"
+#define FILE_TEST_OFFSET 0x1000
+
#if defined(__linux__)
#include <sys/syscall.h>
#include <sys/vfs.h>
@@ -884,6 +888,7 @@ static void test_migrate_end(QTestState *from, QTestState *to, bool test_dest)
cleanup("migsocket");
cleanup("src_serial");
cleanup("dest_serial");
+ cleanup(FILE_TEST_FILENAME);
}
#ifdef CONFIG_GNUTLS
@@ -1667,6 +1672,70 @@ finish:
test_migrate_end(from, to, args->result == MIG_TEST_SUCCEED);
}
+static void test_file_common(MigrateCommon *args, bool stop_src)
+{
+ QTestState *from, *to;
+ void *data_hook = NULL;
+ g_autofree char *connect_uri = g_strdup(args->connect_uri);
+
+ if (test_migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ return;
+ }
+
+ /*
+ * File migration is never live. We can keep the source VM running
+ * during migration, but the destination will not be running
+ * concurrently.
+ */
+ g_assert_false(args->live);
+
+ if (args->start_hook) {
+ data_hook = args->start_hook(from, to);
+ }
+
+ migrate_ensure_converge(from);
+ wait_for_serial("src_serial");
+
+ if (stop_src) {
+ qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
+ if (!got_src_stop) {
+ qtest_qmp_eventwait(from, "STOP");
+ }
+ }
+
+ if (args->result == MIG_TEST_QMP_ERROR) {
+ migrate_qmp_fail(from, connect_uri, "{}");
+ goto finish;
+ }
+
+ migrate_qmp(from, connect_uri, "{}");
+ wait_for_migration_complete(from);
+
+ /*
+ * We need to wait for the source to finish before starting the
+ * destination.
+ */
+ migrate_incoming_qmp(to, connect_uri, "{}");
+ wait_for_migration_complete(to);
+
+ if (stop_src) {
+ qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}");
+ }
+
+ if (!got_dst_resume) {
+ qtest_qmp_eventwait(to, "RESUME");
+ }
+
+ wait_for_serial("dest_serial");
+
+finish:
+ if (args->finish_hook) {
+ args->finish_hook(from, to, data_hook);
+ }
+
+ test_migrate_end(from, to, args->result == MIG_TEST_SUCCEED);
+}
+
static void test_precopy_unix_plain(void)
{
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
@@ -1862,6 +1931,76 @@ static void test_precopy_unix_compress_nowait(void)
test_precopy_common(&args);
}
+static void test_precopy_file(void)
+{
+ g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
+ FILE_TEST_FILENAME);
+ MigrateCommon args = {
+ .connect_uri = uri,
+ .listen_uri = "defer",
+ };
+
+ test_file_common(&args, true);
+}
+
+static void file_offset_finish_hook(QTestState *from, QTestState *to,
+ void *opaque)
+{
+#if defined(__linux__)
+ g_autofree char *path = g_strdup_printf("%s/%s", tmpfs, FILE_TEST_FILENAME);
+ size_t size = FILE_TEST_OFFSET + sizeof(QEMU_VM_FILE_MAGIC);
+ uintptr_t *addr, *p;
+ int fd;
+
+ fd = open(path, O_RDONLY);
+ g_assert(fd != -1);
+ addr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+ g_assert(addr != MAP_FAILED);
+
+ /*
+ * Ensure the skipped offset contains zeros and the migration
+ * stream starts at the right place.
+ */
+ p = addr;
+ while (p < addr + FILE_TEST_OFFSET / sizeof(uintptr_t)) {
+ g_assert(*p == 0);
+ p++;
+ }
+ g_assert_cmpint(cpu_to_be64(*p) >> 32, ==, QEMU_VM_FILE_MAGIC);
+
+ munmap(addr, size);
+ close(fd);
+#endif
+}
+
+static void test_precopy_file_offset(void)
+{
+ g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=%d", tmpfs,
+ FILE_TEST_FILENAME,
+ FILE_TEST_OFFSET);
+ MigrateCommon args = {
+ .connect_uri = uri,
+ .listen_uri = "defer",
+ .finish_hook = file_offset_finish_hook,
+ };
+
+ test_file_common(&args, false);
+}
+
+static void test_precopy_file_offset_bad(void)
+{
+ /* using a value not supported by qemu_strtosz() */
+ g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=0x20M",
+ tmpfs, FILE_TEST_FILENAME);
+ MigrateCommon args = {
+ .connect_uri = uri,
+ .listen_uri = "defer",
+ .result = MIG_TEST_QMP_ERROR,
+ };
+
+ test_file_common(&args, false);
+}
+
static void test_precopy_tcp_plain(void)
{
MigrateCommon args = {
@@ -2909,6 +3048,14 @@ int main(int argc, char **argv)
qtest_add_func("/migration/precopy/unix/compress/nowait",
test_precopy_unix_compress_nowait);
}
+
+ qtest_add_func("/migration/precopy/file",
+ test_precopy_file);
+ qtest_add_func("/migration/precopy/file/offset",
+ test_precopy_file_offset);
+ qtest_add_func("/migration/precopy/file/offset/bad",
+ test_precopy_file_offset_bad);
+
#ifdef CONFIG_GNUTLS
qtest_add_func("/migration/precopy/unix/tls/psk",
test_precopy_unix_tls_psk);
--
2.41.0
next prev parent reply other threads:[~2023-10-17 8:38 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-17 8:29 [PULL 00/38] Migration 20231017 patches Juan Quintela
2023-10-17 8:29 ` [PULL 01/38] migration: refactor migration_completion Juan Quintela
2023-10-17 8:29 ` [PULL 02/38] migration: Use g_autofree to simplify ram_dirty_bitmap_reload() Juan Quintela
2023-10-17 8:29 ` [PULL 03/38] migration: Allow user to specify available switchover bandwidth Juan Quintela
2023-10-17 8:29 ` [PULL 04/38] migration: fix RAMBlock add NULL check Juan Quintela
2023-10-17 8:29 ` [PULL 05/38] migration: Add the configuration vmstate to the json writer Juan Quintela
2023-10-17 8:29 ` [PULL 06/38] migration: Fix analyze-migration.py 'configuration' parsing Juan Quintela
2023-10-17 8:29 ` [PULL 07/38] migration: Add capability parsing to analyze-migration.py Juan Quintela
2023-10-17 8:29 ` [PULL 08/38] migration: Fix analyze-migration.py when ignore-shared is used Juan Quintela
2023-10-17 8:29 ` [PULL 09/38] migration: Fix analyze-migration read operation signedness Juan Quintela
2023-10-17 8:29 ` [PULL 10/38] tests/qtest/migration: Add a test for the analyze-migration script Juan Quintela
2024-05-21 12:24 ` Alex Bennée
2024-05-21 12:46 ` Fabiano Rosas
2024-05-22 5:36 ` Thomas Huth
2024-05-22 12:48 ` Fabiano Rosas
2024-05-22 13:00 ` Thomas Huth
2024-05-22 14:11 ` Alex Bennée
2023-10-17 8:29 ` Juan Quintela [this message]
2023-10-17 8:29 ` [PULL 12/38] migration: hold the BQL during setup Juan Quintela
2023-10-17 8:29 ` [PULL 13/38] migration: Non multifd migration don't care about multifd flushes Juan Quintela
2023-10-19 11:47 ` Michael Tokarev
2023-10-19 12:03 ` Juan Quintela
2023-10-17 8:29 ` [PULL 14/38] migration: Create migrate_rdma() Juan Quintela
2023-10-17 8:29 ` [PULL 15/38] migration/rdma: Unfold ram_control_before_iterate() Juan Quintela
2023-10-17 8:29 ` [PULL 16/38] migration/rdma: Unfold ram_control_after_iterate() Juan Quintela
2023-10-17 8:29 ` [PULL 17/38] migration/rdma: Remove all uses of RAM_CONTROL_HOOK Juan Quintela
2023-10-17 8:29 ` [PULL 18/38] migration/rdma: Unfold hook_ram_load() Juan Quintela
2023-10-17 8:29 ` [PULL 19/38] migration/rdma: Create rdma_control_save_page() Juan Quintela
2023-10-17 8:29 ` [PULL 20/38] qemu-file: Remove QEMUFileHooks Juan Quintela
2023-10-17 8:29 ` [PULL 21/38] migration/rdma: Move rdma constants from qemu-file.h to rdma.h Juan Quintela
2023-10-17 8:29 ` [PULL 22/38] migration/rdma: Remove qemu_ prefix from exported functions Juan Quintela
2023-10-17 8:29 ` [PULL 23/38] migration/rdma: Check sooner if we are in postcopy for save_page() Juan Quintela
2023-10-17 8:29 ` [PULL 24/38] migration/rdma: Use i as for index instead of idx Juan Quintela
2023-10-17 8:29 ` [PULL 25/38] migration/rdma: Declare for index variables local Juan Quintela
2023-10-17 8:29 ` [PULL 26/38] migration/rdma: Remove all "ret" variables that are used only once Juan Quintela
2023-10-17 8:29 ` [PULL 27/38] migration: Improve json and formatting Juan Quintela
2023-10-17 8:29 ` [PULL 28/38] migration: check for rate_limit_max for RATE_LIMIT_DISABLED Juan Quintela
2023-10-17 8:29 ` [PULL 29/38] multifd: fix counters in multifd_send_thread Juan Quintela
2023-10-17 8:29 ` [PULL 30/38] multifd: reset next_packet_len after sending pages Juan Quintela
2023-10-17 8:29 ` [PULL 31/38] migration/ram: Refactor precopy ram loading code Juan Quintela
2023-10-17 8:29 ` [PULL 32/38] migration/ram: Remove RAMState from xbzrle_cache_zero_page Juan Quintela
2023-10-17 8:29 ` [PULL 33/38] migration/ram: Stop passing QEMUFile around in save_zero_page Juan Quintela
2023-10-17 8:29 ` [PULL 34/38] migration/ram: Move xbzrle zero page handling into save_zero_page Juan Quintela
2023-10-17 8:30 ` [PULL 35/38] migration/ram: Merge save_zero_page functions Juan Quintela
2023-10-17 8:30 ` [PULL 36/38] migration/multifd: Remove direct "socket" references Juan Quintela
2023-10-17 8:30 ` [PULL 37/38] migration/multifd: Unify multifd_send_thread error paths Juan Quintela
2023-10-17 8:30 ` [PULL 38/38] migration/multifd: Clarify Error usage in multifd_channel_connect Juan Quintela
2023-10-17 19:04 ` [PULL 00/38] Migration 20231017 patches Stefan Hajnoczi
-- strict thread matches above, loose matches on Subject: below --
2023-10-16 10:06 [PULL 00/38] Migration 20231016 patches Juan Quintela
2023-10-16 10:06 ` [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration Juan Quintela
2023-10-16 18:25 ` Fabiano Rosas
2023-10-17 7:21 ` Juan Quintela
2023-10-17 12:30 ` Fabiano Rosas
2023-10-17 12:55 ` Juan Quintela
2023-10-17 13:19 ` Fabiano Rosas
2023-10-17 13:30 ` Juan Quintela
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=20231017083003.15951-12-quintela@redhat.com \
--to=quintela@redhat.com \
--cc=armbru@redhat.com \
--cc=crosa@redhat.com \
--cc=eblake@redhat.com \
--cc=fam@euphon.net \
--cc=farosas@suse.de \
--cc=jsnow@redhat.com \
--cc=leobras@redhat.com \
--cc=lizhijian@fujitsu.com \
--cc=lvivier@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=thuth@redhat.com \
--cc=vsementsov@yandex-team.ru \
/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).