segfault nginx1.3.8 + http-push-stream-module
Gelun, Artem
a at gelun.ru
Wed Apr 24 14:46:23 UTC 2013
День добрый всем.
Столкнулся с проблемой в работе стороннего модуля
nginx-http-push-stream-module. Периодически nginx сегфолтится (при том
периоды, судя по всему, зависят от аптайма процесса и нагрузки на модуль)
Вопроса два:
1) сталкивался ли кто?
2) определить где именно проблема.
При поптыке разобрать причины падения возник вопрос по реализации rbtree.
Сразу скажу, что я не большой спец в алгоритмах и прошу палками не бить ))
Смысл вот в чём. nginx падает с таким бектрейсом:
(gdb) bt
#0 0x000000000040f6bc in ngx_rbtree_delete (tree=0x7f56ba655000,
node=<value optimized out>) at src/core/ngx_rbtree.c:300
#1 0x000000000047bb3f in
ngx_http_push_stream_collect_expired_messages_and_empty_channels
(data=0x7f56ba655000, shpool=0x7f56ba4d7000,
force=<value optimized out>) at
/usr/src/redhat/SOURCES/nginx/nginx-push-stream-module/src/ngx_http_push_stream_module_utils.c:733
#2 0x000000000047bc34 in ngx_http_push_stream_memory_cleanup (ev=<value
optimized out>)
at
/usr/src/redhat/SOURCES/nginx/nginx-push-stream-module/src/ngx_http_push_stream_module_utils.c:810
#3 ngx_http_push_stream_memory_cleanup_timer_wake_handler (ev=<value
optimized out>)
at
/usr/src/redhat/SOURCES/nginx/nginx-push-stream-module/src/ngx_http_push_stream_module_utils.c:980
#4 0x000000000041cb8c in ngx_event_expire_timers () at
src/event/ngx_event_timer.c:149
#5 0x000000000041c97f in ngx_process_events_and_timers (cycle=0xeeb330) at
src/event/ngx_event.c:263
#6 0x0000000000422b58 in ngx_worker_process_cycle (cycle=0xeeb330,
data=<value optimized out>) at src/os/unix/ngx_process_cycle.c:810
#7 0x0000000000421147 in ngx_spawn_process (cycle=0xeeb330, proc=0x422a90
<ngx_worker_process_cycle>, data=0x0, name=0x47ffb9 "worker process",
respawn=-4) at src/os/unix/ngx_process.c:198
#8 0x0000000000422112 in ngx_start_worker_processes (cycle=0xeeb330, n=4,
type=-4) at src/os/unix/ngx_process_cycle.c:365
#9 0x000000000042331d in ngx_master_process_cycle (cycle=0xeeb330) at
src/os/unix/ngx_process_cycle.c:250
#10 0x000000000040787b in main (argc=<value optimized out>, argv=<value
optimized out>) at src/core/nginx.c:412
(gdb) list
295 ngx_rbt_red(temp->parent);
296 ngx_rbtree_right_rotate(root, sentinel, temp->parent);
297 w = temp->parent->left;
298 }
299
300 if (ngx_rbt_is_black(w->left) && ngx_rbt_is_black(w->right))
{
301 ngx_rbt_red(w);
302 temp = temp->parent;
303
304 } else {
В строке 300 ngx_rbt_is_black - в него нельзя передать "0":
#define ngx_rbt_is_red(node) ((node)->color)
#define ngx_rbt_is_black(node) (!ngx_rbt_is_red(node))
При этом,
(gdb) p *w
$1 = {key = 0, left = 0x0, right = 0x0, parent = 0x7f56bb2aa200, color = 0
'\000', data = 0 '\000'}
(gdb) p *sentinel
$5 = {key = 0, left = 0x0, right = 0x0, parent = 0x7f56bb2aa200, color = 0
'\000', data = 0 '\000'}
*(gdb) p w==sentinel*
*$27 = 1*
Помогите разобраться, это особенность реализации rbtree в nginx'е и ошибка
в модуле (где-то как-то неправильно заполняют структуру?) или же это
недочёт реализации и проблема в самом nginx'е? ))
Заранее спасибо.
Артём.
P.S. Могу, при необходимости, выложить куда-то coredump , бинарник с
дебагсимволами и исходники, с которых компилировалось.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20130424/225f3cee/attachment.html>
Подробная информация о списке рассылки nginx-ru