Gelun, Artem
April 24, 2013 10:48AM
День добрый всем.

Столкнулся с проблемой в работе стороннего модуля
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 , бинарник с
дебагсимволами и исходники, с которых компилировалось.
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

segfault nginx1.3.8 + http-push-stream-module

Gelun, Artem April 24, 2013 10:48AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 239
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready