Странное поведение nginx

Igor Sysoev is at rambler-co.ru
Mon Mar 5 19:07:13 MSK 2007


On Sat, Mar 03, 2007 at 04:26:14PM +0200, Igor Savchenko wrote:

> В общем тут наш главный сисадмин ковырял исходники совместно с дебуг
> логом и в общем похоже в nginx происходит iteger overflow. Вот что он наковырял:
> 
> ######################################################################################################
> Переполнение переменной pc->tries, возможно в функции ngx_http_upstream_get_ip_hash_peer().
> (http/modules/ngx_http_upstream_ip_hash_module.c:189).
> 
> выливается в:
> 
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, try: 1
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get ip hash peer, hash: 1 0002
> 2007/03/03 04:15:41 [debug] 2743#0: *5229 get rr peer, try: 4294967288
> 
> В некоторых случаях в ngx_http_upstream_get_ip_hash_peer() приходил уже переполненный pc->tries.
> 
> Workaround:
> diff -Naur nginx-0.5.14_orig/src/http/modules/ngx_http_upstream_ip_hash_module.c nginx-0.5.14/src/http/modules/ngx_http_upstream_ip_hash_module.c
> 
> --- nginx-0.5.14_orig/src/http/modules/ngx_http_upstream_ip_hash_module.c       Fri Jan 12 14:26:39 2007
> +++ nginx-0.5.14/src/http/modules/ngx_http_upstream_ip_hash_module.c    Sat Mar  3 06:05:28 2007
> @@ -136,6 +136,11 @@
>      ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0,
>                     "get ip hash peer, try: %ui", pc->tries);
>  
> +    if ( pc->tries > 4290000 ) {
> +       pc->tries = 1;
> +    }
> +
> +
>      /* TODO: cached */
>  
>      if (iphp->tries > 20 || iphp->rrp.peers->number == 1) {
> @@ -190,6 +195,10 @@
>          }
>  
>          if (++iphp->tries >= 20) {
> +               if ( pc->tries > 4290000 ) {
> +                       pc->tries = 1;
> +               }
> +
>              return iphp->get_rr_peer(pc, &iphp->rrp);
>          }
>      }
> 
>      
> -- 
> WBR, Nicholas A. Toursky
>    Webta Inc.
> 
> mailto: hinore at webta.net
> ICQ: 95947797
> ################################################################################################################
> 
> Его воркараунд вроде работает. Вот уже больше 2ух часов все окей. Я
> думаю тут нужны коменты Игоря и его нормальный фикс.

Патч прилагается.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/modules/ngx_http_upstream_ip_hash_module.c
===================================================================
--- src/http/modules/ngx_http_upstream_ip_hash_module.c	(revision 447)
+++ src/http/modules/ngx_http_upstream_ip_hash_module.c	(working copy)
@@ -179,11 +179,10 @@
                     peer->fails = 0;
                     break;
                 }
-
-            } else {
-                iphp->rrp.tried[n] |= m;
             }
 
+            iphp->rrp.tried[n] |= m;
+
             /* ngx_unlock_mutex(iphp->rrp.peers->mutex); */
 
             pc->tries--;


More information about the nginx-ru mailing list