[core] quicker graceful shutdown
close connections in keep-alive that are waiting for next request disable keep-alive on existing connections remove bandwidth write limits reduce remaining linger timeout (on already finished requests) to be (from zero) *up to* one more second, but no more
This commit is contained in:
parent
65a6740fe2
commit
0f9b9242d8
39
src/server.c
39
src/server.c
|
@ -698,6 +698,42 @@ static void show_help (void) {
|
|||
write_all(STDOUT_FILENO, b, strlen(b));
|
||||
}
|
||||
|
||||
static void server_graceful_shutdown_maint (server *srv) {
|
||||
connections *conns = srv->conns;
|
||||
for (size_t ndx = 0; ndx < conns->used; ++ndx) {
|
||||
connection * const con = conns->ptr[ndx];
|
||||
int changed = 0;
|
||||
|
||||
if (con->state == CON_STATE_CLOSE) {
|
||||
/* reduce remaining linger timeout to be
|
||||
* (from zero) *up to* one more second, but no more */
|
||||
if (HTTP_LINGER_TIMEOUT > 1)
|
||||
con->close_timeout_ts -= (HTTP_LINGER_TIMEOUT - 1);
|
||||
if (srv->cur_ts - con->close_timeout_ts > HTTP_LINGER_TIMEOUT)
|
||||
changed = 1;
|
||||
}
|
||||
else if (con->state == CON_STATE_READ && con->request_count > 1
|
||||
&& chunkqueue_is_empty(con->read_queue)) {
|
||||
/* close connections in keep-alive waiting for next request */
|
||||
connection_set_state(srv, con, CON_STATE_ERROR);
|
||||
changed = 1;
|
||||
}
|
||||
|
||||
con->keep_alive = 0; /* disable keep-alive */
|
||||
|
||||
con->conf.kbytes_per_second = 0; /* disable rate limit */
|
||||
con->conf.global_kbytes_per_second = 0; /* disable rate limit */
|
||||
if (con->traffic_limit_reached) {
|
||||
con->traffic_limit_reached = 0;
|
||||
changed = 1;
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
connection_state_machine(srv, con);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
server *srv = NULL;
|
||||
int print_config = 0;
|
||||
|
@ -1568,6 +1604,8 @@ int main (int argc, char **argv) {
|
|||
for (i = 0; i < srv->config_context->used; ++i) {
|
||||
srv->config_storage[i]->global_bytes_per_second_cnt = 0;
|
||||
}
|
||||
/* if graceful_shutdown, accelerate cleanup of recently completed request/responses */
|
||||
if (graceful_shutdown && !srv_shutdown) server_graceful_shutdown_maint(srv);
|
||||
/**
|
||||
* check all connections for timeouts
|
||||
*
|
||||
|
@ -1724,6 +1762,7 @@ int main (int argc, char **argv) {
|
|||
if (graceful_shutdown) {
|
||||
remove_pid_file(srv, &pid_fd);
|
||||
log_error_write(srv, __FILE__, __LINE__, "s", "[note] graceful shutdown started");
|
||||
if (!srv_shutdown) server_graceful_shutdown_maint(srv);
|
||||
} else if (srv->conns->used >= srv->max_conns) {
|
||||
log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, connection limit reached");
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue