blob: d3707fa363192960b9bbac6667a7d54c548383a1 [file] [log] [blame]
#!/usr/bin/perl
# (C) Maxim Dounin
# Tests for http proxy cache lock with subrequests.
###############################################################################
use warnings;
use strict;
use Test::More;
BEGIN { use FindBin; chdir($FindBin::Bin); }
use lib 'lib';
use Test::Nginx qw/ :DEFAULT http_end /;
###############################################################################
select STDERR; $| = 1;
select STDOUT; $| = 1;
my $t = Test::Nginx->new()->has(qw/http proxy cache ssi shmem/)
->write_file_expand('nginx.conf', <<'EOF')->plan(2);
%%TEST_GLOBALS%%
daemon off;
events {
}
http {
%%TEST_GLOBALS_HTTP%%
proxy_cache_path %%TESTDIR%%/cache levels=1:2
keys_zone=NAME:1m;
limit_req_zone $binary_remote_addr zone=one:1m rate=1r/m;
server {
listen 127.0.0.1:8080;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_cache NAME;
proxy_cache_lock on;
proxy_cache_lock_timeout 100ms;
proxy_read_timeout 3s;
add_header X-Msec $msec;
}
location = /ssi.html {
ssi on;
}
}
server {
listen 127.0.0.1:8081;
server_name localhost;
limit_req zone=one burst=5;
}
}
EOF
$t->write_file('ssi.html',
'<!--#include virtual="/active" -->' .
'<!--#include virtual="/locked" -->' .
'end'
);
$t->write_file('active', 'active');
$t->write_file('locked', 'locked');
$t->run();
###############################################################################
# problem: if proxy cache lock wakeup happens in a an inactive
# subrequest, just a connection write event may not trigger any
# further work
# main request -> subrequest /active (waiting for a backend),
# -> subrequest /locked (locked by another request)
# this doesn't result in an infinite timeout as second subrequest
# is woken up by the postpone filter once first subrequest completes,
# but this is suboptimal behaviour
my $s = http_get('/locked', start => 1);
like(http_get('/ssi.html'), qr/end/, 'cache lock ssi');
my ($start) = http_end($s) =~ /X-Msec: (\d+)/;
cmp_ok(time() - $start, '<=', 5, 'parallel execution after lock timeout');
###############################################################################