annotate not_modified_finalize.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 5ac6efbe5552
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1096
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for not modified filter and filter finalization.
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 use Test::More;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 BEGIN { use FindBin; chdir($FindBin::Bin); }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 use lib 'lib';
1479
fc3722dd8862 Tests: removed unused gzip imports.
Sergey Kandaurov <pluknet@nginx.com>
parents: 1096
diff changeset
17 use Test::Nginx;
1096
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ###############################################################################
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 select STDERR; $| = 1;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 select STDOUT; $| = 1;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
1484
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
24 my $t = Test::Nginx->new()->has(qw/http proxy cache/)->plan(2)
1096
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 ->write_file_expand('nginx.conf', <<'EOF');
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 %%TEST_GLOBALS%%
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 daemon off;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 events {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 http {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 %%TEST_GLOBALS_HTTP%%
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 proxy_cache_path %%TESTDIR%%/cache keys_zone=cache:1m;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 server {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 listen 127.0.0.1:8080;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 server_name localhost;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 error_page 412 /error412.html;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 location / {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 proxy_pass http://127.0.0.1:8081;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 proxy_cache cache;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 proxy_cache_lock on;
1484
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
49 proxy_cache_valid 1h;
1096
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 location /error412 {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 server {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 listen 127.0.0.1:8081;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 server_name localhost;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 EOF
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 $t->write_file('t.html', 'test file');
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 $t->write_file('error412.html', 'error412');
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 $t->run();
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 ###############################################################################
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 # we trigger filter finalization in not modified filter by using
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 # the If-Unmodified-Since/If-Match header;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 # with cache enabled and updating bit set, this currently results in
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 # "stalled cache updating" alerts
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 like(http_match_get('/t.html'), qr//, 'request 412');
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 $t->todo_alerts();
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
1484
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
80 # in addition, in 1.11.10 .. 1.17.1, if the response was previously
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
81 # cached, such a request resulted in r->cache null pointer dereference
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
82 # in ngx_http_upstream_cache_background_update(), after it was reset
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
83 # during internal redirect
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
84
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
85 http_get('/t.html');
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
86
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
87 like(http_match_get('/t.html'), qr//, 'request 412 cached');
54b92955e4e2 Tests: not_modified_finalize.t with cached response (ticket #1782).
Sergey Kandaurov <pluknet@nginx.com>
parents: 1479
diff changeset
88
1096
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 ###############################################################################
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 sub http_match_get {
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 my ($url, %extra) = @_;
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 return http(<<EOF, %extra);
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 GET $url HTTP/1.0
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 Host: localhost
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 If-Match: tt
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 EOF
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 }
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100
2978c5212045 Tests: filter finalization in not modified filter.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 ###############################################################################