On Fri, Mar 20, 2026 at 18:34:02 +0100, Denis V. Lunev wrote:
> When libvirtd reconnects to a running QEMU process that had an
> in-progress migration, qemuProcessReconnect first connects the
> monitor and only later recovers the migration job. During this window
> the async job is VIR_ASYNC_JOB_NONE, so any MIGRATION status events
> from QEMU are silently dropped by qemuProcessHandleMigrationStatus.
> 
> If the migration was already cancelled or completed by QEMU during
> this window, no further events will be emitted. When
> qemuMigrationSrcCancelUnattended later restores the async job and
> calls qemuMigrationSrcCancel with wait=true, the wait loop calls
> qemuDomainObjWait (virCondWait with no timeout) and blocks forever
> waiting for an event that will never arrive.
> 
> Fix this by re-querying QEMU migration state with
> qemuMigrationAnyRefreshStatus after restoring the async job but before
> calling qemuMigrationSrcCancel. If QEMU has already reached a terminal
> state, the cancel is skipped.
> 
> Signed-off-by: Denis V. Lunev <[email protected]>
> CC: Jiri Denemark <[email protected]>
> CC: Peter Krempa <[email protected]>
> CC: Michal Privoznik <[email protected]>
> CC: Efim Shevrin <[email protected]>
> ---
> v1 -> v2: Instead of querying QEMU with query-migrate inside
> qemuMigrationSrcCancel, use qemuMigrationAnyRefreshStatus in
> qemuMigrationSrcCancelUnattended after restoring the async job
> to re-check migration state before the actual cancel.
> 
>  src/qemu/qemu_migration.c | 18 ++++++++++++++----
>  1 file changed, 14 insertions(+), 4 deletions(-)

I apologize for the delay, for some reason your patch ended up in my
spam folder (although v1 went in just fine). I'll look at this tomorrow.

Jirka

Reply via email to