Jaehoon Kim <jh...@linux.ibm.com> writes:

Hi,

These patches should be the other way around, first add the support,
then add the test.

> When the source VM attempts to connect to the destination VM's Unix
> domain socket (cpr.sock) during a cpr-transfer test, race conditions can
> occur if the socket file isn't ready. This can lead to connection
> failures when running tests.
>
> This patch creates and listens on the socket in advance, and passes the
> pre-listened FD directly. This avoids timing issues and improves the
> reliability of CPR tests.
>
> Reviewed-by: Jason J. Herne <jjhe...@linux.ibm.com>
> Signed-off-by: Jaehoon Kim <jh...@linux.ibm.com>
> ---
>  tests/qtest/migration/cpr-tests.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/tests/qtest/migration/cpr-tests.c 
> b/tests/qtest/migration/cpr-tests.c
> index 5536e14610..145860c24c 100644
> --- a/tests/qtest/migration/cpr-tests.c
> +++ b/tests/qtest/migration/cpr-tests.c
> @@ -60,13 +60,12 @@ 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);
> +    g_autofree char *opts_target;
>  
>      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',"
> @@ -75,6 +74,17 @@ static void test_mode_transfer_common(bool incoming_defer)
>          "              'path': '%s' } } ]",
>          mig_path);
>  
> +    /*
> +     * Set up a UNIX domain socket for the CPR channel before
> +     * launching the destination VM, to avoid timing issues
> +     * during connection setup.
> +     */
> +    int cpr_sockfd = qtest_socket_server(cpr_path);
> +    g_assert(cpr_sockfd >= 0);
> +
> +    opts_target = g_strdup_printf("-incoming cpr,addr.transport=socket,"
> +                                  "addr.type=fd,addr.str=%s %s",
> +                                  g_strdup_printf("%d", cpr_sockfd), opts);

The sockfd string will leak.

>      MigrateCommon args = {
>          .start.opts_source = opts,
>          .start.opts_target = opts_target,

Reply via email to