qemu-mirror : block job complete : use ready flag

Since qemu 2.2, a new "ready" flag has been added to blockjob
http://git.qemu.org/?p=qemu.git;a=commit;h=ef6dbf1e46ebd1d41ab669df5bba0bbdec6bd374
to known if we can complete it.

we can't use len==offset to known if all block are mirrored, because behaviour will change soon in qemu 2.3

http://git.qemu.org/?p=qemu.git;a=commit;h=b21c76529d55bf7bb02ac736b312f5f8bf033ea2
"block/mirror: Improve progress report

Instead of taking the total length of the block device as the block
job's length, use the number of dirty sectors. The progress is now the
number of sectors mirrored to the target block device. Note that this
may result in the job's length increasing during operation, which is
however in fact desirable.
"

Signed-off-by: Alexandre Derumier <aderumier@odiso.com>
This commit is contained in:
Alexandre Derumier 2015-05-11 15:55:21 +02:00 committed by Dietmar Maurer
parent d483fa010c
commit ad123d97f9

View File

@ -6080,11 +6080,6 @@ sub qemu_img_format {
sub qemu_drive_mirror { sub qemu_drive_mirror {
my ($vmid, $drive, $dst_volid, $vmiddst) = @_; my ($vmid, $drive, $dst_volid, $vmiddst) = @_;
my $count = 0;
my $old_len = 0;
my $frozen = undef;
my $maxwait = 120;
my $storecfg = PVE::Storage::config(); my $storecfg = PVE::Storage::config();
my ($dst_storeid, $dst_volname) = PVE::Storage::parse_volume_id($dst_volid); my ($dst_storeid, $dst_volname) = PVE::Storage::parse_volume_id($dst_volid);
@ -6113,39 +6108,29 @@ sub qemu_drive_mirror {
die "error job is not mirroring" if $stat->{type} ne "mirror"; die "error job is not mirroring" if $stat->{type} ne "mirror";
my $busy = $stat->{busy}; my $busy = $stat->{busy};
my $ready = $stat->{ready};
if (my $total = $stat->{len}) { if (my $total = $stat->{len}) {
my $transferred = $stat->{offset} || 0; my $transferred = $stat->{offset} || 0;
my $remaining = $total - $transferred; my $remaining = $total - $transferred;
my $percent = sprintf "%.2f", ($transferred * 100 / $total); my $percent = sprintf "%.2f", ($transferred * 100 / $total);
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 ready: $ready \n";
} }
if ($stat->{len} == $stat->{offset}) {
if ($busy eq 'false') {
last if $vmiddst != $vmid; if ($stat->{ready} eq 'true') {
# try to switch the disk if source and destination are on the same guest last if $vmiddst != $vmid;
eval { vm_mon_cmd($vmid, "block-job-complete", device => "drive-$drive") };
last if !$@;
die $@ if $@ !~ m/cannot be completed/;
}
if ($count > $maxwait) { # try to switch the disk if source and destination are on the same guest
# if too much writes to disk occurs at the end of migration eval { vm_mon_cmd($vmid, "block-job-complete", device => "drive-$drive") };
#the disk needs to be freezed to be able to complete the migration last if !$@;
vm_suspend($vmid,1); die $@ if $@ !~ m/cannot be completed/;
$frozen = 1;
}
$count ++
} }
$old_len = $stat->{offset};
sleep 1; sleep 1;
} }
vm_resume($vmid, 1) if $frozen;
}; };
my $err = $@; my $err = $@;