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-ASN: 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 AB6081F4B6 for ; Thu, 27 Jun 2019 22:51:48 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/4] nntp: rework and simplify art_lookup response Date: Thu, 27 Jun 2019 22:51:45 +0000 Message-Id: <20190627225148.9657-2-e@80x24.org> In-Reply-To: <20190627225148.9657-1-e@80x24.org> References: <20190627225148.9657-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We don't need some of the array elements returned from art_lookup, anymore (and haven't used them in years). We can also shorten the lifetime of the Email::Simple object by relying on the fact Email::Simple->new will modify it's arg if given a SCALARREF and allow us to avoid Email::Simple::body calls. Unfortunately, this doesn't seem to provide any noticeable improvement in memory usage when dealing with a 30+ MB test message, since our previous use of ->body_set('') was saving some memory, but forcing a LF-only body to be CRLF was making Perl allocate extra space for s///sg. --- lib/PublicInbox/NNTP.pm | 47 +++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 53e18281..30d3dab6 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -510,24 +510,21 @@ find_mid: found: my $smsg = $ng->over->get_art($n) or return $err; my $msg = $ng->msg_by_smsg($smsg) or return $err; - my $s = Email::Simple->new($msg); - if ($set_headers) { - set_nntp_headers($self, $s->header_obj, $ng, $n, $mid); - # must be last - $s->body_set('') if ($set_headers == 2); - } - [ $n, $mid, $s, $smsg->bytes, $smsg->lines, $ng ]; + # Email::Simple->new will modify $msg in-place as documented + # in its manpage, so what's left is the body and we won't need + # to call Email::Simple::body(), later + my $hdr = Email::Simple->new($msg)->header_obj; + set_nntp_headers($self, $hdr, $ng, $n, $mid) if $set_headers; + [ $n, $mid, $msg, $hdr ]; } -sub simple_body_write ($$) { - my ($self, $s) = @_; - my $body = $s->body; - $s->body_set(''); - $body =~ s/^\./../smg; - $body =~ s/(?header_obj->as_string; + my $hdr = $_[0]->as_string; utf8::encode($hdr); $hdr =~ s/(? article retrieved - head and body follow"); - msg_more($self, _header($s)); + msg_more($self, _header($hdr)); msg_more($self, "\r\n"); - simple_body_write($self, $s); + msg_body_write($self, $msg); } sub cmd_head ($;$) { my ($self, $art) = @_; my $r = art_lookup($self, $art, 2); return $r unless ref $r; - my ($n, $mid, $s) = @$r; + my ($n, $mid, undef, $hdr) = @$r; set_art($self, $art); more($self, "221 $n <$mid> article retrieved - head follows"); - msg_more($self, _header($s)); + msg_more($self, _header($hdr)); '.' } @@ -577,17 +574,17 @@ sub cmd_body ($;$) { my ($self, $art) = @_; my $r = art_lookup($self, $art, 0); return $r unless ref $r; - my ($n, $mid, $s) = @$r; + my ($n, $mid, $msg) = @$r; set_art($self, $art); more($self, "222 $n <$mid> article retrieved - body follows"); - simple_body_write($self, $s); + msg_body_write($self, $msg); } sub cmd_stat ($;$) { my ($self, $art) = @_; my $r = art_lookup($self, $art, 0); return $r unless ref $r; - my ($n, $mid, undef) = @$r; + my ($n, $mid) = @$r; set_art($self, $art); "223 $n <$mid> article retrieved - request text separately"; } @@ -815,7 +812,7 @@ sub hdr_mid_prefix ($$$$$) { } sub hdr_mid_response ($$$$$$) { - my ($self, $xhdr, $ng, $n, $mid, $v) = @_; # r: art_lookup result + my ($self, $xhdr, $ng, $n, $mid, $v) = @_; my $res = ''; if ($xhdr) { $res .= r221 . "\r\n"; -- EW