From: Fabiano Rosas <farosas@suse.de>
There's some amount of cpr-transfer logic at precopy_common, which in
retrospect was a bad idea. For just two tests, that's too much code to
be in the common function. Move it to the cpr file. We'll need this
cleanup for subsequent improvements.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Peter Xu <peterx@redhat.com>
Link: https://lore.kernel.org/r/20260505160915.25558-2-farosas@suse.de
Signed-off-by: Peter Xu <peterx@redhat.com>
---
tests/qtest/migration/framework.h | 3 --
tests/qtest/migration/cpr-tests.c | 57 ++++++++++++++++++++++++++++---
tests/qtest/migration/framework.c | 36 +++----------------
3 files changed, 56 insertions(+), 40 deletions(-)
diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
index bb534b8110..3ccc6a99d2 100644
--- a/tests/qtest/migration/framework.h
+++ b/tests/qtest/migration/framework.h
@@ -181,9 +181,6 @@ typedef struct {
*/
const char *connect_channels;
- /* Optional: the cpr migration channel, in JSON or dotted keys format */
- const char *cpr_channel;
-
/* Optional: callback to run at start to set migration parameters */
TestMigrateStartHook start_hook;
/* Optional: callback to run at finish to cleanup */
diff --git a/tests/qtest/migration/cpr-tests.c b/tests/qtest/migration/cpr-tests.c
index 63ca5f3996..48c98f0089 100644
--- a/tests/qtest/migration/cpr-tests.c
+++ b/tests/qtest/migration/cpr-tests.c
@@ -15,6 +15,9 @@
#include "migration/framework.h"
#include "migration/migration-qmp.h"
#include "migration/migration-util.h"
+#include "qapi/error.h"
+#include "qobject/qjson.h"
+#include "qobject/qlist.h"
static char *tmpfs;
@@ -42,10 +45,56 @@ static void test_mode_reboot(char *name, MigrateCommon *args)
test_file_common(args, true);
}
-static void *test_mode_transfer_start(QTestState *from, QTestState *to)
+static int test_transfer(MigrateCommon *args, const char *cpr_channel,
+ bool incoming_defer)
{
+ QTestState *from, *to;
+ QObject *obj, *out_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+ QList *channels_list;
+
+ /*
+ * The cpr channel must be included in outgoing channels, but not in
+ * migrate-incoming channels.
+ */
+ channels_list = qobject_to(QList, out_channels);
+ obj = migrate_str_to_channel(cpr_channel);
+ qlist_append(channels_list, obj);
+
+ if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
+ return -1;
+ }
+
migrate_set_parameter_str(from, "mode", "cpr-transfer");
- return NULL;
+
+ wait_for_serial("src_serial");
+
+ qtest_qmp_assert_success(from, "{ 'execute' : 'stop'}");
+ wait_for_stop(from, get_src());
+ migrate_ensure_converge(from);
+
+ migrate_qmp(from, to, NULL, out_channels, "{}");
+
+ qtest_connect(to);
+ qtest_qmp_handshake(to, NULL);
+ if (incoming_defer) {
+ QObject *in_channels = qobject_from_json(args->connect_channels,
+ &error_abort);
+
+ migrate_incoming_qmp(to, NULL, in_channels, "{}");
+ }
+
+ wait_for_migration_complete(from);
+ wait_for_migration_complete(to);
+
+ qtest_qmp_assert_success(to, "{ 'execute' : 'cont'}");
+
+ wait_for_resume(to, get_dst());
+ wait_for_serial("dest_serial");
+
+ migrate_end(from, to, true);
+
+ return 0;
}
/*
@@ -86,15 +135,13 @@ static void test_mode_transfer_common(MigrateCommon *args, bool incoming_defer)
args->listen_uri = incoming_defer ? "defer" : uri;
args->connect_channels = connect_channels;
- args->cpr_channel = cpr_channel;
- args->start_hook = test_mode_transfer_start;
args->start.opts_source = opts;
args->start.opts_target = opts_target;
args->start.defer_target_connect = true;
args->start.mem_type = MEM_TYPE_MEMFD;
- if (test_precopy_common(args) < 0) {
+ if (test_transfer(args, cpr_channel, incoming_defer) < 0) {
close(cpr_sockfd);
unlink(cpr_path);
}
diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
index 49c7f37e60..4cd07be1d5 100644
--- a/tests/qtest/migration/framework.c
+++ b/tests/qtest/migration/framework.c
@@ -20,7 +20,6 @@
#include "ppc-util.h"
#include "qapi/error.h"
#include "qobject/qjson.h"
-#include "qobject/qlist.h"
#include "qemu/bswap.h"
#include "qemu/module.h"
#include "qemu/option.h"
@@ -833,10 +832,7 @@ int 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);
+ QObject *channels = NULL;
if (migrate_start(&from, &to, args->listen_uri, &args->start)) {
return -1;
@@ -869,40 +865,16 @@ int 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);
- }
+ channels = qobject_from_json(args->connect_channels, &error_abort);
}
if (args->result == MIG_TEST_QMP_ERROR) {
- migrate_qmp_fail(from, args->connect_uri, out_channels, "{}");
+ migrate_qmp_fail(from, args->connect_uri, channels, "{}");
goto finish;
}
- migrate_qmp(from, to, args->connect_uri, out_channels, "{}");
-
- 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, "{}");
- }
- }
+ migrate_qmp(from, to, args->connect_uri, channels, "{}");
if (args->result != MIG_TEST_SUCCEED) {
bool allow_active = args->result == MIG_TEST_FAIL;
--
2.53.0