[PATCH 8 of 9] Upstream: disable re-resolve functionality on Windows

Roman Arutyunyan arut at nginx.com
Wed Jul 10 13:16:07 UTC 2024


Hi,

On Thu, Jun 13, 2024 at 03:29:03PM -0700, Aleksei Bavshin wrote:
> # HG changeset patch
> # User Aleksei Bavshin <a.bavshin at nginx.com>
> # Date 1712181327 25200
> #      Wed Apr 03 14:55:27 2024 -0700
> # Node ID 375fa42f1a6010692a8782c4f03c6ad465d3f7f7
> # Parent  8c8d8118c7ac0a0426f48dbfed94e279dddff992
> Upstream: disable re-resolve functionality on Windows.
> 
> Following features are currently not implemented on Windows, making re-resolve
> functionality unsafe to use:
> 
>  * 'noreuse' shared zones that are re-created on each configuration reload.
>    The work scheduling logic is not prepared to handle simultaneous access to
>    the shared zone from multiple generations of the worker processes.

I don't see a problem here.  Could you please elaborate.

>  * 'ngx_worker' identification.
>    It is possible to configure multiple worker processes on Windows, even if
>    only one would actually handle the traffic.  All of the worker processes are
>    currently identified as process 0, breaking scheduling and locking of the
>    resolver tasks.

This can be fixed.  Patch attached.

> diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
> --- a/src/http/ngx_http_upstream.c
> +++ b/src/http/ngx_http_upstream.c
> @@ -6327,7 +6327,7 @@ ngx_http_upstream_server(ngx_conf_t *cf,
>              continue;
>          }
>  
> -#if (NGX_HTTP_UPSTREAM_ZONE)
> +#if (NGX_HTTP_UPSTREAM_ZONE && !(NGX_WIN32))
>          if (ngx_strcmp(value[i].data, "resolve") == 0) {
>              resolve = 1;
>              continue;
> diff --git a/src/stream/ngx_stream_upstream.c b/src/stream/ngx_stream_upstream.c
> --- a/src/stream/ngx_stream_upstream.c
> +++ b/src/stream/ngx_stream_upstream.c
> @@ -545,7 +545,7 @@ ngx_stream_upstream_server(ngx_conf_t *c
>              continue;
>          }
>  
> -#if (NGX_STREAM_UPSTREAM_ZONE)
> +#if (NGX_STREAM_UPSTREAM_ZONE && !(NGX_WIN32))
>          if (ngx_strcmp(value[i].data, "resolve") == 0) {
>              resolve = 1;
>              continue;
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-devel

--
Roman Arutyunyan
-------------- next part --------------
# HG changeset patch
# User Roman Arutyunyan <arut at nginx.com>
# Date 1720529662 -14400
#      Tue Jul 09 16:54:22 2024 +0400
# Node ID 09dfd8c3da0e44dcf75052929e34c76dab3d7781
# Parent  8c8d8118c7ac0a0426f48dbfed94e279dddff992
Win32: support for ngx_worker variable.

In unix the variable holds nginx worker number.  For win32 it was always zero.

diff --git a/src/os/win32/ngx_os.h b/src/os/win32/ngx_os.h
--- a/src/os/win32/ngx_os.h
+++ b/src/os/win32/ngx_os.h
@@ -63,6 +63,7 @@ extern ngx_uint_t   ngx_inherited_nonblo
 extern ngx_uint_t   ngx_tcp_nodelay_and_tcp_nopush;
 extern ngx_uint_t   ngx_win32_version;
 extern char         ngx_unique[];
+extern char         ngx_worker_str[];
 
 
 #endif /* _NGX_OS_H_INCLUDED_ */
diff --git a/src/os/win32/ngx_process_cycle.c b/src/os/win32/ngx_process_cycle.c
--- a/src/os/win32/ngx_process_cycle.c
+++ b/src/os/win32/ngx_process_cycle.c
@@ -375,6 +375,10 @@ ngx_start_worker_processes(ngx_cycle_t *
     ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
 
     for (n = 0; n < ccf->worker_processes; n++) {
+        ngx_sprintf((u_char *) ngx_worker_str, "%i%Z", n);
+
+        SetEnvironmentVariable("ngx_worker", ngx_worker_str);
+
         if (ngx_spawn_process(cycle, "worker", type) == NGX_INVALID_PID) {
             break;
         }
diff --git a/src/os/win32/ngx_win32_init.c b/src/os/win32/ngx_win32_init.c
--- a/src/os/win32/ngx_win32_init.c
+++ b/src/os/win32/ngx_win32_init.c
@@ -18,6 +18,7 @@ ngx_uint_t  ngx_inherited_nonblocking = 
 ngx_uint_t  ngx_tcp_nodelay_and_tcp_nopush;
 
 char        ngx_unique[NGX_INT32_LEN + 1];
+char        ngx_worker_str[NGX_INT32_LEN + 1];
 
 
 ngx_os_io_t ngx_os_io = {
@@ -71,6 +72,7 @@ ngx_os_init(ngx_log_t *log)
     SOCKET        s;
     WSADATA       wsd;
     ngx_err_t     err;
+    ngx_int_t     w;
     ngx_time_t   *tp;
     ngx_uint_t    n;
     SYSTEM_INFO   si;
@@ -260,6 +262,30 @@ nopoll:
     {
         ngx_process = NGX_PROCESS_WORKER;
 
+        bytes = GetEnvironmentVariable("ngx_worker", ngx_worker_str,
+                                       NGX_INT32_LEN + 1);
+
+        if (bytes == 0) {
+            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+                          "GetEnvironmentVariable(\"ngx_worker\") failed");
+            return NGX_ERROR;
+        }
+
+        if (bytes <= NGX_INT32_LEN) {
+            w = ngx_atoi(ngx_worker_str, bytes);
+
+        } else {
+            w = NGX_ERROR;
+        }
+
+        if (w == NGX_ERROR) {
+            ngx_log_error(NGX_LOG_EMERG, log, 0,
+                          "broken environment variable \"ngx_worker\"");
+            return NGX_ERROR;
+        }
+
+        ngx_worker = w;
+
     } else {
         err = ngx_errno;
 


More information about the nginx-devel mailing list