[PATCH] Workaround for "configuration file test failed" under OpenVZ

Gena Makhomed gmm at csdoc.com
Mon Aug 3 09:56:20 UTC 2015


On 03.08.2015 12:26, Maxim Dounin wrote:

> Here is the patch with slightly updated commit log and a comment
> added to the code.  Please take a look if it looks fine to you.

Yes, updated version of patch is more clean and easy to understand,
thank you!

> # HG changeset patch
> # User Gena Makhomed <gmm at csdoc.com>
> # Date 1437674403 14400
> #      Thu Jul 23 14:00:03 2015 -0400
> # Node ID 3096ae76ba4726a5138e9e7161428c7afea67c0f
> # Parent  b544f8e0d9214560a6acddbb0f40db5146e9463d
> Workaround for "configuration file test failed" under OpenVZ.
>
> If nginx was used under OpenVZ and a container with nginx was suspended
> and resumed, configuration tests started to fail because of EADDRINUSE
> returned from listen() instead of bind():
>
> # nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: [emerg] listen() to 0.0.0.0:80, backlog 511 failed (98: Address already in use)
> nginx: configuration file /etc/nginx/nginx.conf test failed
>
> With this change EADDRINUSE errors returned by listen() are handled
> similarly to errors returned by bind(), and configuration tests work
> fine in the same environment:
>
> # nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful
>
> More details about OpenVZ suspend/resume bug:
> https://bugzilla.openvz.org/show_bug.cgi?id=2470
>
> diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
> --- a/src/core/ngx_connection.c
> +++ b/src/core/ngx_connection.c
> @@ -567,9 +567,19 @@ ngx_open_listening_sockets(ngx_cycle_t *
>   #endif
>
>               if (listen(s, ls[i].backlog) == -1) {
> -                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
> -                              "listen() to %V, backlog %d failed",
> -                              &ls[i].addr_text, ls[i].backlog);
> +                err = ngx_socket_errno;
> +
> +                /*
> +                 * on OpenVZ after suspend/resume EADDRINUSE
> +                 * may be returned by listen() instead of bind(), see
> +                 * https://bugzilla.openvz.org/show_bug.cgi?id=2470
> +                 */
> +
> +                if (err != NGX_EADDRINUSE || !ngx_test_config) {
> +                    ngx_log_error(NGX_LOG_EMERG, log, err,
> +                                  "listen() to %V, backlog %d failed",
> +                                  &ls[i].addr_text, ls[i].backlog);
> +                }
>
>                   if (ngx_close_socket(s) == -1) {
>                       ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
> @@ -577,7 +587,15 @@ ngx_open_listening_sockets(ngx_cycle_t *
>                                     &ls[i].addr_text);
>                   }
>
> -                return NGX_ERROR;
> +                if (err != NGX_EADDRINUSE) {
> +                    return NGX_ERROR;
> +                }
> +
> +                if (!ngx_test_config) {
> +                    failed = 1;
> +                }
> +
> +                continue;
>               }
>
>               ls[i].listen = 1;
>

-- 
Best regards,
  Gena



More information about the nginx-devel mailing list