5
0
mirror of git://git.proxmox.com/git/pve-storage.git synced 2025-03-11 16:58:28 +03:00

fix #3004: show progress of offline migration in task log

dd supports a 'status' flag, which enables it to show the copied bytes,
duration, and the transfer rate, which then get printed to stderr.

Signed-off-by: Leo Nunner <l.nunner@proxmox.com>
This commit is contained in:
Leo Nunner 2023-08-31 12:41:59 +02:00 committed by Thomas Lamprecht
parent 122ccde412
commit aa82ad5c25
3 changed files with 18 additions and 5 deletions

View File

@ -821,12 +821,25 @@ sub storage_migrate {
my $new_volid;
my $pattern = volume_imported_message(undef, 1);
# Matches new volid and rate-limits dd output
my $match_volid_and_log = sub {
my $line = shift;
my $show = 1;
# rate-limit dd logs
if ($line =~ /(?:\d+ bytes)(?:.+?copied, )(\d+) s/) {
if ($1 < 60) { # if < 60s, print every 3s
$show = !($1 % 3);
} elsif ($1 < 600) { # if < 10mins, print every 10s
$show = !($1 % 10);
} else { # else, print every 30s
$show = !($1 % 30);
}
}
$new_volid = $1 if ($line =~ $pattern);
if ($logfunc) {
if ($logfunc && $show) {
chomp($line);
$logfunc->($line);
}
@ -855,7 +868,7 @@ sub storage_migrate {
# we won't be reading from the socket
shutdown($socket, 0);
eval { run_command($cmds, output => '>&'.fileno($socket), errfunc => $logfunc); };
eval { run_command($cmds, output => '>&'.fileno($socket), errfunc => $match_volid_and_log); };
my $send_error = $@;
# don't close the connection entirely otherwise the receiving end

View File

@ -645,7 +645,7 @@ sub volume_export {
$size = int($1);
});
PVE::Storage::Plugin::write_common_header($fh, $size);
run_command(['dd', "if=$file", "bs=64k"], output => '>&'.fileno($fh));
run_command(['dd', "if=$file", "bs=64k", "status=progress"], output => '>&'.fileno($fh));
}
sub volume_import_formats {

View File

@ -1577,7 +1577,7 @@ sub volume_export {
goto unsupported if $with_snapshots || $file_format eq 'subvol';
write_common_header($fh, $size);
if ($file_format eq 'raw') {
run_command(['dd', "if=$file", "bs=4k"], output => '>&'.fileno($fh));
run_command(['dd', "if=$file", "bs=4k", "status=progress"], output => '>&'.fileno($fh));
} else {
run_command(['qemu-img', 'convert', '-f', $file_format, '-O', 'raw', $file, '/dev/stdout'],
output => '>&'.fileno($fh));
@ -1587,7 +1587,7 @@ sub volume_export {
my $data_format = $1;
goto unsupported if !$with_snapshots || $file_format ne $data_format;
write_common_header($fh, $size);
run_command(['dd', "if=$file", "bs=4k"], output => '>&'.fileno($fh));
run_command(['dd', "if=$file", "bs=4k", "status=progress"], output => '>&'.fileno($fh));
return;
} elsif ($format eq 'tar+size') {
goto unsupported if $file_format ne 'subvol';