|
|
|
@ -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) {
|
|
|
|
|