From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id F09A19888 for ; Tue, 26 Apr 2022 14:35:54 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D025C1BD11 for ; Tue, 26 Apr 2022 14:35:54 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id A3A611BBAB for ; Tue, 26 Apr 2022 14:35:50 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 7DA3642BEA for ; Tue, 26 Apr 2022 14:35:50 +0200 (CEST) From: Daniel Tschlatscher To: pve-devel@lists.proxmox.com Date: Tue, 26 Apr 2022 14:35:40 +0200 Message-Id: <20220426123542.154739-6-d.tschlatscher@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220426123542.154739-1-d.tschlatscher@proxmox.com> References: <20220426123542.154739-1-d.tschlatscher@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.064 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [tasks.pm] Subject: [pve-devel] [PATCH pmg-api 1/1] fix #3971: Download button in TaskViewer for PMG X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Apr 2022 12:35:55 -0000 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 --- 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