From 21ccdb506a38a62214d69a6e4162e276de028efb Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Sun, 9 Nov 2014 15:13:01 +0100 Subject: [PATCH] block-job-complete : retry if block job cannot be complete Even if we check the busy flag, we can have sometime race condition if new write are coming between the query-block-job and the block-job-complete. block-job-complete throw an error "The active block job for device '%(name)' cannot be completed" we just need to retry in this case. Signed-off-by: Alexandre Derumier --- PVE/QemuServer.pm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 778fb085..5222f29d 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -5192,7 +5192,16 @@ sub qemu_drive_mirror { print "transferred: $transferred bytes remaining: $remaining bytes total: $total bytes progression: $percent % busy: $busy\n"; if ($stat->{len} == $stat->{offset}) { - last if $busy eq 'false'; + if ($busy eq 'false'){ + + last if $vmiddst != $vmid; + + # try to switch the disk if source and destination are on the same guest + eval { vm_mon_cmd($vmid, "block-job-complete", device => "drive-$drive") }; + last if !$@; + die $@ if $@ !~ m/cannot be completed/; + } + if ($count > $maxwait) { # if too much writes to disk occurs at the end of migration #the disk needs to be freezed to be able to complete the migration @@ -5205,11 +5214,6 @@ sub qemu_drive_mirror { sleep 1; } - if ($vmiddst == $vmid) { - # switch the disk if source and destination are on the same guest - vm_mon_cmd($vmid, "block-job-complete", device => "drive-$drive"); - } - vm_resume($vmid, 1) if $frozen; };