qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Steve Sistare <steven.sistare@oracle.com>
Cc: qemu-devel@nongnu.org, Fabiano Rosas <farosas@suse.de>,
	David Hildenbrand <david@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	Eduardo Habkost <eduardo@habkost.net>,
	Philippe Mathieu-Daude <philmd@linaro.org>,
	Paolo Bonzini <pbonzini@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Markus Armbruster <armbru@redhat.com>
Subject: Re: [PATCH V5 22/23] migration-test: cpr-transfer
Date: Tue, 24 Dec 2024 15:06:19 -0500	[thread overview]
Message-ID: <Z2sUO7OoX7UK-DPY@x1n> (raw)
In-Reply-To: <Z2sTHg-t0wB4g3Mh@x1n>

On Tue, Dec 24, 2024 at 03:01:34PM -0500, 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.sistare@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..
> 
> > +
> > +    MigrateCommon args = {
> > +        .start.opts_source = opts,
> > +        .start.opts_target = opts_target,
> > +        .start.defer_target_connect = true,

One more comment: maybe we can even drop defer_target_connect.  I don't
expect any non-cpr test to use it.. so introducing the parameter may only
complicate MigrateCommon struct with almost zero benefit to be reused.

If to drop it, we could detect "cpr" channel in test_precopy_common() and
only defer the connection if "cpr" channel is present.

> > +        .start.memory_backend = "-object memory-backend-memfd,id=pc.ram,size=%s"
> > +                                " -machine memory-backend=pc.ram",
> > +        .listen_uri = incoming_defer ? "defer" : uri,
> > +        .connect_channels = connect_channels,
> > +        .cpr_channel = cpr_channel,
> > +        .start_hook = test_mode_transfer_start,
> > +    };
> > +
> > +    test_precopy_common(&args);
> > +}
> > +
> > +static void test_mode_transfer(void)
> > +{
> > +    test_mode_transfer_common(NULL);
> > +}
> > +
> > +static void test_mode_transfer_defer(void)
> > +{
> > +    test_mode_transfer_common(true);
> > +}
> > +
> >  void migration_test_add_cpr(MigrationTestEnv *env)
> >  {
> >      tmpfs = env->tmpfs;
> > @@ -55,4 +111,8 @@ void migration_test_add_cpr(MigrationTestEnv *env)
> >      if (getenv("QEMU_TEST_FLAKY_TESTS")) {
> >          migration_test_add("/migration/mode/reboot", test_mode_reboot);
> >      }
> > +
> > +    migration_test_add("/migration/mode/transfer", test_mode_transfer);
> > +    migration_test_add("/migration/mode/transfer/defer",
> > +                       test_mode_transfer_defer);
> >  }
> > diff --git a/tests/qtest/migration/framework.c b/tests/qtest/migration/framework.c
> > index c6ea3e1..f6175de 100644
> > --- a/tests/qtest/migration/framework.c
> > +++ b/tests/qtest/migration/framework.c
> > @@ -411,6 +411,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);
> > @@ -692,8 +693,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;
> >      }
> > @@ -725,8 +729,20 @@ 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) {
> > +        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);
> > +        }
> 
> ... here IIUC we don't need this trick to manipulate the qlist anymore?
> 
> Looks like if with that (convert the current cpr_connect string to JSON
> format, attach it with connect_channels), then we also don't need the
> pre-requisite patch to make connect_channels manipulate-able. Not sure.
> 
> >      }
> >  
> >      if (args->result == MIG_TEST_QMP_ERROR) {
> > @@ -739,6 +755,9 @@ void test_precopy_common(MigrateCommon *args)
> >      if (args->start.defer_target_connect) {
> >          qtest_connect(to);
> >          qtest_qmp_handshake(to);
> > +        if (!strcmp(args->listen_uri, "defer")) {
> > +            migrate_incoming_qmp(to, args->connect_uri, in_channels, "{}");
> > +        }
> >      }
> >  
> >      if (args->result != MIG_TEST_SUCCEED) {
> > diff --git a/tests/qtest/migration/framework.h b/tests/qtest/migration/framework.h
> > index 1341368..4678e2a 100644
> > --- a/tests/qtest/migration/framework.h
> > +++ b/tests/qtest/migration/framework.h
> > @@ -152,6 +152,9 @@ 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 */
> > -- 
> > 1.8.3.1
> > 
> 
> -- 
> Peter Xu

-- 
Peter Xu



  reply	other threads:[~2024-12-24 20:08 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-24 16:16 [PATCH V5 00/23] Live update: cpr-transfer Steve Sistare
2024-12-24 16:16 ` [PATCH V5 01/23] backends/hostmem-shm: factor out allocation of "anonymous shared memory with an fd" Steve Sistare
2024-12-24 16:56   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 02/23] physmem: qemu_ram_alloc_from_fd extensions Steve Sistare
2024-12-24 17:18   ` Peter Xu
2025-01-02 18:36     ` Steven Sistare
2025-01-02 19:48       ` Peter Xu
2025-01-02 20:03         ` Steven Sistare
2024-12-24 16:16 ` [PATCH V5 03/23] physmem: fd-based shared memory Steve Sistare
2024-12-24 17:27   ` Peter Xu
2025-01-02 18:34     ` Steven Sistare
2024-12-24 16:16 ` [PATCH V5 04/23] memory: add RAM_PRIVATE Steve Sistare
2024-12-24 16:16 ` [PATCH V5 05/23] machine: aux-ram-share option Steve Sistare
2024-12-24 16:16 ` [PATCH V5 06/23] migration: cpr-state Steve Sistare
2024-12-24 16:16 ` [PATCH V5 07/23] physmem: preserve ram blocks for cpr Steve Sistare
2024-12-24 17:32   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 08/23] hostmem-memfd: preserve " Steve Sistare
2024-12-24 16:16 ` [PATCH V5 09/23] hostmem-shm: " Steve Sistare
2024-12-24 16:16 ` [PATCH V5 10/23] migration: enhance migrate_uri_parse Steve Sistare
2024-12-24 17:48   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 11/23] migration: incoming channel Steve Sistare
2024-12-24 17:51   ` Peter Xu
2024-12-24 16:16 ` [PATCH V5 12/23] migration: SCM_RIGHTS for QEMUFile Steve Sistare
2024-12-24 16:16 ` [PATCH V5 13/23] migration: VMSTATE_FD Steve Sistare
2024-12-24 16:16 ` [PATCH V5 14/23] migration: cpr-transfer save and load Steve Sistare
2024-12-24 16:17 ` [PATCH V5 15/23] migration: cpr-transfer mode Steve Sistare
2024-12-24 19:24   ` Peter Xu
2025-01-02 19:21     ` Steven Sistare
2025-01-02 19:57       ` Peter Xu
2025-01-02 20:05         ` Steven Sistare
2025-01-07 12:05   ` Markus Armbruster
2025-01-07 15:38     ` Steven Sistare
2025-01-17 13:44       ` Markus Armbruster
2025-01-27 16:35         ` Steven Sistare
2025-01-28 11:56           ` Markus Armbruster
2025-01-28 21:19             ` Steven Sistare
2025-01-28 21:30             ` Steven Sistare
2025-01-29  6:19   ` Markus Armbruster
2024-12-24 16:17 ` [PATCH V5 16/23] migration-test: memory_backend Steve Sistare
2024-12-24 16:17 ` [PATCH V5 17/23] tests/qtest: optimize migrate_set_ports Steve Sistare
2024-12-24 19:26   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 18/23] tests/qtest: defer connection Steve Sistare
2024-12-24 19:27   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 19/23] migration-test: " Steve Sistare
2024-12-24 16:17 ` [PATCH V5 20/23] tests/qtest: enhance migration channels Steve Sistare
2024-12-24 19:48   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 21/23] tests/qtest: assert qmp_ready Steve Sistare
2024-12-24 19:54   ` Peter Xu
2025-01-02 18:36     ` Steven Sistare
2024-12-24 16:17 ` [PATCH V5 22/23] migration-test: cpr-transfer Steve Sistare
2024-12-24 20:01   ` Peter Xu
2024-12-24 20:06     ` Peter Xu [this message]
2025-01-02 18:35       ` Steven Sistare
2025-01-02 20:11         ` Peter Xu
2025-01-02 18:35     ` Steven Sistare
2025-01-02 20:09       ` Peter Xu
2025-01-02 20:12   ` Peter Xu
2024-12-24 16:17 ` [PATCH V5 23/23] migration: cpr-transfer documentation Steve Sistare
2024-12-24 20:02   ` Peter Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z2sUO7OoX7UK-DPY@x1n \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=david@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=farosas@suse.de \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=steven.sistare@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).