[pve-devel] [PATCH] block-job-complete : retry if block job cannot be complete
Alexandre Derumier
aderumier at odiso.com
Sun Nov 9 15:13:01 CET 2014
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 at odiso.com>
---
PVE/QemuServer.pm | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 778fb08..5222f29 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;
};
--
1.7.10.4
More information about the pve-devel
mailing list