Stream logs if possible and remove size limit

This commit is contained in:
Eelco Dolstra 2015-07-08 19:04:08 +02:00
parent f5548dc225
commit 0da08df4eb
3 changed files with 41 additions and 11 deletions

View file

@ -136,9 +136,12 @@ sub showLog {
notFound($c, "The build log of derivation $drvPath is not available.") unless defined $logPath; notFound($c, "The build log of derivation $drvPath is not available.") unless defined $logPath;
my $size = stat($logPath)->size; # Don't send logs that we can't stream.
error($c, "This build log is too big to display ($size bytes).") my $size = stat($logPath)->size; # FIXME: not so meaningful for compressed logs
if $size >= 64 * 1024 * 1024; error($c, "This build log is too big to display ($size bytes).") unless
$mode eq "raw"
|| (($mode eq "tail" || $mode eq "tail-reload") && $logPath !~ /\.bz2$/)
|| $size < 64 * 1024 * 1024;
if (!$mode) { if (!$mode) {
# !!! quick hack # !!! quick hack
@ -150,12 +153,9 @@ sub showLog {
} }
elsif ($mode eq "raw") { elsif ($mode eq "raw") {
if ($logPath !~ /.bz2$/) { $c->stash->{logPath} = $logPath;
$c->serve_static_file($logPath); $c->forward('Hydra::View::NixLog');
} else { return;
$c->stash->{'plain'} = { data => (scalar logContents($logPath)) || " " };
$c->forward('Hydra::View::Plain');
}
} }
elsif ($mode eq "tail-reload") { elsif ($mode eq "tail-reload") {

View file

@ -352,8 +352,8 @@ sub log :Local :Args(1) {
my $logPath = findLog($c, $path, @outpaths); my $logPath = findLog($c, $path, @outpaths);
notFound($c, "The build log of $path is not available.") unless defined $logPath; notFound($c, "The build log of $path is not available.") unless defined $logPath;
$c->stash->{'plain'} = { data => (scalar logContents($logPath)) || " " }; $c->stash->{logPath} = $logPath;
$c->forward('Hydra::View::Plain'); $c->forward('Hydra::View::NixLog');
} }

View file

@ -0,0 +1,30 @@
package Hydra::View::NixLog;
use strict;
use base qw/Catalyst::View/;
use Hydra::Helper::CatalystUtils;
sub process {
my ($self, $c) = @_;
my $logPath = $c->stash->{logPath};
$c->response->content_type('text/plain');
my $fh = new IO::Handle;
if ($logPath =~ /\.bz2$/) {
open $fh, "bzip2 -dc < '$logPath' |" or die;
} else {
open $fh, "<$logPath" or die;
}
binmode($fh);
setCacheHeaders($c, 365 * 24 * 60 * 60);
$c->response->body($fh);
return 1;
}
1;