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,AWL,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 6FD1A1F90C for ; Thu, 16 Apr 2020 01:48:39 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 1/2] t/httpd-corner: improve reliability and diagnostics Date: Thu, 16 Apr 2020 01:48:37 +0000 Message-Id: <20200416014838.5939-2-e@yhbt.net> In-Reply-To: <20200416014838.5939-1-e@yhbt.net> References: <20200416014838.5939-1-e@yhbt.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: The graceful-shutdown-on-PUT test is unreliable because we can't rely on a FIFO as we do with the GET tests. So increase the delay to 100ms since that seems enough on my system even with CONFIG_HZ=100. Add a timeout and backtrace to the $check_self sub to help with further diagnostics while we're at it, too. It would be nice if there were a portable syscall tracing mechanism we could attach to the -httpd process to make the test more determistic... --- t/httpd-corner.t | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/t/httpd-corner.t b/t/httpd-corner.t index 21b5c560..f25a9a9c 100644 --- a/t/httpd-corner.t +++ b/t/httpd-corner.t @@ -16,6 +16,7 @@ use IO::Socket::UNIX; use Fcntl qw(:seek); use Socket qw(IPPROTO_TCP TCP_NODELAY SOL_SOCKET); use POSIX qw(mkfifo); +use Carp (); my ($tmpdir, $for_destroy) = tmpdir(); my $fifo = "$tmpdir/fifo"; ok(defined mkfifo($fifo, 0777), 'created FIFO'); @@ -298,6 +299,8 @@ my $len = length $str; is($len, 26, 'got the alphabet'); my $check_self = sub { my ($conn) = @_; + vec(my $rbits, fileno($conn), 1) = 1; + select($rbits, undef, undef, 30) or Carp::confess('timed out'); $conn->read(my $buf, 4096); my ($head, $body) = split(/\r\n\r\n/, $buf, 2); like($head, qr/\r\nContent-Length: 40\r\n/s, 'got expected length'); @@ -391,17 +394,20 @@ SKIP: { { my $conn = conn_for($sock, 'graceful termination during slow request'); - $conn->write("PUT /sha1 HTTP/1.0\r\n"); - delay(); - $conn->write("Content-Length: $len\r\n"); - delay(); - $conn->write("\r\n"); - is($td->kill, 1, 'started graceful shutdown'); - delay(); + $conn->write("PUT /sha1 HTTP/1.0\r\nContent-Length: $len\r\n\r\n"); + + # XXX ugh, want a reliable and non-intrusive way to detect + # that the server has started buffering our partial request so we + # can reliably test graceful termination. Maybe making this and + # similar tests dependent on Linux strace is a possibility? + delay(0.1); + + is($td->kill, 1, 'start graceful shutdown'); my $n = 0; foreach my $c ('a'..'z') { $n += $conn->write($c); } + ok(kill(0, $td->{pid}), 'graceful shutdown did not kill httpd'); is($n, $len, 'wrote alphabet'); $check_self->($conn); $td->join;