annotate worker_shutdown_timeout_stream.t @ 1752:ba6e24e38f03

Tests: improved stop_daemons() to send signal again. As was observed, it's possible that a signal to complete a uwsgi daemon can be ignored while it is starting up, which results in tests hang due to eternal waiting on child processes termination. Notably, it is seen when running tests with a high number of prove jobs on a low-profile VM against nginx with broken modules and/or configuration. To reproduce: $ TEST_NGINX_GLOBALS=ERROR prove -j16 uwsgi*.t Inspecting uwsgi under ktrace on FreeBSD confirms that a SIGTERM signal is ignored at the very beginning of uwsgi startup. It is then replaced with a default action after listen(), thus waiting until uwsgi is ready to accept new TCP connections doesn't completely solve the hang window. The fix is to retry sending a signal some time after waitpid(WNOHANG) continuously demonstrated no progress with reaping a signaled process. It is modelled after f13ead27f89c that improved stop() for nginx.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 29 Dec 2021 22:29:23 +0300
parents f3ba4c74de31
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1245
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
1 #!/usr/bin/perl
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
2
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
3 # (C) Sergey Kandaurov
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
4 # (C) Nginx, Inc.
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
5
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
6 # Tests for worker_shutdown_timeout directive within the stream module.
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
7
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
8 ###############################################################################
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
9
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
10 use warnings;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
11 use strict;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
12
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
13 use Test::More;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
14
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
15 BEGIN { use FindBin; chdir($FindBin::Bin); }
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
16
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
17 use lib 'lib';
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
18 use Test::Nginx;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
19 use Test::Nginx::SMTP;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
20
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
21 ###############################################################################
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
22
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
23 select STDERR; $| = 1;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
24 select STDOUT; $| = 1;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
25
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
26 local $SIG{PIPE} = 'IGNORE';
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
27
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
28 my $t = Test::Nginx->new()->has(qw/stream/)->plan(3)
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
29 ->write_file_expand('nginx.conf', <<'EOF');
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
30
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
31 %%TEST_GLOBALS%%
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
32
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
33 daemon off;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
34 worker_shutdown_timeout 10ms;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
35
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
36 events {
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
37 }
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
38
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
39 stream {
1609
f3ba4c74de31 Tests: added TEST_GLOBALS_STREAM variable support.
Andrei Belov <defan@nginx.com>
parents: 1381
diff changeset
40 %%TEST_GLOBALS_STREAM%%
f3ba4c74de31 Tests: added TEST_GLOBALS_STREAM variable support.
Andrei Belov <defan@nginx.com>
parents: 1381
diff changeset
41
1245
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
42 server {
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
43 listen 127.0.0.1:8025;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
44 proxy_pass 127.0.0.1:8026;
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
45 }
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
46 }
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
47
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
48 EOF
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
49
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
50 $t->run_daemon(\&Test::Nginx::SMTP::smtp_test_daemon);
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
51 $t->run()->waitforsocket('127.0.0.1:' . port(8026));
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
52
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
53 ###############################################################################
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
54
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
55 my $s = Test::Nginx::SMTP->new();
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
56 $s->check(qr/^220 /, "greeting");
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
57
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
58 $s->send('EHLO example.com');
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
59 $s->check(qr/^250 /, "ehlo");
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
60
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
61 $t->reload();
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
62
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
63 ok($s->can_read(), 'stream connection shutdown');
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
64
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
65 undef $s;
1259
caf59f42a3e1 Tests: handled GC deficiency in Perl < 5.22.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1245
diff changeset
66 1;
1245
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
67
6d7707405632 Tests: worker_shutdown_timeout within the stream module.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff changeset
68 ###############################################################################