ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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@xxxxxxxxx
> ICQ: 95947797
> ################################################################################################################
> 
> Его воркараунд вроде работает. Вот уже больше 2ух часов все окей. Я
> думаю тут нужны коменты Игоря и его нормальный фикс.

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


-- 
Игорь Сысоев
http://sysoev.ru
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--;


 




Copyright © Lexa Software, 1996-2009.