# HG changeset patch # User Maxim Dounin # Date 1417064872 -10800 # Node ID 318f305a20145f672ba22daa51ba3d839719d90a # Parent 071e8941e3bfba8b5ac401857c3cd532d7d3ba49 Tests: proxy_cache_lock with subrequests. diff --git a/proxy_cache_lock_ssi.t b/proxy_cache_lock_ssi.t new file mode 100644 --- /dev/null +++ b/proxy_cache_lock_ssi.t @@ -0,0 +1,110 @@ +#!/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; + +plan(skip_all => 'win32') if $^O eq 'MSWin32'; + +my $t = Test::Nginx->new()->has(qw/http proxy cache ssi/) + ->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 2s; + } + + 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', + '' . + '' . + '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 $start = time(); + +my $s = http_get('/locked', start => 1); +like(http_get('/ssi.html'), qr/end/, 'cache lock ssi'); +http_end($s); + +TODO: { +local $TODO = 'not yet'; + +cmp_ok(time() - $start, '<=', 3, 'parallel execution after lock timeout'); + +} + +###############################################################################