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