On Thu, Jan 02, 2025 at 01:35:01PM -0500, Steven Sistare wrote: > On 12/24/2024 3:01 PM, Peter Xu wrote: > > On Tue, Dec 24, 2024 at 08:17:07AM -0800, Steve Sistare wrote: > > > 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.sist...@oracle.com> > > > --- > > > tests/qtest/migration/cpr-tests.c | 60 > > > +++++++++++++++++++++++++++++++++++++++ > > > tests/qtest/migration/framework.c | 19 +++++++++++++ > > > tests/qtest/migration/framework.h | 3 ++ > > > 3 files changed, 82 insertions(+) > > > > > > diff --git a/tests/qtest/migration/cpr-tests.c > > > b/tests/qtest/migration/cpr-tests.c > > > index 44ce89a..b221980 100644 > > > --- a/tests/qtest/migration/cpr-tests.c > > > +++ b/tests/qtest/migration/cpr-tests.c > > > @@ -44,6 +44,62 @@ static void test_mode_reboot(void) > > > test_file_common(&args, true); > > > } > > > +static void *test_mode_transfer_start(QTestState *from, QTestState *to) > > > +{ > > > + migrate_set_parameter_str(from, "mode", "cpr-transfer"); > > > + return NULL; > > > +} > > > + > > > +/* > > > + * cpr-transfer mode cannot use the target monitor prior to starting the > > > + * migration, and cannot connect synchronously to the monitor, so defer > > > + * the target connection. > > > + */ > > > +static void test_mode_transfer_common(bool incoming_defer) > > > +{ > > > + g_autofree char *cpr_path = g_strdup_printf("%s/cpr.sock", tmpfs); > > > + g_autofree char *mig_path = g_strdup_printf("%s/migsocket", tmpfs); > > > + g_autofree char *uri = g_strdup_printf("unix:%s", mig_path); > > > + > > > + const char *opts = "-machine aux-ram-share=on -nodefaults"; > > > + g_autofree const char *cpr_channel = g_strdup_printf( > > > + "cpr,addr.transport=socket,addr.type=unix,addr.path=%s", > > > + cpr_path); > > > + g_autofree char *opts_target = g_strdup_printf("-incoming %s %s", > > > + cpr_channel, opts); > > > + > > > + g_autofree char *connect_channels = g_strdup_printf( > > > + "[ { 'channel-type': 'main'," > > > + " 'addr': { 'transport': 'socket'," > > > + " 'type': 'unix'," > > > + " 'path': '%s' } } ]", > > > + mig_path); > > > > So this test already uses json-format channels, IMHO we probably don't need > > MigrateCommon.cpr_channel anymore? We could put them all here. Then.. > > The previous version of this patch did that, and did not define cpr_channel, > but you did not like how, in addition to using args->connect_channels, I > defined the main uri in args->connect_uri and passed it to > migrate_incoming_qmp. > > The constraint I must satisfy is that main + cpr channels must be passed to > migrate_qmp, but only the main channel can be passed to migrate_incoming_qmp.
Hmm true, I see now. > > I could instead define an optional args->incoming_channels, passed to > migrate_incoming_qmp, and only set by cpr. Then the channel parsing > extensions > could be eliminated. > > This current patch with its channel parsing support does make > test_mode_transfer_common nicer in one way: the cpr channel is only described > once, in dotted keys format. A V6 that defines args->incoming_channels will > need to define it once using dotted keys, to be embedded in startup args, and > again in json in args->connect_uri. > > I don't feel strongly either way: keep V5, or define incoming_channels. Me too, please choose whatever easier for you. Thanks, -- Peter Xu