From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 605621F933 for ; Sun, 5 Jul 2020 23:28:13 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 29/43] view: /$INBOX/$MSGID/t/ reads blobs asynchronously Date: Sun, 5 Jul 2020 23:27:45 +0000 Message-Id: <20200705232759.3161-30-e@yhbt.net> In-Reply-To: <20200705232759.3161-1-e@yhbt.net> References: <20200705232759.3161-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Once again, this shows a ~10% speedup with multi-message threads in xt/httpd-async-stream.t regardless of whether TEST_JOBS is 1 or 100. --- lib/PublicInbox/View.pm | 44 +++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 98445f0e0..117257a64 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -375,7 +375,7 @@ sub thread_eml_entry { $beg . '
' . eml_entry($ctx, $smsg, $eml, 0) . '
' . $end; } -sub next_in_queue ($;$) { +sub next_in_queue ($$) { my ($q, $ghost_ok) = @_; while (@$q) { my ($level, $smsg) = splice(@$q, 0, 2); @@ -387,29 +387,39 @@ sub next_in_queue ($;$) { } sub stream_thread_i { # PublicInbox::WwwStream::getline callback - my ($ctx) = @_; - return unless exists($ctx->{skel}); - my $nr = $ctx->{nr}++; - my ($level, $smsg) = next_in_queue($ctx->{-queue}, $nr); - - $smsg or return - join('', thread_adj_level($ctx, 0)) . ${delete $ctx->{skel}}; - - my $eml = $ctx->{-inbox}->smsg_eml($smsg) or return - ghost_index_entry($ctx, $level, $smsg); + my ($ctx, $eml) = @_; - if ($nr == 0) { - $ctx->{-title_html} = ascii_html($smsg->{subject}); - $ctx->html_top . thread_eml_entry($ctx, $level, $smsg, $eml); - } else { - thread_eml_entry($ctx, $level, $smsg, $eml); + if ($eml) { + my ($level, $smsg) = delete @$ctx{qw(level smsg)}; + if ($ctx->{nr} == 1) { + $ctx->{-title_html} = ascii_html($smsg->{subject}); + $ctx->zmore($ctx->html_top); + } + return thread_eml_entry($ctx, $level, $smsg, $eml); + } + return unless exists($ctx->{skel}); + my $ghost_ok = $ctx->{nr}++; + while (1) { + my ($lvl, $smsg) = next_in_queue($ctx->{-queue}, $ghost_ok); + if ($smsg) { + if (exists $smsg->{blob}) { # next message for cat-file + $ctx->{level} = $lvl; + return $smsg; + } + # buffer the ghost entry and loop + $ctx->zmore(ghost_index_entry($ctx, $lvl, $smsg)); + } else { # all done + $ctx->zmore(join('', thread_adj_level($ctx, 0))); + $ctx->zmore(${delete($ctx->{skel})}); + return; + } } } sub stream_thread ($$) { my ($rootset, $ctx) = @_; $ctx->{-queue} = [ map { (0, $_) } @$rootset ]; - PublicInbox::WwwStream::response($ctx, 200, \&stream_thread_i); + PublicInbox::WwwStream::aresponse($ctx, 200, \&stream_thread_i); } # /$INBOX/$MESSAGE_ID/t/