With the newly added button in the tasklog the implementation for the
PMG server needs to be adapted. I saw an opportunity here to clear
some redundant code for displaying the tasklog and replace it with a
call to dump_logfile(), akin to how this is handled in pve-manager.

The tasklog download functionality now streams the file by invoking
the newly created function in pve-common. Tasklog files can become
rather large, therefore sent files are compressed if they are bigger
than 1500 bytes (The 'Maximum Transfer Unit' for TCP). Smaller files
will not benefit from compression here, as they still use one (1)
data unit packet to transfer.
Please note that the size of 1500 bytes / MTU can vary, but seems to
the most common for internet networking.

Signed-off-by: Daniel Tschlatscher <d.tschlatsc...@proxmox.com>
---
 src/PMG/API2/Tasks.pm | 34 +++++++++++-----------------------
 1 file changed, 11 insertions(+), 23 deletions(-)

diff --git a/src/PMG/API2/Tasks.pm b/src/PMG/API2/Tasks.pm
index 598fb4d..20f6f96 100644
--- a/src/PMG/API2/Tasks.pm
+++ b/src/PMG/API2/Tasks.pm
@@ -5,6 +5,7 @@ use warnings;
 use POSIX;
 use IO::File;
 use File::ReadBackwards;
+use File::stat;
 use PVE::Tools;
 use PVE::SafeSyslog;
 use PVE::RESTHandler;
@@ -272,33 +273,20 @@ __PACKAGE__->register_method({
 
        my $restenv = PMG::RESTEnvironment->get();
 
-       my $fh = IO::File->new($filename, "r");
-       raise_param_exc({ upid => "no such task - unable to open file - $!" }) 
if !$fh;
+       my $start = $param->{start} // 0;
+       my $limit = $param->{limit} // 50;
 
-       my $start = $param->{start} || 0;
-       my $limit = $param->{limit} || 50;
-       my $count = 0;
-       my $line;
-       while (defined ($line = <$fh>)) {
-           next if $count++ < $start;
-           next if $limit <= 0;
-           chomp $line;
-           push @$lines, { n => $count, t => $line};
-           $limit--;
-       }
+       if ($limit == 0) {
+           # TCP Max Transfer Unit size is 1500, compression for lower numbers 
has no effect
+           my $use_compression = stat($filename)->size > 1500;
+           return PVE::Tools::stream_logfile($filename, $use_compression, 
$param->{upid});
+       } else {
+           my ($count, $lines) = PVE::Tools::dump_logfile($filename, $start, 
$limit);
 
-       close($fh);
+           $restenv->set_result_attrib('total', $count);
 
-       # HACK: ExtJS store.guaranteeRange() does not like empty array
-       # so we add a line
-       if (!$count) {
-           $count++;
-           push @$lines, { n => $count, t => "no content"};
+           return $lines;
        }
-
-       $restenv->set_result_attrib('total', $count);
-
-       return $lines;
     }});
 
 
-- 
2.30.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to