All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Juan Quintela <quintela@redhat.com>
Cc: Laurent Vivier <lvivier@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Thomas Huth <thuth@redhat.com>,
	qemu-devel@nongnu.org
Subject: Re: [PATCH v2 3/3] migration-test: Make sure that multifd and cancel works
Date: Tue, 7 Jan 2020 11:49:02 +0000	[thread overview]
Message-ID: <20200107114902.GF2732@work-vm> (raw)
In-Reply-To: <871rsbsd53.fsf@trasno.org>

* Juan Quintela (quintela@redhat.com) wrote:
> "Dr. David Alan Gilbert" <dgilbert@redhat.com> wrote:
> > * Juan Quintela (quintela@redhat.com) wrote:
> >> Test that this sequerce works:
> >> 
> >> - launch source
> >> - launch target
> >> - start migration
> >> - cancel migration
> >> - relaunch target
> >> - do migration again
> >> 
> >> Signed-off-by: Juan Quintela <quintela@redhat.com>
> >> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> >> Signed-off-by: Juan Quintela <quintela@redhat.com>
> >> 
> >> ---
> >> 
> >> - Wait for 1st trhead to move to cancelled before launching second
> >>   migration
> >> - Add 'to2' parameter to diferentiate 1st and second target.
> >> ---
> >>  tests/migration-test.c | 110 ++++++++++++++++++++++++++++++++++++++++-
> >>  1 file changed, 109 insertions(+), 1 deletion(-)
> >> 
> >> diff --git a/tests/migration-test.c b/tests/migration-test.c
> >> index 1a8d06718e..7a833d65ce 100644
> >> --- a/tests/migration-test.c
> >> +++ b/tests/migration-test.c
> >> @@ -387,6 +387,14 @@ static void migrate_recover(QTestState *who, const char *uri)
> >>      qobject_unref(rsp);
> >>  }
> >>  
> >> +static void migrate_cancel(QTestState *who)
> >> +{
> >> +    QDict *rsp;
> >> +
> >> +    rsp = wait_command(who, "{ 'execute': 'migrate_cancel' }");
> >> +    qobject_unref(rsp);
> >> +}
> >> +
> >>  static void migrate_set_capability(QTestState *who, const char *capability,
> >>                                     bool value)
> >>  {
> >> @@ -419,6 +427,8 @@ static void migrate_postcopy_start(QTestState *from, QTestState *to)
> >>  typedef struct {
> >>      bool hide_stderr;
> >>      bool use_shmem;
> >> +    /* only launch the target process */
> >> +    bool only_target;
> >>      char *opts_source;
> >>      char *opts_target;
> >>  } MigrateStart;
> >> @@ -534,7 +544,9 @@ static int test_migrate_start(QTestState **from, QTestState **to,
> >>                                   arch_source, shmem_opts, args->opts_source,
> >>                                   ignore_stderr);
> >>      g_free(arch_source);
> >> -    *from = qtest_init(cmd_source);
> >> +    if (!args->only_target) {
> >> +        *from = qtest_init(cmd_source);
> >> +    }
> >>      g_free(cmd_source);
> >>  
> >>      cmd_target = g_strdup_printf("-accel kvm -accel tcg%s%s "
> >> @@ -1257,6 +1269,101 @@ static void test_multifd_tcp(void)
> >>      free(uri);
> >>  }
> >>  
> >> +/*
> >> + * This test does:
> >> + *  source               target
> >> + *                       migrate_incoming
> >> + *     migrate
> >> + *     migrate_cancel
> >> + *                       launch another target
> >> + *     migrate
> >> + *
> >> + *  And see that it works
> >> + */
> >> +
> >> +static void test_multifd_tcp_cancel(void)
> >> +{
> >> +    MigrateStart *args = migrate_start_new();
> >> +    QTestState *from, *to, *to2;
> >> +    QDict *rsp;
> >> +    char *uri;
> >> +
> >> +    args->hide_stderr = true;
> >> +
> >> +    if (test_migrate_start(&from, &to, "defer", args)) {
> >> +        return;
> >> +    }
> >> +
> >> +    /*
> >> +     * We want to pick a speed slow enough that the test completes
> >> +     * quickly, but that it doesn't complete precopy even on a slow
> >> +     * machine, so also set the downtime.
> >> +     */
> >> +    /* 1 ms should make it not converge*/
> >> +    migrate_set_parameter_int(from, "downtime-limit", 1);
> >> +    /* 1GB/s */
> >> +    migrate_set_parameter_int(from, "max-bandwidth", 1000000000);
> >
> > See previous comment about my update in the postcopy test, but OK.
> 
> Yes and no O:-)
> 
> function                 value
> --------                 -----
> postcopy_prepare            30 000 000
> precopy_unix             1 000 000 000
> xbzrle                   1 000 000 000
> precpy_tcp               1 000 000 000
> fd_proto                 1 000 000 000
> auto-converge            1 000 000 000
> multifd                  1 000 000 000
> multifd_cancel           1 000 000 000
> 
> Can we agree to create three global constants with the following values:
> 
> 
> const long long downtime_initial = 1;
> const long long downtime_final = 300;  /* or ever 600 */
> const long long bandwidth_initial = 30 000 000;
> 
> And substitute everywhere with the rigths constants?

Yeh, so we just have to make sure we only change it in the places
where we want to/dont want it to converge.

> Thanks, Juan.
> 
> >> +    migrate_set_parameter_int(from, "multifd-channels", 16);
> >> +    migrate_set_parameter_int(to, "multifd-channels", 16);
> >> +
> >> +    migrate_set_capability(from, "multifd", "true");
> >> +    migrate_set_capability(to, "multifd", "true");
> >> +
> >> +    /* Start incoming migration from the 1st socket */
> >> +    rsp = wait_command(to, "{ 'execute': 'migrate-incoming',"
> >> +                           "  'arguments': { 'uri': 'tcp:127.0.0.1:0' }}");
> >> +    qobject_unref(rsp);
> >> +
> >> +    /* Wait for the first serial output from the source */
> >> +    wait_for_serial("src_serial");
> >> +
> >> +    uri = migrate_get_socket_address(to, "socket-address");
> >> +
> >> +    migrate_qmp(from, uri, "{}");
> >> +
> >> +    wait_for_migration_pass(from);
> >> +
> >> +    migrate_cancel(from);
> >
> > You might want to add something here to validate that the cancel has
> > finished before starting the new one.
> 
> 
> >> +    args = migrate_start_new();
> >> +    args->only_target = true;
> >> +
> >> +    if (test_migrate_start(&from, &to2, "defer", args)) {
> >> +        return;
> >> +    }
> >> +
> >> +    migrate_set_parameter_int(to2, "multifd-channels", 16);
> >> +
> >> +    migrate_set_capability(to2, "multifd", "true");
> >> +
> >> +    /* Start incoming migration from the 1st socket */
> >> +    rsp = wait_command(to2, "{ 'execute': 'migrate-incoming',"
> >> +                            "  'arguments': { 'uri': 'tcp:127.0.0.1:0' }}");
> >> +    qobject_unref(rsp);
> >> +
> >> +    /* 300ms it should converge */
> >> +    migrate_set_parameter_int(from, "downtime-limit", 300);
> >> +
> >> +    uri = migrate_get_socket_address(to2, "socket-address");
> >> +
> >> +    wait_for_migration_status(from, "cancelled", NULL);
> 
> That is exactly what this last line does, not?
> The rest of things that we do here are for "to2" instance, that don't
> affect us at all.
> 
> Once told that, I think that it makes sense to just move the set of
> downtime-limit after the migration.

Ah OK, yes, that's fine.

Dave

> Thanks, Juan.
> 
> 
> >> +
> >> +    migrate_qmp(from, uri, "{}");
> >> +
> >> +    wait_for_migration_pass(from);
> >> +
> >> +    if (!got_stop) {
> >> +        qtest_qmp_eventwait(from, "STOP");
> >> +    }
> >> +    qtest_qmp_eventwait(to2, "RESUME");
> >> +
> >> +    wait_for_serial("dest_serial");
> >> +    wait_for_migration_complete(from);
> >> +    test_migrate_end(from, to2, true);
> >> +    free(uri);
> >> +}
> >> +
> >>  int main(int argc, char **argv)
> >>  {
> >>      char template[] = "/tmp/migration-test-XXXXXX";
> >> @@ -1322,6 +1429,7 @@ int main(int argc, char **argv)
> >>  
> >>      qtest_add_func("/migration/auto_converge", test_migrate_auto_converge);
> >>      qtest_add_func("/migration/multifd/tcp", test_multifd_tcp);
> >> +    qtest_add_func("/migration/multifd/tcp/cancel", test_multifd_tcp_cancel);
> >>  
> >>      ret = g_test_run();
> >>  
> >> -- 
> >> 2.24.1
> >> 
> > --
> > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK



  reply	other threads:[~2020-01-07 13:20 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-07 10:49 [PATCH v2 0/3] Fix multifd + cancel + multifd Juan Quintela
2020-01-07 10:49 ` [PATCH v2 1/3] migration-test: Add migration multifd test Juan Quintela
2020-01-07 11:07   ` Dr. David Alan Gilbert
2020-01-07 11:56     ` Juan Quintela
2020-01-07 10:49 ` [PATCH v2 2/3] migration: Make sure that we don't call write() in case of error Juan Quintela
2020-01-07 11:21   ` Dr. David Alan Gilbert
2020-01-07 10:49 ` [PATCH v2 3/3] migration-test: Make sure that multifd and cancel works Juan Quintela
2020-01-07 11:27   ` Dr. David Alan Gilbert
2020-01-07 11:46     ` Juan Quintela
2020-01-07 11:49       ` Dr. David Alan Gilbert [this message]
2020-01-07 12:07 ` [PATCH v2 0/3] Fix multifd + cancel + multifd no-reply
2020-01-07 15:39   ` Juan Quintela

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=20200107114902.GF2732@work-vm \
    --to=dgilbert@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=thuth@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.