Opened 5 years ago

Closed 5 years ago

Last modified 5 years ago

#341 closed баг (fixed)

R422: разрывы соединений при больших значениях таймаута передачи

Reported by: san Owned by: alx
Priority: средний Milestone: 1 очередь
Component: VE-02 Keywords:
Cc:

Description

При тестировании настройки "Таймаут передачи" модуля R422 обнаружил некоторую странность: Если на блоке VIP установить модуль в режим сервер и настройку "Таймаут передачи" сделать довольно большой, например 5000 мс., то соединение периодически(очень часто) разрывается, без видимой причины.
Если настройку установить в 0 или 10 мс., всё работает при тех же условиях.
Глубже пока не смотрел, описанное воспроизводится в блоке 192.168.0.1
(с противоположной стороны блок 3U 192.168.1.52)

Attachments (1)

dump.pcap (4.4 KB ) - added by san 5 years ago.

Download all attachments as: .zip

Change History (19)

comment:1 by san, 5 years ago

Добавлю ещё, что в эксперименте я передаю в обе стороны поток данных на скорости 800 байт/с.

in reply to:  description comment:2 by alx, 5 years ago

Replying to san:

соединение ... разрывается, без видимой причины.

Это странно, так как (я только что проверил в исходном коде) любой вроде бы переход в состояние Error сопровождается выводом в лог сообщения об ошибке... Может быть у тебя в настройках установлен приоритет журналирования выше чем ERR?

comment:3 by alx, 5 years ago

Приложи, пожалуйста, лог.

comment:4 by san, 5 years ago

Без видимой причины, это до залезания в лог, надеюсь что в логе будет записана причина)
посмотрю его завтра

in reply to:  4 comment:5 by alx, 5 years ago

Replying to san:

Без видимой причины, это до залезания в лог

В таком случае, вывод о наличии бага - преждевременен...

comment:6 by san, 5 years ago

Фрагмент лога со стороны cервера VIP

Mar 13 05:02:02 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error:
Mar 13 05:02:02 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 05:02:02 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...

Фрагмент лога со стороны клиента VE-02

Mar 13 05:20:58 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused
Mar 13 05:20:58 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused

з.ы. На VE-02 часы спешат на 20 минут

Last edited 5 years ago by san (previous) (diff)

comment:7 by san, 5 years ago

Ещё отмечу, что разрыв происходит только после того, как я включаю передачу данных.
Пока данных нет, соединение не разрывается.

in reply to:  6 comment:8 by alx, 5 years ago

Replying to san:

Mar 13 05:02:02 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error:

Хм... Действительно, без видимой причины. :) Текста ошибки нет!

comment:9 by alx, 5 years ago

Resolution: fixed
Status: newclosed

In 1736/sip_ua:

Добавлен пропущенный ранее вывод текста ошибки при ошибке вызова read() в окончании R422. Closes #341.

comment:10 by san, 5 years ago

Ну вообще в этой ситуации мне не нравится что соединение неожиданно для меня "разрывается", хотя "внешних" причин для разрыва нет. то что разорвалось из-за какой то внутренней ошибки я и так догадывался))

in reply to:  10 comment:11 by alx, 5 years ago

Replying to san:

соединение ... "разрывается", хотя "внешних" причин для разрыва нет. то что разорвалось из-за какой то внутренней ошибки я и так догадывался))

Не вижу оснований для таких догадок. Согласно приведенному фрагменту лога, ошибка возникла при попытке читать данные из сокета. Так как текст ошибки в лог не вывелся, мы не знаем, какая именно ошибка произошла, но наиболее вероятной причиной мне кажется получение чего-то из сети, то есть извне. Сами мы по факту этой ошибки соединение не закрываем (что, возможно, неправильно). Чисто теоретически можно предположить возможность ошибки read() по внутренним причинам, если, например, дескриптор сокета "испорчен", и в read() передали мусор вместо дескриптора, или, например, сокет почему-то (по ошибке) закрыли раньше, и вызвали read() для уже закрытого сокета. Оба варианта мне кажутся неправдоподобными, так как каждое закрытие соединения сопровождается соответствующей записью в лог, а причин для "порчи" одной отдельной переменной я тоже не вижу...

В любом случае предлагаю не гадать, а повторить эксперимент с исправленным sip_ua - теперь в логе будет указан конкретный текст ошибки read().

Last edited 5 years ago by alx (previous) (diff)

comment:12 by san, 5 years ago

Повторил

Mar 13 06:38:25 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error: Connection reset by peer
Mar 13 06:38:25 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 06:38:25 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...
Mar 13 06:38:25 comcerto daemon.info sip_ua[437]: r232.cpp:96: module 1: connect from ::ffff:192.168.0.117:39382

