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