Странное поведение 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