diff options
| author | Steve Sistare <steven.sistare@oracle.com> | 2025-01-15 11:00:49 -0800 |
|---|---|---|
| committer | Fabiano Rosas <farosas@suse.de> | 2025-01-29 11:56:39 -0300 |
| commit | 360b5d773be1fcc25579abce0f5d2b6e1922327a (patch) | |
| tree | b47edce15281b1a8ffcfc6f3d7f77c952196ac45 /tests/qtest/migration/framework.c | |
| parent | e6c18b996e6c3a41c9a028f325d293d6740e52b2 (diff) | |
| download | focaccia-qemu-360b5d773be1fcc25579abce0f5d2b6e1922327a.tar.gz focaccia-qemu-360b5d773be1fcc25579abce0f5d2b6e1922327a.zip | |
migration-test: cpr-transfer
Add a migration test for cpr-transfer mode. Defer the connection to the target monitor, else the test hangs because in cpr-transfer mode QEMU does not listen for monitor connections until we send the migrate command to source QEMU. To test -incoming defer, send a migrate incoming command to the target, after sending the migrate command to the source, as required by cpr-transfer mode. Signed-off-by: Steve Sistare <steven.sistare@oracle.com> Reviewed-by: Peter Xu <peterx@redhat.com> Link: https://lore.kernel.org/r/1736967650-129648-24-git-send-email-steven.sistare@oracle.com [only allocate in_channels when needed] Signed-off-by: Fabiano Rosas <farosas@suse.de>
Diffstat (limited to 'tests/qtest/migration/framework.c')
| -rw-r--r-- | tests/qtest/migration/framework.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c index 1228bd5bca..de65bfe40d 100644 --- a/tests/qtest/migration/framework.c +++ b/tests/qtest/migration/framework.c @@ -420,6 +420,7 @@ void migrate_end(QTestState *from, QTestState *to, bool test_dest) qtest_quit(to); cleanup("migsocket"); + cleanup("cpr.sock"); cleanup("src_serial"); cleanup("dest_serial"); cleanup(FILE_TEST_FILENAME); @@ -707,8 +708,11 @@ void test_precopy_common(MigrateCommon *args) { QTestState *from, *to; void *data_hook = NULL; + QObject *in_channels = NULL; QObject *out_channels = NULL; + g_assert(!args->cpr_channel || args->connect_channels); + if (migrate_start(&from, &to, args->listen_uri, &args->start)) { return; } @@ -740,8 +744,24 @@ void test_precopy_common(MigrateCommon *args) } } + /* + * The cpr channel must be included in outgoing channels, but not in + * migrate-incoming channels. + */ if (args->connect_channels) { + if (args->start.defer_target_connect && + !strcmp(args->listen_uri, "defer")) { + in_channels = qobject_from_json(args->connect_channels, + &error_abort); + } out_channels = qobject_from_json(args->connect_channels, &error_abort); + + if (args->cpr_channel) { + QList *channels_list = qobject_to(QList, out_channels); + QObject *obj = migrate_str_to_channel(args->cpr_channel); + + qlist_append(channels_list, obj); + } } if (args->result == MIG_TEST_QMP_ERROR) { @@ -754,6 +774,9 @@ void test_precopy_common(MigrateCommon *args) if (args->start.defer_target_connect) { qtest_connect(to); qtest_qmp_handshake(to, NULL); + if (!strcmp(args->listen_uri, "defer")) { + migrate_incoming_qmp(to, args->connect_uri, in_channels, "{}"); + } } if (args->result != MIG_TEST_SUCCEED) { |