]> git.ipfire.org Git - thirdparty/public-inbox.git/commit
lei: fix SIGPIPE on large result sets to pager
authorEric Wong <e@80x24.org>
Tue, 7 Nov 2023 13:01:47 +0000 (13:01 +0000)
committerEric Wong <e@80x24.org>
Tue, 7 Nov 2023 13:23:36 +0000 (13:23 +0000)
commite97a30e7624dfb8645aa33a94844bcf28c7e1379
tree9f28b7273c795b0e0579d42728fdfad1e5dbfeac
parentc1f27d21213f05bd4656e24ec5a5a076ebaa6afd
lei: fix SIGPIPE on large result sets to pager

When dealing with large search results, we need to deal with
EPIPE not just from the pager, but also EPIPE or ECONNRESET
between lei_xsearch and lei2mail processes.

Without this fix, lei_xsearch processes could linger and get
stuck writing to dead lei2mail processes if a user aborts the
pager early during a large result set.

To ensure lei_xsearch processes don't linger around after
lei2mail workers all die, we must close $l2m->{-wq_s2} before
spawning lei_xsearch processes, since $l2m->{-wq_s2} is only
used in lei2mail workers.

For `git cat-file' processes, we also need to trigger
PublicInbox::Git->close to handle unpredictable destructor
ordering to avoid using uninitialized IO refs.  This combines
with the `git_to_mail' change to deal with process cleanup
handling from premature shutdowns.

To test all this, we can't just rely on a single message being
large, but also need to rely on the result set being large
enough to saturate the lei_xsearch -> lei2mail socket so we
rely on GIANT_INBOX_DIR once again.
lib/PublicInbox/Git.pm
lib/PublicInbox/LeiOverview.pm
lib/PublicInbox/LeiToMail.pm
lib/PublicInbox/LeiXSearch.pm
t/lei-sigpipe.t