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

Igor Savchenko dicsydel at gmail.com
Sat Mar 3 17:26:14 MSK 2007


В общем тут наш главный сисадмин ковырял исходники совместно с дебуг
логом и в общем похоже в 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ух часов все окей. Я
думаю тут нужны коменты Игоря и его нормальный фикс.



---------------------------------
Igor V. Savchenko

http://webta.net

mailto: igor at webta.net
ICQ: 86915046






More information about the nginx-ru mailing list