about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-03-21 02:03:45 +0000
committerEric Wong <e@yhbt.net>2020-03-25 01:48:35 +0000
commit09bc262dd3b4e497cad0c0e814ff3b6664bc8444 (patch)
tree2928960d7554c5c18188badeb2afe2a392a45d5d
parenta71cb67a1237c450a9cbbd6738c5af3b73ba4c61 (diff)
downloadpublic-inbox-09bc262dd3b4e497cad0c0e814ff3b6664bc8444.tar.gz
zlib contexts are memory-intensive, particularly when used for
compression.  Since the gzip filter may be sitting in a limiter
queue for a long period, delay the allocation we actually have
data to translate, and not a moment sooner.
-rw-r--r--lib/PublicInbox/GzipFilter.pm15
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm
index d883130f..86409586 100644
--- a/lib/PublicInbox/GzipFilter.pm
+++ b/lib/PublicInbox/GzipFilter.pm
@@ -8,11 +8,7 @@ use bytes (); # length
 use Compress::Raw::Zlib qw(Z_FINISH Z_OK);
 my %OPT = (-WindowBits => 15 + 16, -AppendOutput => 1);
 
-sub new {
-        my ($gz, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
-        $err == Z_OK or die "Deflate->new failed: $err";
-        bless { gz => $gz }, shift;
-}
+sub new { bless {}, shift }
 
 # for Qspawn if using $env->{'pi-httpd.async'}
 sub attach {
@@ -24,6 +20,15 @@ sub attach {
 # for GetlineBody (via Qspawn) when NOT using $env->{'pi-httpd.async'}
 sub translate ($$) {
         my $self = $_[0];
+
+        # allocate the zlib context lazily here, instead of in ->new.
+        # Deflate contexts are memory-intensive and this object may
+        # be sitting in the Qspawn limiter queue for a while.
+        my $gz = $self->{gz} ||= do {
+                my ($g, $err) = Compress::Raw::Zlib::Deflate->new(%OPT);
+                $err == Z_OK or die "Deflate->new failed: $err";
+                $g;
+        };
         my $zbuf = delete($self->{zbuf});
         if (defined $_[1]) { # my $buf = $_[1];
                 my $err = $self->{gz}->deflate($_[1], $zbuf);