tests/qtest/migration: Add a precopy file test with fdset

Add a test for file migration using fdset. The passing of fds is more
complex than using a file path. This is also the scenario where it's
most important we ensure that the initial migration stream offset is
respected because the fdset interface is the one used by the
management layer when providing a non empty migration file.

Note that fd passing is not available on Windows, so anything that
uses add-fd needs to exclude that platform.

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Fabiano Rosas 2024-06-17 15:57:19 -03:00
parent 55fc0c2f68
commit 926554c0bf

View File

@ -1990,6 +1990,46 @@ static void test_precopy_file(void)
test_file_common(&args, true); test_file_common(&args, true);
} }
#ifndef _WIN32
static void fdset_add_fds(QTestState *qts, const char *file, int flags,
int num_fds)
{
for (int i = 0; i < num_fds; i++) {
int fd;
fd = open(file, flags, 0660);
assert(fd != -1);
qtest_qmp_fds_assert_success(qts, &fd, 1, "{'execute': 'add-fd', "
"'arguments': {'fdset-id': 1}}");
close(fd);
}
}
static void *file_offset_fdset_start_hook(QTestState *from, QTestState *to)
{
g_autofree char *file = g_strdup_printf("%s/%s", tmpfs, FILE_TEST_FILENAME);
fdset_add_fds(from, file, O_WRONLY, 1);
fdset_add_fds(to, file, O_RDONLY, 1);
return NULL;
}
static void test_precopy_file_offset_fdset(void)
{
g_autofree char *uri = g_strdup_printf("file:/dev/fdset/1,offset=%d",
FILE_TEST_OFFSET);
MigrateCommon args = {
.connect_uri = uri,
.listen_uri = "defer",
.start_hook = file_offset_fdset_start_hook,
};
test_file_common(&args, false);
}
#endif
static void test_precopy_file_offset(void) static void test_precopy_file_offset(void)
{ {
g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=%d", tmpfs, g_autofree char *uri = g_strdup_printf("file:%s/%s,offset=%d", tmpfs,
@ -3527,6 +3567,10 @@ int main(int argc, char **argv)
test_precopy_file); test_precopy_file);
migration_test_add("/migration/precopy/file/offset", migration_test_add("/migration/precopy/file/offset",
test_precopy_file_offset); test_precopy_file_offset);
#ifndef _WIN32
migration_test_add("/migration/precopy/file/offset/fdset",
test_precopy_file_offset_fdset);
#endif
migration_test_add("/migration/precopy/file/offset/bad", migration_test_add("/migration/precopy/file/offset/bad",
test_precopy_file_offset_bad); test_precopy_file_offset_bad);