about summary refs log tree commit homepage
path: root/lib/PublicInbox/GzipFilter.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-09-28 07:53:49 +0000
committerEric Wong <e@80x24.org>2021-09-28 20:23:53 +0000
commit205599c0814e1031760e54cce9d8880e747cbb08 (patch)
tree5bda9afd681100d640288236e143e7ca215276b2 /lib/PublicInbox/GzipFilter.pm
parent3dbd6dc31dd7e34bea87dbb626f811e093b6860b (diff)
downloadpublic-inbox-205599c0814e1031760e54cce9d8880e747cbb08.tar.gz
While each git blob request is treated fairly w.r.t other git
blob requests, responses triggering thousands of git blob
requests can still noticeably increase latency for
less-expensive responses.

Move large mbox results and the nasty all.mbox endpoint to
a low priority queue which only fires once per-event loop
iteration.  This reduces the response time of short HTTP
responses while many gigantic mboxes are being downloaded
simultaneously, but still maximizes use of available I/O
when there's no inexpensive HTTP responses happening.

This only affects PublicInbox::WWW users who use
public-inbox-httpd, not generic PSGI servers.
Diffstat (limited to 'lib/PublicInbox/GzipFilter.pm')
-rw-r--r--lib/PublicInbox/GzipFilter.pm7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/PublicInbox/GzipFilter.pm b/lib/PublicInbox/GzipFilter.pm
index 334d6581..c50c26c5 100644
--- a/lib/PublicInbox/GzipFilter.pm
+++ b/lib/PublicInbox/GzipFilter.pm
@@ -175,7 +175,12 @@ sub async_blob_cb { # git->cat_async callback
         $smsg->{blob} eq $oid or bail($self, "BUG: $smsg->{blob} != $oid");
         eval { $self->async_eml(PublicInbox::Eml->new($bref)) };
         bail($self, "E: async_eml: $@") if $@;
-        $http->next_step($self->can('async_next'));
+        if ($self->{-low_prio}) {
+                push(@{$self->{www}->{-low_prio_q}}, $self) == 1 and
+                                PublicInbox::DS::requeue($self->{www});
+        } else {
+                $http->next_step($self->can('async_next'));
+        }
 }
 
 sub smsg_blob {