]> Sergey Matveev's repositories - public-inbox.git/commitdiff
www+httpd: lower priority of large mbox downloads
authorEric Wong <e@80x24.org>
Tue, 28 Sep 2021 07:53:49 +0000 (07:53 +0000)
committerEric Wong <e@80x24.org>
Tue, 28 Sep 2021 20:23:53 +0000 (20:23 +0000)
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.

lib/PublicInbox/GzipFilter.pm
lib/PublicInbox/Mbox.pm
lib/PublicInbox/WWW.pm

index 334d658109be102465c79e690c3afed164b54fc0..c50c26c5c21cfe418b66f0430d2c375b2a402679 100644 (file)
@@ -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 {
index f72af26baeadc9602bbccbd75a6e2395bcf7bdae..cec76182933fabf4979c33f2f4406f4f0ece80ef 100644 (file)
@@ -174,6 +174,7 @@ sub mbox_all_ids {
                [404, [qw(Content-Type text/plain)], ["No results found\n"]];
        $ctx->{ids} = $ids;
        $ctx->{prev} = $prev;
+       $ctx->{-low_prio} = 1;
        require PublicInbox::MboxGz;
        PublicInbox::MboxGz::mbox_gz($ctx, \&all_ids_cb, 'all');
 }
@@ -192,12 +193,13 @@ sub results_cb {
                        my $smsg = $over->get_art($num) or next;
                        return $smsg;
                }
-               # refill result set
+               # refill result set, deprioritize since there's many results
                my $srch = $ctx->{ibx}->isrch or return gone($ctx, 'search');
                my $mset = $srch->mset($ctx->{query}, $ctx->{qopts});
                my $size = $mset->size or return;
                $ctx->{qopts}->{offset} += $size;
                $ctx->{ids} = $srch->mset_to_artnums($mset, $ctx->{qopts});
+               $ctx->{-low_prio} = 1;
        }
 }
 
@@ -214,12 +216,13 @@ sub results_thread_cb {
                # refills ctx->{xids}
                next if $over->expand_thread($ctx);
 
-               # refill result set
+               # refill result set, deprioritize since there's many results
                my $srch = $ctx->{ibx}->isrch or return gone($ctx, 'search');
                my $mset = $srch->mset($ctx->{query}, $ctx->{qopts});
                my $size = $mset->size or return;
                $ctx->{qopts}->{offset} += $size;
                $ctx->{ids} = $srch->mset_to_artnums($mset, $ctx->{qopts});
+               $ctx->{-low_prio} = 1;
        }
 
 }
index 570e690ec8136ca7cf6c98b4ea0138da42c57032..a7c961f4982a962c43071035660c90ed3a697d0a 100644 (file)
@@ -659,4 +659,13 @@ sub get_description {
        };
 }
 
+sub event_step { # called via requeue
+       my ($self) = @_;
+       # gzf = PublicInbox::GzipFilter == $ctx
+       my $gzf = shift(@{$self->{-low_prio_q}}) // return;
+       PublicInbox::DS::requeue($self) if scalar(@{$self->{-low_prio_q}});
+       my $http = $gzf->{env}->{'psgix.io'}; # PublicInbox::HTTP
+       $http->next_step($gzf->can('async_next'));
+}
+
 1;