From 751bdd3bb2b6ff54be09c37ff328f258fed520fb Mon Sep 17 00:00:00 2001 From: Maxim Dounin Date: Thu, 12 Jul 2018 19:50:02 +0300 Subject: [PATCH] Events: moved sockets cloning to ngx_event_init_conf(). Previously, listenings sockets were not cloned if the worker_processes directive was specified after "listen ... reuseport". This also simplifies upcoming configuration check on the number of worker connections, as it needs to know the number of listening sockets before cloning. --- src/core/ngx_connection.c | 9 ++++----- src/core/ngx_connection.h | 2 +- src/event/ngx_event.c | 25 +++++++++++++++++++++++++ src/http/ngx_http.c | 4 ---- src/stream/ngx_stream.c | 4 ---- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c index 61ea4c2dd..33682532a 100644 --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -96,7 +96,7 @@ ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr, ngx_int_t -ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls) +ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls) { #if (NGX_HAVE_REUSEPORT) @@ -104,20 +104,19 @@ ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls) ngx_core_conf_t *ccf; ngx_listening_t ols; - if (!ls->reuseport) { + if (!ls->reuseport || ls->worker != 0) { return NGX_OK; } ols = *ls; - ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx, - ngx_core_module); + ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); for (n = 1; n < ccf->worker_processes; n++) { /* create a socket for each worker process */ - ls = ngx_array_push(&cf->cycle->listening); + ls = ngx_array_push(&cycle->listening); if (ls == NULL) { return NGX_ERROR; } diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h index ef0755800..54059629e 100644 --- a/src/core/ngx_connection.h +++ b/src/core/ngx_connection.h @@ -210,7 +210,7 @@ struct ngx_connection_s { ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr, socklen_t socklen); -ngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls); +ngx_int_t ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls); ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle); ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle); void ngx_configure_listening_sockets(ngx_cycle_t *cycle); diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 57af81324..a18b1132c 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -410,12 +410,37 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat) static char * ngx_event_init_conf(ngx_cycle_t *cycle, void *conf) { +#if (NGX_HAVE_REUSEPORT) + ngx_uint_t i; + ngx_listening_t *ls; +#endif + if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no \"events\" section in configuration"); return NGX_CONF_ERROR; } +#if (NGX_HAVE_REUSEPORT) + + ls = cycle->listening.elts; + for (i = 0; i < cycle->listening.nelts; i++) { + + if (!ls[i].reuseport || ls[i].worker != 0) { + continue; + } + + if (ngx_clone_listening(cycle, &ls[i]) != NGX_OK) { + return NGX_CONF_ERROR; + } + + /* cloning may change cycle->listening.elts */ + + ls = cycle->listening.elts; + } + +#endif + return NGX_CONF_OK; } diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c index 9d8b6d79a..5e2022690 100644 --- a/src/http/ngx_http.c +++ b/src/http/ngx_http.c @@ -1685,10 +1685,6 @@ ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port) break; } - if (ngx_clone_listening(cf, ls) != NGX_OK) { - return NGX_ERROR; - } - addr++; last--; } diff --git a/src/stream/ngx_stream.c b/src/stream/ngx_stream.c index 0efbda89e..4abe387e8 100644 --- a/src/stream/ngx_stream.c +++ b/src/stream/ngx_stream.c @@ -538,10 +538,6 @@ ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports) break; } - if (ngx_clone_listening(cf, ls) != NGX_OK) { - return NGX_CONF_ERROR; - } - addr++; last--; }