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