From 39d44555e3f04c97e98c7f5d3538bbba6a19656b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 13 Jan 2021 19:06:15 -1200 Subject: lei: test SIGPIPE, stop xsearch workers on client abort The new test ensures consistency between oneshot and client/daemon users. Cancelling an in-progress result now also stops xsearch workers to avoid wasted CPU and I/O. Note the lei->atfork_child_wq usage changes, it is to workaround a bug in Perl 5: http://nntp.perl.org/group/perl.perl5.porters/258784 This switches the internal protocol to use SOCK_SEQPACKET AF_UNIX sockets to prevent merging messages from the daemon to client to run pager and kill/exit the client script. --- xt/lei-sigpipe.t | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 xt/lei-sigpipe.t (limited to 'xt') diff --git a/xt/lei-sigpipe.t b/xt/lei-sigpipe.t new file mode 100644 index 00000000..4d35bbb3 --- /dev/null +++ b/xt/lei-sigpipe.t @@ -0,0 +1,32 @@ +#!perl -w +# Copyright (C) 2021 all contributors +# License: AGPL-3.0+ +use strict; +use v5.10.1; +use Test::More; +use PublicInbox::TestCommon; +use POSIX qw(WTERMSIG WIFSIGNALED SIGPIPE); +require_mods(qw(json DBD::SQLite Search::Xapian)); +# XXX this needs an already configured lei instance with many messages + +my $do_test = sub { + my $env = shift // {}; + pipe(my ($r, $w)) or BAIL_OUT $!; + open my $err, '+>', undef or BAIL_OUT $!; + my $opt = { run_mode => 0, 1 => $w, 2 => $err }; + my $tp = start_script([qw(lei q -t), 'bytes:1..'], $env, $opt); + close $w; + sysread($r, my $buf, 1); + close $r; # trigger SIGPIPE + $tp->join; + ok(WIFSIGNALED($?), 'signaled'); + is(WTERMSIG($?), SIGPIPE, 'got SIGPIPE'); + seek($err, 0, 0); + my @err = grep(!m{mkdir /dev/null\b}, <$err>); + is_deeply(\@err, [], 'no errors'); +}; + +$do_test->(); +$do_test->({XDG_RUNTIME_DIR => '/dev/null'}); + +done_testing; -- cgit v1.2.3-24-ge0c7