diff --git a/src/server.c b/src/server.c index ae062e08..d17ffd0c 100644 --- a/src/server.c +++ b/src/server.c @@ -994,6 +994,51 @@ static void server_graceful_state (server *srv) { } } +__attribute_cold__ +static void server_sockets_enable (server *srv) { + server_sockets_set_event(srv, FDEVENT_IN); + srv->sockets_disabled = 0; + log_error_write(srv, __FILE__, __LINE__, "s", + "[note] sockets enabled again"); +} + +__attribute_cold__ +static void server_sockets_disable (server *srv) { + server_sockets_set_event(srv, 0); + srv->sockets_disabled = 1; + log_error_write(srv, __FILE__, __LINE__, "s", + (srv->conns->used >= srv->max_conns) + ? "[note] sockets disabled, connection limit reached" + : "[note] sockets disabled, out-of-fds"); +} + +__attribute_cold__ +static void server_overload_check (server *srv) { + if (srv->cur_fds + srv->want_fds < srv->max_fds_lowat + && srv->conns->used <= srv->max_conns * 9 / 10) { + + server_sockets_enable(srv); + } +} + +static void server_load_check (server *srv) { + if (srv->cur_fds + srv->want_fds > srv->max_fds_hiwat /* out of fds */ + || srv->conns->used >= srv->max_conns) { /* out of connections */ + + server_sockets_disable(srv); + } +} + +__attribute_cold__ +static void server_process_want_fds (server *srv) { + for (int n = srv->max_fds - srv->cur_fds - 16; n > 0; --n) { + connection *con = fdwaitqueue_unshift(srv, srv->fdwaitqueue); + if (NULL == con) break; + connection_state_machine(srv, con); + --srv->want_fds; + } +} + __attribute_cold__ static int server_main (server * const srv, int argc, char **argv) { int print_config = 0; @@ -1989,42 +2034,13 @@ static int server_main_loop (server * const srv) { break; } } else if (srv->sockets_disabled) { - /* our server sockets are disabled, why ? */ - - if ((srv->cur_fds + srv->want_fds < srv->max_fds_lowat) && /* we have enough unused fds */ - (srv->conns->used <= srv->max_conns * 9 / 10)) { - server_sockets_set_event(srv, FDEVENT_IN); - log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets enabled again"); - - srv->sockets_disabled = 0; - } + server_overload_check(srv); } else { - if ((srv->cur_fds + srv->want_fds > srv->max_fds_hiwat) || /* out of fds */ - (srv->conns->used >= srv->max_conns)) { /* out of connections */ - /* disable server-fds */ - server_sockets_set_event(srv, 0); - - if (srv->conns->used >= srv->max_conns) { - log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, connection limit reached"); - } else { - log_error_write(srv, __FILE__, __LINE__, "s", "[note] sockets disabled, out-of-fds"); - } - - srv->sockets_disabled = 1; - } + server_load_check(srv); } - /* we still have some fds to share */ if (srv->want_fds) { - /* check the fdwaitqueue for waiting fds */ - int free_fds = srv->max_fds - srv->cur_fds - 16; - connection *con; - - for (; free_fds > 0 && NULL != (con = fdwaitqueue_unshift(srv, srv->fdwaitqueue)); free_fds--) { - connection_state_machine(srv, con); - - srv->want_fds--; - } + server_process_want_fds(srv); } if ((n = fdevent_poll(srv->ev, 1000)) >= 0) {