From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 1E8431F5A0 for ; Sun, 12 Feb 2023 03:13:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1676171599; bh=9eDNlk+rC+qoKbKPP8e23WWpWp2AQwkyQf6Y3e5Ipwo=; h=From:To:Subject:Date:From; b=KOptrPCi0s/gHGE1beujxcyX8aYNPBtOk8S/QNAv69Y076d6c1l2+3rnW0Jsvm+vd BIDZ82BiHizIsH1SV+7NC51vilTIIR0auOyMtIwA8gNmTAIo3cIp6bCJZVSfLb4uBC +jJ3DapNtKUxssdpsFNYLaYy9DfHVffsC/RKmZ4M= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] t/lei-refresh-mail-sync: avoid kill+sleep loop Date: Sun, 12 Feb 2023 03:12:03 +0000 Message-Id: <20230212031203.3020863-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: While we can't waitpid() on daemonized process, we can abuse the lack of FD_CLOEXEC to detect a process death. This saves roughly 400ms for this slow test. --- lib/PublicInbox/TestCommon.pm | 3 +++ t/lei-refresh-mail-sync.t | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/lib/PublicInbox/TestCommon.pm b/lib/PublicInbox/TestCommon.pm index 1fe7931e..8a34e45a 100644 --- a/lib/PublicInbox/TestCommon.pm +++ b/lib/PublicInbox/TestCommon.pm @@ -480,6 +480,9 @@ sub start_script { my $pid = fork // die "fork: $!\n"; if ($pid == 0) { eval { PublicInbox::DS->Reset }; + for (@{delete($opt->{-CLOFORK}) // []}) { + close($_) or die "close $!"; + } # pretend to be systemd (cf. sd_listen_fds(3)) # 3 == SD_LISTEN_FDS_START my $fd; diff --git a/t/lei-refresh-mail-sync.t b/t/lei-refresh-mail-sync.t index ea83a513..0498a0c4 100644 --- a/t/lei-refresh-mail-sync.t +++ b/t/lei-refresh-mail-sync.t @@ -5,17 +5,20 @@ use strict; use v5.10.1; use PublicInbox::TestCommon; require_mods(qw(lei)); use File::Path qw(remove_tree); require Socket; +use Fcntl qw(F_SETFD); + +pipe(my ($stop_r, $stop_w)) or xbail "pipe: $!"; +fcntl($stop_w, F_SETFD, 0) or xbail "F_SETFD: $!"; my $stop_daemon = sub { # needed since we don't have inotify + close $stop_w or xbail "close \$stop_w: $!"; lei_ok qw(daemon-pid); chomp(my $pid = $lei_out); $pid > 0 or xbail "bad pid: $pid"; kill('TERM', $pid) or xbail "kill: $!"; - for (0..10) { - tick; - kill(0, $pid) or last; - } - kill(0, $pid) and xbail "daemon still running (PID:$pid)"; + is(sysread($stop_r, my $buf, 1), 0, 'daemon stop pipe read EOF'); + pipe($stop_r, $stop_w) or xbail "pipe: $!"; + fcntl($stop_w, F_SETFD, 0) or xbail "F_SETFD: $!"; }; test_lei({ daemon_only => 1 }, sub { @@ -88,7 +91,8 @@ SKIP: { $sock_cls //= ref($s); my $cmd = [ "-$x", '-W0', "--stdout=$home/$x.out", "--stderr=$home/$x.err" ]; - my $td = start_script($cmd, $env, { 3 => $s }) or xbail("-$x"); + my $opt = { 3 => $s, -CLOFORK => [ $stop_w ] }; + my $td = start_script($cmd, $env, $opt) or xbail("-$x"); my $addr = tcp_host_port($s); $srv->{$x} = { addr => $addr, td => $td, cmd => $cmd, s => $s }; } @@ -139,8 +143,8 @@ SKIP: { my $cmd = $srv->{imapd}->{cmd}; my $s = $srv->{imapd}->{s}; $s->blocking(0); - $srv->{imapd}->{td} = start_script($cmd, $env, { 3 => $s }) or - xbail "@$cmd"; + my $opt = { 3 => $s, -CLOFORK => [ $stop_w ] }; + $srv->{imapd}->{td} = start_script($cmd, $env, $opt) or xbail "@$cmd"; lei_ok 'refresh-mail-sync', '--all'; lei_ok 'inspect', "blob:$oid"; is($lei_out, $before, 'no changes when server was down');