MINOR: listener: new function listener_release

Instead of duplicating some sensitive listener-specific code in the
session and in the stream code, let's call listener_release() when
releasing a connection attached to a listener.
This commit is contained in:
Willy Tarreau 2017-09-15 09:19:58 +02:00
parent 6f5e4b98df
commit 05f5047d40
4 changed files with 32 additions and 29 deletions

View File

@ -102,6 +102,12 @@ void delete_listener(struct listener *listener);
*/ */
void listener_accept(int fd); void listener_accept(int fd);
/* Notify the listener that a connection initiated from it was released. This
* is used to keep the connection count consistent and to possibly re-open
* listening when it was limited.
*/
void listener_release(struct listener *l);
/* /*
* Registers the bind keyword list <kwl> as a list of valid keywords for next * Registers the bind keyword list <kwl> as a list of valid keywords for next
* parsing sessions. * parsing sessions.

View File

@ -588,6 +588,29 @@ void listener_accept(int fd)
return; return;
} }
/* Notify the listener that a connection initiated from it was released. This
* is used to keep the connection count consistent and to possibly re-open
* listening when it was limited.
*/
void listener_release(struct listener *l)
{
struct proxy *fe = l->bind_conf->frontend;
if (!(l->options & LI_O_UNLIMITED))
actconn--;
l->nbconn--;
if (l->state == LI_FULL)
resume_listener(l);
/* Dequeues all of the listeners waiting for a resource */
if (!LIST_ISEMPTY(&global_listener_queue))
dequeue_all_listeners(&global_listener_queue);
if (!LIST_ISEMPTY(&fe->listener_queue) &&
(!fe->fe_sps_lim || freq_ctr_remain(&fe->fe_sess_per_sec, fe->fe_sps_lim, 0) > 0))
dequeue_all_listeners(&fe->listener_queue);
}
/* /*
* Registers the bind keyword list <kwl> as a list of valid keywords for next * Registers the bind keyword list <kwl> as a list of valid keywords for next
* parsing sessions. * parsing sessions.

View File

@ -376,20 +376,7 @@ static void session_kill_embryonic(struct session *sess)
conn_free(conn); conn_free(conn);
sess->fe->feconn--; sess->fe->feconn--;
listener_release(sess->listener);
if (!(sess->listener->options & LI_O_UNLIMITED))
actconn--;
sess->listener->nbconn--;
if (sess->listener->state == LI_FULL)
resume_listener(sess->listener);
/* Dequeues all of the listeners waiting for a resource */
if (!LIST_ISEMPTY(&global_listener_queue))
dequeue_all_listeners(&global_listener_queue);
if (!LIST_ISEMPTY(&sess->fe->listener_queue) &&
(!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0))
dequeue_all_listeners(&sess->fe->listener_queue);
task_delete(task); task_delete(task);
task_free(task); task_free(task);

View File

@ -2421,21 +2421,8 @@ struct task *process_stream(struct task *t)
if (s->flags & SF_BE_ASSIGNED) if (s->flags & SF_BE_ASSIGNED)
s->be->beconn--; s->be->beconn--;
if (sess->listener) { if (sess->listener)
if (!(sess->listener->options & LI_O_UNLIMITED)) listener_release(sess->listener);
actconn--;
sess->listener->nbconn--;
if (sess->listener->state == LI_FULL)
resume_listener(sess->listener);
/* Dequeues all of the listeners waiting for a resource */
if (!LIST_ISEMPTY(&global_listener_queue))
dequeue_all_listeners(&global_listener_queue);
if (!LIST_ISEMPTY(&sess->fe->listener_queue) &&
(!sess->fe->fe_sps_lim || freq_ctr_remain(&sess->fe->fe_sess_per_sec, sess->fe->fe_sps_lim, 0) > 0))
dequeue_all_listeners(&sess->fe->listener_queue);
}
if (unlikely((global.mode & MODE_DEBUG) && if (unlikely((global.mode & MODE_DEBUG) &&
(!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) { (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) {