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