From: Eric Wong Date: Wed, 6 Oct 2021 11:50:42 +0000 (+0000) Subject: ds: tmpio: avoid Perl target cache X-Git-Tag: v1.7.0~213 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=3472c60fc72dfb5d1152c4015f54be1644443a20 ds: tmpio: avoid Perl target cache 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. --- 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 }