From: Dominik Csapak Date: Thu, 30 Jul 2020 09:04:10 +0000 (+0200) Subject: run_command: improve performance for logging and long lines X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=commitdiff_plain;h=cb9db10c1a9855cf40ff13e81f9dd97d6a9b2698 run_command: improve performance for logging and long lines to call out/err/logfunc with each line, we search for a newline and call outfunc/logfunc with everything before that since we do a select/read (with 4096 size) in a loop, this means that if we have very long lines, we search for a newline in an ever growing buffer (for which we know does not contain a newline) so instead, only search the new data for newlines Signed-off-by: Dominik Csapak --- diff --git a/src/PVE/Tools.pm b/src/PVE/Tools.pm index 5d53127..d9c69e3 100644 --- a/src/PVE/Tools.pm +++ b/src/PVE/Tools.pm @@ -497,12 +497,13 @@ sub run_command { if ($h eq $reader) { if ($outfunc || $logfunc) { eval { - $outlog .= $buf; - while ($outlog =~ s/^([^\010\r\n]*)(\r|\n|(\010)+|\r\n)//s) { - my $line = $1; + while ($buf =~ s/^([^\010\r\n]*)(\r|\n|(\010)+|\r\n)//) { + my $line = $outlog . $1; + $outlog = ''; &$outfunc($line) if $outfunc; &$logfunc($line) if $logfunc; } + $outlog .= $buf; }; my $err = $@; if ($err) { @@ -517,12 +518,13 @@ sub run_command { } elsif ($h eq $error) { if ($errfunc || $logfunc) { eval { - $errlog .= $buf; - while ($errlog =~ s/^([^\010\r\n]*)(\r|\n|(\010)+|\r\n)//s) { - my $line = $1; + while ($buf =~ s/^([^\010\r\n]*)(\r|\n|(\010)+|\r\n)//s) { + my $line = $errlog . $1; + $errlog = ''; &$errfunc($line) if $errfunc; &$logfunc($line) if $logfunc; } + $errlog .= $buf; }; my $err = $@; if ($err) {