[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