annotate proxy_cache_lock_ssi.t @ 572:ca54b445d982

Tests: masked nginx bug in proxy next upstream. When iterating through several next upstreams per a worker cycle, a previously reported event about upstream connection error may be improperly applied to the next upstream, thus leading to the invalid connection error. E.g., in kqueue, where the problem is visible, this is caused by "ev->instance" that does not tolerate more than one next upstream at once, and kevents placed on the kqueue separately for read and write events. The change is to limit test case to the only one next upstream.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 14 May 2015 11:54:24 +0300
parents 907e89fba9c3
children 2cd00179f4b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
504
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for http proxy cache lock with subrequests.
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 use Test::More;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 BEGIN { use FindBin; chdir($FindBin::Bin); }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16 use lib 'lib';
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 use Test::Nginx qw/ :DEFAULT http_end /;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 ###############################################################################
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21 select STDERR; $| = 1;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 select STDOUT; $| = 1;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24 plan(skip_all => 'win32') if $^O eq 'MSWin32';
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26 my $t = Test::Nginx->new()->has(qw/http proxy cache ssi/)
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 ->write_file_expand('nginx.conf', <<'EOF')->plan(2);
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 %%TEST_GLOBALS%%
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31 daemon off;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 events {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 http {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 %%TEST_GLOBALS_HTTP%%
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 proxy_cache_path %%TESTDIR%%/cache levels=1:2
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 keys_zone=NAME:1m;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 limit_req_zone $binary_remote_addr zone=one:1m rate=1r/m;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 server {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45 listen 127.0.0.1:8080;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 server_name localhost;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 location / {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 proxy_pass http://127.0.0.1:8081;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 proxy_cache NAME;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 proxy_cache_lock on;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 proxy_cache_lock_timeout 100ms;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 proxy_read_timeout 2s;
547
714668aea2b0 Tests: adjusted proxy_cache_lock tests with subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 506
diff changeset
56
714668aea2b0 Tests: adjusted proxy_cache_lock tests with subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 506
diff changeset
57 add_header X-Msec $msec;
504
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 location = /ssi.html {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 ssi on;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 server {
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 listen 127.0.0.1:8081;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 server_name localhost;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 limit_req zone=one burst=5;
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 }
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73 EOF
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 $t->write_file('ssi.html',
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 '<!--#include virtual="/active" -->' .
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 '<!--#include virtual="/locked" -->' .
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 'end'
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 );
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 $t->write_file('active', 'active');
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 $t->write_file('locked', 'locked');
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 $t->run();
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 ###############################################################################
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 # problem: if proxy cache lock wakeup happens in a an inactive
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 # subrequest, just a connection write event may not trigger any
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 # further work
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 # main request -> subrequest /active (waiting for a backend),
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 # -> subrequest /locked (locked by another request)
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 # this doesn't result in an infinite timeout as second subrequest
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 # is woken up by the postpone filter once first subrequest completes,
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97 # but this is suboptimal behaviour
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 my $s = http_get('/locked', start => 1);
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 like(http_get('/ssi.html'), qr/end/, 'cache lock ssi');
547
714668aea2b0 Tests: adjusted proxy_cache_lock tests with subrequests.
Sergey Kandaurov <pluknet@nginx.com>
parents: 506
diff changeset
101 my ($start) = http_end($s) =~ /X-Msec: (\d+)/;
504
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 cmp_ok(time() - $start, '<=', 3, 'parallel execution after lock timeout');
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103
318f305a2014 Tests: proxy_cache_lock with subrequests.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 ###############################################################################