[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based m
From: |
Fabiano Rosas |
Subject: |
Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration |
Date: |
Mon, 16 Oct 2023 15:25:00 -0300 |
Juan Quintela <quintela@redhat.com> writes:
> 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..da02b6d692 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_be32(*p), ==, QEMU_VM_FILE_MAGIC);
This truncates to 32-bits, so it breaks on a BE host. We need this:
-->8--
>From ea0c2d1c988add48d9754891a9fc7f6854a9718a Mon Sep 17 00:00:00 2001
From: Fabiano Rosas <farosas@suse.de>
Date: Mon, 16 Oct 2023 15:21:49 -0300
Subject: [PATCH] fixup! tests/qtest: migration-test: Add tests for file-based
migration
---
tests/qtest/migration-test.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index da02b6d692..e1c110537b 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -1966,7 +1966,7 @@ static void file_offset_finish_hook(QTestState *from,
QTestState *to,
g_assert(*p == 0);
p++;
}
- g_assert_cmpint(cpu_to_be32(*p), ==, QEMU_VM_FILE_MAGIC);
+ g_assert_cmpint(cpu_to_be64(*p) >> 32, ==, QEMU_VM_FILE_MAGIC);
munmap(addr, size);
close(fd);
--
2.35.3
- [PULL 07/38] migration: Add capability parsing to analyze-migration.py, (continued)
- [PULL 07/38] migration: Add capability parsing to analyze-migration.py, Juan Quintela, 2023/10/16
- [PULL 05/38] migration: Add the configuration vmstate to the json writer, Juan Quintela, 2023/10/16
- [PULL 08/38] migration: Fix analyze-migration.py when ignore-shared is used, Juan Quintela, 2023/10/16
- [PULL 12/38] migration: hold the BQL during setup, Juan Quintela, 2023/10/16
- [PULL 13/38] migration: Non multifd migration don't care about multifd flushes, Juan Quintela, 2023/10/16
- [PULL 14/38] migration: Create migrate_rdma(), Juan Quintela, 2023/10/16
- [PULL 15/38] migration/rdma: Unfold ram_control_before_iterate(), Juan Quintela, 2023/10/16
- [PULL 09/38] migration: Fix analyze-migration read operation signedness, Juan Quintela, 2023/10/16
- [PULL 10/38] tests/qtest/migration: Add a test for the analyze-migration script, Juan Quintela, 2023/10/16
- [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Juan Quintela, 2023/10/16
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration,
Fabiano Rosas <=
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Juan Quintela, 2023/10/17
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Fabiano Rosas, 2023/10/17
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Juan Quintela, 2023/10/17
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Fabiano Rosas, 2023/10/17
- Re: [PULL 11/38] tests/qtest: migration-test: Add tests for file-based migration, Juan Quintela, 2023/10/17
[PULL 18/38] migration/rdma: Unfold hook_ram_load(), Juan Quintela, 2023/10/16
[PULL 16/38] migration/rdma: Unfold ram_control_after_iterate(), Juan Quintela, 2023/10/16
[PULL 20/38] qemu-file: Remove QEMUFileHooks, Juan Quintela, 2023/10/16
[PULL 19/38] migration/rdma: Create rdma_control_save_page(), Juan Quintela, 2023/10/16
[PULL 23/38] migration/rdma: Check sooner if we are in postcopy for save_page(), Juan Quintela, 2023/10/16