blob: 5097118bc46f9e11db1d36648f257ffdfb9558be [file] [log] [blame] [raw]
# vim:set ft= ts=4 sw=4 et fdm=marker:
BEGIN {
if (!defined $ENV{LD_PRELOAD}) {
$ENV{LD_PRELOAD} = '';
}
if ($ENV{LD_PRELOAD} !~ /\bmockeagain\.so\b/) {
$ENV{LD_PRELOAD} = "mockeagain.so $ENV{LD_PRELOAD}";
}
if ($ENV{MOCKEAGAIN} eq 'r') {
$ENV{MOCKEAGAIN} = 'rw';
} else {
$ENV{MOCKEAGAIN} = 'w';
}
$ENV{TEST_NGINX_EVENT_TYPE} = 'poll';
$ENV{MOCKEAGAIN_WRITE_TIMEOUT_PATTERN} = 'hello, world';
$ENV{TEST_NGINX_POSTPONE_OUTPUT} = 1;
}
use lib 'lib';
use Test::Nginx::Socket::Lua;
use t::StapThread;
our $GCScript = $t::StapThread::GCScript;
our $StapScript = $t::StapThread::StapScript;
#worker_connections(1014);
#master_on();
#workers(2);
#log_level('warn');
repeat_each(2);
plan tests => repeat_each() * (blocks() * 1 + 2);
#no_diff();
no_long_string();
run_tests();
__DATA__
=== TEST 1: flush wait - timeout
--- config
send_timeout 100ms;
location /test {
content_by_lua '
ngx.say("hello, world")
ngx.flush(true)
ngx.say("hiya")
';
}
--- request
GET /test
--- ignore_response
--- error_log eval
[qr/client timed out \(\d+: .*?timed out\)/]
=== TEST 2: send timeout timer got removed in time
--- config
send_timeout 1234ms;
location /test {
content_by_lua '
ngx.say(string.rep("blah blah blah", 10))
-- ngx.flush(true)
ngx.eof()
for i = 1, 20 do
ngx.sleep(0.1)
end
';
}
--- request
GET /test
--- stap
global evtime
F(ngx_http_handler) {
delete evtime
}
M(timer-add) {
if ($arg2 == 1234) {
printf("add timer %d\n", $arg2)
evtime[$arg1] = $arg2
}
}
M(timer-del) {
time = evtime[$arg1]
if (time == 1234) {
printf("del timer %d\n", time)
}
}
M(timer-expire) {
time = evtime[$arg1]
if (time == 1234) {
printf("expire timer %d\n", time)
#print_ubacktrace()
}
}
/*
probe syscall.writev.return {
if (pid() == target()) {
printf("writev: %s\n", retstr)
}
}
*/
--- stap_out
add timer 1234
del timer 1234
--- ignore_response
--- no_error_log
[error]
--- timeout: 3
=== TEST 3: exit in user thread (entry thread is still pending on ngx.flush)
--- config
send_timeout 200ms;
location /lua {
content_by_lua '
function f()
ngx.say("hello in thread")
ngx.sleep(0.1)
ngx.exit(0)
end
ngx.say("before")
ngx.thread.spawn(f)
ngx.say("after")
ngx.say("hello, world!")
ngx.flush(true)
ngx.say("end")
';
}
--- request
GET /lua
--- stap2 eval: $::StapScript
--- stap eval
<<'_EOC_' . $::GCScript;
global timers
F(ngx_http_free_request) {
println("free request")
}
M(timer-add) {
if ($arg2 == 200 || $arg2 == 100) {
timers[$arg1] = $arg2
printf("add timer %d\n", $arg2)
}
}
M(timer-del) {
tm = timers[$arg1]
if (tm == 200 || tm == 100) {
printf("delete timer %d\n", tm)
delete timers[$arg1]
}
}
M(timer-expire) {
tm = timers[$arg1]
if (tm == 200 || tm == 100) {
printf("expire timer %d\n", timers[$arg1])
delete timers[$arg1]
}
}
F(ngx_http_lua_coctx_cleanup) {
println("lua tcp socket cleanup")
}
/*
F(ngx_http_finalize_request) {
printf("finalize request: c:%d, a:%d, cb:%d, rb:%d\n", $r->main->count,
$r == $r->connection->data, $r->connection->buffered, $r->buffered)
}
F(ngx_http_set_write_handler) {
println("set write handler")
}
*/
F(ngx_http_lua_flush_cleanup) {
println("lua flush cleanup")
}
_EOC_
--- stap_out
create 2 in 1
spawn user thread 2 in 1
add timer 100
add timer 200
expire timer 100
terminate 2: ok
lua flush cleanup
delete timer 200
delete thread 2
delete thread 1
add timer 200
expire timer 200
free request
--- ignore_response
--- no_error_log
[error]