Skip to content

Commit

Permalink
bugfix: tcpsock:setkeepalive: worker processes might take too long to…
Browse files Browse the repository at this point in the history
… gracefully shut down when the keep alive connections take a long max idle time.

Now we avoid putting any new connections into the pool when nginx is already
shutting down.

Signed-off-by: Yichun Zhang (agentzh) <yichun@openresty.com>
  • Loading branch information
doujiang24 authored and agentzh committed Sep 24, 2018
1 parent e94f2e5 commit f64ec8c
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/ngx_http_lua_socket_tcp.c
Expand Up @@ -4690,6 +4690,14 @@ ngx_http_lua_socket_tcp_setkeepalive(lua_State *L)
return 2;
}

if (ngx_terminate || ngx_exiting) {
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"lua tcp socket set keepalive while process exiting, "
"closing connection %p", c);

goto finalize;
}

ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"lua tcp socket set keepalive: saving connection %p", c);

Expand Down Expand Up @@ -4854,6 +4862,8 @@ ngx_http_lua_socket_tcp_setkeepalive(lua_State *L)
}
}

finalize:

#if 1
ngx_http_lua_socket_tcp_finalize(r, u);
#endif
Expand Down
91 changes: 91 additions & 0 deletions t/157-socket-keepalive-hup.t
@@ -0,0 +1,91 @@
# vim:set ft= ts=4 sw=4 et fdm=marker:

our $SkipReason;

BEGIN {
if ($ENV{TEST_NGINX_CHECK_LEAK}) {
$SkipReason = "unavailable for the hup tests";

} else {
$ENV{TEST_NGINX_USE_HUP} = 1;
undef $ENV{TEST_NGINX_USE_STAP};
}
}

use Test::Nginx::Socket::Lua $SkipReason ? (skip_all => $SkipReason) : ();

repeat_each(2);

plan tests => repeat_each() * (blocks() * 8);

#no_diff();
no_long_string();

worker_connections(1024);
run_tests();

__DATA__

=== TEST 1: exiting
--- config
location /t {
set $port $TEST_NGINX_SERVER_PORT;

content_by_lua_block {
local f, err = io.open("t/servroot/logs/nginx.pid", "r")
if not f then
ngx.say("failed to open nginx.pid: ", err)
return
end

local pid = f:read()
-- ngx.say("master pid: [", pid, "]")

f:close()

local i = 0
local port = ngx.var.port

local function f(premature)
print("timer prematurely expired: ", premature)

local sock = ngx.socket.tcp()

local ok, err = sock:connect("127.0.0.1", port)
if not ok then
print("failed to connect: ", err)
return
end

local ok, err = sock:setkeepalive()
if not ok then
print("failed to setkeepalive: ", err)
return
end

print("setkeepalive successfully")
end
local ok, err = ngx.timer.at(3, f)
if not ok then
ngx.say("failed to set timer: ", err)
return
end
ngx.say("registered timer")
os.execute("kill -HUP " .. pid)
}
}
--- request
GET /t

--- response_body
registered timer

--- wait: 0.3
--- no_error_log
[error]
[alert]
[crit]
--- error_log
timer prematurely expired: true
setkeepalive successfully
lua tcp socket set keepalive while process exiting, closing connection

0 comments on commit f64ec8c

Please sign in to comment.