]> git.proxmox.com Git - qemu-server.git/commitdiff
block-job-complete : retry if block job cannot be complete
authorAlexandre Derumier <aderumier@odiso.com>
Sun, 9 Nov 2014 14:13:01 +0000 (15:13 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Mon, 10 Nov 2014 05:26:25 +0000 (06:26 +0100)
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>
PVE/QemuServer.pm

index 778fb08594fbe1fae46a0fc03020b6deaf5684db..5222f29da92d6c02dc77cc71f3d258da99f071d8 100644 (file)
@@ -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;
            
        };