On Fri, Dec 26, 2025 at 06:19:12PM -0300, Fabiano Rosas wrote:
> Cover the CANCELLING state in migration_connect_error_propagate() and
> use it to funnel errors from migrate_prepare() until the end of
> migration_connect().
>
> (add some line breaks for legibility)
>
> Signed-off-by: Fabiano Rosas <farosas@suse.de>
> ---
> migration/migration.c | 24 +++++++++++++++---------
> 1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 83854d084a..e1c00867ab 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -1575,18 +1575,25 @@ static void migrate_error_free(MigrationState *s)
> static void migration_connect_error_propagate(MigrationState *s, Error *error)
> {
> MigrationStatus current = s->state;
> - MigrationStatus next;
> -
> - assert(s->to_dst_file == NULL);
> + MigrationStatus next = MIGRATION_STATUS_NONE;
>
> switch (current) {
> case MIGRATION_STATUS_SETUP:
> next = MIGRATION_STATUS_FAILED;
> break;
> +
> case MIGRATION_STATUS_POSTCOPY_RECOVER_SETUP:
> /* Never fail a postcopy migration; switch back to PAUSED instead */
> next = MIGRATION_STATUS_POSTCOPY_PAUSED;
> break;
> +
> + case MIGRATION_STATUS_CANCELLING:
> + /*
> + * Don't move out of CANCELLING, the only valid transition is to
> + * CANCELLED, at migration_cleanup().
> + */
> + break;
> +
> default:
> /*
> * This really shouldn't happen. Just be careful to not crash a VM
> @@ -1597,7 +1604,10 @@ static void migration_connect_error_propagate(MigrationState *s, Error *error)
> return;
> }
>
> - migrate_set_state(&s->state, current, next);
> + if (next) {
> + migrate_set_state(&s->state, current, next);
> + }
> +
> migrate_error_propagate(s, error);
> }
>
> @@ -4107,11 +4117,7 @@ void migration_connect(MigrationState *s, Error *error_in)
> return;
>
> fail:
> - migrate_error_propagate(s, error_copy(local_err));
> - if (s->state != MIGRATION_STATUS_CANCELLING) {
> - migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED);
> - }
> - error_report_err(local_err);
OK you removed this line here.. maybe it should belong to the previous
patch?
If you agree, feel free to take:
Reviewed-by: Peter Xu <peterx@redhat.com>
> + migration_connect_error_propagate(s, local_err);
> migration_cleanup(s);
> if (s->error) {
> error_report_err(error_copy(s->error));
> --
> 2.51.0
>
--
Peter Xu