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 <aderumier@odiso.com>
This commit is contained in:
Alexandre Derumier 2014-11-09 15:13:01 +01:00 committed by Dietmar Maurer
parent 2b8245f11b
commit 21ccdb506a

View File

@ -5192,7 +5192,16 @@ sub qemu_drive_mirror {
print "transferred: $transferred bytes remaining: $remaining bytes total: $total bytes progression: $percent % busy: $busy\n"; print "transferred: $transferred bytes remaining: $remaining bytes total: $total bytes progression: $percent % busy: $busy\n";
if ($stat->{len} == $stat->{offset}) { 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 ($count > $maxwait) {
# if too much writes to disk occurs at the end of migration # 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 #the disk needs to be freezed to be able to complete the migration
@ -5205,11 +5214,6 @@ sub qemu_drive_mirror {
sleep 1; 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; vm_resume($vmid, 1) if $frozen;
}; };