in reply to:  12 comment:13 by alx, 5 years ago

Replying to san:

read() error: Connection reset by peer

Ну вот. Как я и предполагал, причина внешняя.

comment:14 by san, 5 years ago

Повторил эксперимент, теперь время на обоих блоках правильное, детализацию лога повысил до INFO

Сервер VIP:

root@comcerto:~# logread -f
Mar 13 06:50:53 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error: Connection reset by peer
Mar 13 06:50:53 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 06:50:53 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...
Mar 13 06:50:53 comcerto daemon.info sip_ua[437]: r232.cpp:96: module 1: connect from ::ffff:192.168.0.117:59714
Mar 13 06:50:54 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error: Connection reset by peer
Mar 13 06:50:54 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 06:50:54 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...
Mar 13 06:50:54 comcerto daemon.info sip_ua[437]: r232.cpp:96: module 1: connect from ::ffff:192.168.0.117:59716

Клиент VE-02

root@comcerto:~# logread -f
Mar 13 06:50:53 comcerto daemon.info sip_ua[448]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 06:50:53 comcerto daemon.info sip_ua[448]: r232.cpp:372: module 1: looking up 192.168.0.1...
Mar 13 06:50:53 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 06:50:53 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused
Mar 13 06:50:53 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 06:50:53 comcerto daemon.err sip_ua[448]: r232.cpp:254: module 1: connected to server
Mar 13 06:50:54 comcerto daemon.info sip_ua[448]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 06:50:54 comcerto daemon.info sip_ua[448]: r232.cpp:372: module 1: looking up 192.168.0.1...
Mar 13 06:50:54 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 06:50:54 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused
Mar 13 06:50:54 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 06:50:54 comcerto daemon.err sip_ua[448]: r232.cpp:254: module 1: connected to server

comment:15 by alx, 5 years ago

Приложи, пожалуйста, еще и вывод tcpdump'а. Хочется посмотреть, что происходит в действительности...

comment:16 by san, 5 years ago

Вот вроде бы похожий тикет в 3G
https://trac.adc-line.ru/MC04-3G/ticket/32

by san, 5 years ago

Attachment: dump.pcap added

comment:17 by san, 5 years ago

Логи последнего эксперимента, чей дамп выше.
Сервер VIP

root@comcerto:~# logread -f
Mar 13 09:22:17 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error: Connection reset by peer
Mar 13 09:22:17 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 09:22:17 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...
Mar 13 09:22:17 comcerto daemon.info sip_ua[437]: r232.cpp:96: module 1: connect from ::ffff:192.168.0.117:43285
Mar 13 09:22:19 comcerto daemon.err sip_ua[437]: r232.cpp:216: module 1: read() error: Connection reset by peer
Mar 13 09:22:19 comcerto daemon.info sip_ua[437]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 09:22:19 comcerto daemon.info sip_ua[437]: r232.cpp:594: module 1: waiting for incoming connection...
Mar 13 09:22:19 comcerto daemon.info sip_ua[437]: r232.cpp:96: module 1: connect from ::ffff:192.168.0.117:43287

клиент VE-02

root@comcerto:~# logread -f
Mar 13 09:22:17 comcerto daemon.info sip_ua[448]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 09:22:17 comcerto daemon.info sip_ua[448]: r232.cpp:372: module 1: looking up 192.168.0.1...
Mar 13 09:22:17 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 09:22:17 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused
Mar 13 09:22:17 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 09:22:17 comcerto daemon.err sip_ua[448]: r232.cpp:254: module 1: connected to server
Mar 13 09:22:19 comcerto daemon.info sip_ua[448]: r232.cpp:204: module 1: connection closed by remote host
Mar 13 09:22:19 comcerto daemon.info sip_ua[448]: r232.cpp:372: module 1: looking up 192.168.0.1...
Mar 13 09:22:19 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 09:22:19 comcerto daemon.err sip_ua[448]: r232.cpp:241: module 1: cannot connect: Connection refused
Mar 13 09:22:19 comcerto daemon.info sip_ua[448]: r232.cpp:428: module 1: connecting to 192.168.0.1 port 12912...
Mar 13 09:22:19 comcerto daemon.err sip_ua[448]: r232.cpp:254: module 1: connected to server

comment:18 by alx, 5 years ago

In 1737/sip_ua:

Исправлена ошибка: если в буфере передачи UART уже записано 511 байт, и больше туда
записать ничего нельзя (511 - максимально возможное число байт в буфере), то выполнялась
попытка чтения из сокета с нулевым значением размера буфера. В этом случае вызов read()
возвращал 0, который затем трактовался как закрытие соединения удаленной стороной.
Теперь при отсутствии места в буфере UART вызов read() не производится. See #341.

Note: See TracTickets for help on using tickets.