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 781B61F8C8 for ; Wed, 6 Oct 2021 11:50:42 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] ds: tmpio: avoid Perl target cache Date: Wed, 6 Oct 2021 11:50:42 +0000 Message-Id: <20211006115042.21222-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: The use of `substr' here an argument to `print' was causing Perl to internally cache its target buffer. Since `syswrite()' already offers a buffer offset arg and length limits, just use `syswrite' directly. We were using autoflush anyways, so the lack of buffering was of no concern performance-wise. The target buffer could get to roughly ~10MB under some loads, but it was usually a cold path and using memory which cannot be released nor reused in other places. note: IO::Handle::write uses `substr' internally, too; so nothing would be gained using IO::Handle:write. --- lib/PublicInbox/DS.pm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index debb777a..9cca02d7 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -494,16 +494,15 @@ sub drop { $self->close; } -# n.b.: use ->write/->read for this buffer to allow compatibility with -# PerlIO::mmap or PerlIO::scalar if needed sub tmpio ($$$) { my ($self, $bref, $off) = @_; my $fh = tmpfile('wbuf', $self->{sock}, O_APPEND) or return drop($self, "tmpfile $!"); $fh->autoflush(1); my $len = length($$bref) - $off; - print $fh substr($$bref, $off, $len) or + my $n = syswrite($fh, $$bref, $len, $off) // return drop($self, "write ($len): $!"); + $n == $len or return drop($self, "wrote $n < $len bytes"); [ $fh, 0 ] # [1] = offset, [2] = length, not set by us }