]> git.kaiwu.me - njs.git/commitdiff
Modules: fix js_periodic worker affinity parsing
authorDmitry Volyntsev <xeioex@nginx.com>
Tue, 15 Sep 2026 22:24:06 +0000 (15:24 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Wed, 16 Sep 2026 21:17:38 +0000 (14:17 -0700)
Previously, worker_affinity parsing reused the directive option index. This
skipped options after worker_affinity in HTTP and stream configurations.

The fix is to use a separate index while parsing the affinity mask.

nginx/ngx_http_js_module.c
nginx/ngx_stream_js_module.c
nginx/t/js_periodic.t
nginx/t/stream_js_periodic.t

index 1766d1a0c718830ff4a8f3293088aaa9cb95594a..0c00ed6530aabd3018e2e6f06948d34f98a2254e 100644 (file)
@@ -9718,7 +9718,7 @@ ngx_http_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     uint8_t             *mask;
     ngx_str_t           *value, s;
     ngx_msec_t           interval, jitter;
-    ngx_uint_t           i;
+    ngx_uint_t           i, j;
     ngx_core_conf_t     *ccf;
     ngx_js_periodic_t   *periodic;
     ngx_js_main_conf_t  *jmcf;
@@ -9810,20 +9810,20 @@ ngx_http_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
                 return NGX_CONF_ERROR;
             }
 
-            for (i = 0; i < s.len; i++) {
-                if (s.data[i] == '0') {
-                    mask[i] = 0;
+            for (j = 0; j < s.len; j++) {
+                if (s.data[j] == '0') {
+                    mask[j] = 0;
                     continue;
                 }
 
-                if (s.data[i] == '1') {
-                    mask[i] = 1;
+                if (s.data[j] == '1') {
+                    mask[j] = 1;
                     continue;
                 }
 
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "invalid character \"%c\" in \"worker_affinity=\"",
-                          s.data[i]);
+                          s.data[j]);
 
                 return NGX_CONF_ERROR;
             }
index e5338500fc74f5b556897938abd510ee033df438..5f4f602148e8ed43e3d8e782400306050b8bfe0b 100644 (file)
@@ -3536,7 +3536,7 @@ ngx_stream_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
     uint8_t             *mask;
     ngx_str_t           *value, s;
     ngx_msec_t           interval, jitter;
-    ngx_uint_t           i;
+    ngx_uint_t           i, j;
     ngx_core_conf_t     *ccf;
     ngx_js_periodic_t   *periodic;
     ngx_js_main_conf_t  *jmcf;
@@ -3628,20 +3628,20 @@ ngx_stream_js_periodic(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
                 return NGX_CONF_ERROR;
             }
 
-            for (i = 0; i < s.len; i++) {
-                if (s.data[i] == '0') {
-                    mask[i] = 0;
+            for (j = 0; j < s.len; j++) {
+                if (s.data[j] == '0') {
+                    mask[j] = 0;
                     continue;
                 }
 
-                if (s.data[i] == '1') {
-                    mask[i] = 1;
+                if (s.data[j] == '1') {
+                    mask[j] = 1;
                     continue;
                 }
 
                 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                           "invalid character \"%c\" in \"worker_affinity=\"",
-                          s.data[i]);
+                          s.data[j]);
 
                 return NGX_CONF_ERROR;
             }
index 7e1345881b90a937fa83910432a0cd74bf7fbbb4..163c6f4a1f53df071c311c42891297aaf2c7ebab 100644 (file)
@@ -56,7 +56,7 @@ http {
         server_name  localhost;
 
         location @periodic {
-            js_periodic test.tick interval=20ms jitter=1ms;
+            js_periodic test.tick worker_affinity=1000 interval=20ms;
             js_periodic test.timer interval=1s worker_affinity=all;
             js_periodic test.overrun interval=30ms;
             js_periodic test.affinity interval=50ms worker_affinity=0101;
index ac64045e61637b53c673c0be11d6eae7e140cc41..87c9aa4cc007ccec5393b334a84175dae6d3d8aa 100644 (file)
@@ -55,7 +55,7 @@ stream {
     server {
         listen       127.0.0.1:8081;
 
-        js_periodic test.tick interval=30ms jitter=1ms;
+        js_periodic test.tick worker_affinity=1000 interval=30ms;
         js_periodic test.timer interval=1s worker_affinity=all;
         js_periodic test.overrun interval=30ms;
         js_periodic test.affinity interval=50ms worker_affinity=0101;