Bug 3421

Summary: Meta Trader после обновления стало подвисать соединение с сервером
Product: WINE@Etersoft Reporter: Denis V. Chernosov <denis0.ru>
Component: Сетевые возможности ; TCP/IPAssignee: Александр Морозов <amorozov>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: kondratyuk, lav
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 6988    
Bug Blocks: 42, 1143    
Attachments: Лог terminal.exe во время зависания
Хак, предотвращающий зависание terminal.exe

Description Denis V. Chernosov 2009-02-02 10:57:39 MSK
Проблема точно есть на версиях 1.0.8 и 1.0.9 в сборке для AltLinux. 
mfc42.dll подкладываю от XP SP2. Дистрибутив от компании Телетрейд (http://www.teletrade.ru/files/telesetup_exe.zip)

Точного алгоритма для воспроизведения нет. У меня часто подвисает при первом запуске после установки (возможно оттого, что список символов в окне "обзор рынка" большой). 
Бывают повисалочки после открытия письма с регистрационной информацией (про кодировку я баг уже добавил). 

Повисание выражается в смене значка соединения в правом нижнем углу на сообщение "нет связи" или "неправильный счет". Потом без перезапуска программы восстановить связь не получается. Попытки рестартануть (Файл - Логин) приводят к полному повисанию терминала.

Проблемы стабильно проявляются на десятке машин с альтами на борту.

Сначала грешил на узкий канал, но потом пришли вести с полей, что в другом офисе помог переезд на Убунту (видимо с ванильным вайном). Сам пока не пробовал, но из Сизифа ванильную сборку качнул. Буду посмотреть.

Готов сотрудничать всеми силами, потому что бага очень неприятная!!!
Comment 1 Александр Морозов 2009-02-02 15:21:59 MSK
Установил TeleTRADER 4.00 в бутылке bugs/3421.

У меня при первом запуске всегда логинится нормально. Если попробовать перелогиниться (при щелчке левой кнопкой мыши в правом нижнем углу появляется меню, в котором можно выбрать пункт "Логин"), введя неверный пароль, то выводит "Нет связи". После этого перелогиниться с верным паролем иногда не удаётся, бывает, что программа при этом зависает. Если подождать, то программа может выйти из состояния зависания. После этого подключиться не получается.

Конец лога перед зависанием:
trace:winsock:WS_socket af=2 type=1 protocol=6
trace:winsock:WSASocketA af=2 type=1 protocol=6 protocol_info=(nil) group=0 flags=0x1
trace:winsock:WSASocketW af=2 type=1 protocol=6 protocol_info=(nil) group=0 flags=0x1
trace:winsock:WSASocketW        created 018c
trace:winsock:WS_connect socket 018c, ptr 0x7c527340 { family 2, address 80.94.84.12, port 1950 }, length 16
trace:winsock:WSASendTo socket 018c, wsabuf 0x3210dc, nbufs 1, flags 0, to (nil), tolen 0, ovl (nil), func (nil)
trace:winsock:WSASendTo fd=122, options=0
trace:winsock:WSASendTo after WS2_send
trace:winsock:WSASendTo _is_blocking(s)
trace:winsock:WSASendTo before poll (timeout -1)
Comment 2 Denis V. Chernosov 2009-02-02 15:50:01 MSK
При первом запуске логинится нормально, но на многих машинах где-то после 10 полученных байтов (по счетчику справа снизу) отваливается. И дальше уже никак - повисает намертво. Пошаманил с чистой установкой и настройками вайна - многим помогло.

Но остались повисалочки после открытия письма с регистрационной информацией. После его закрытия тоже бывает повисание соединения.

Если быстро переключиться несколько раз между закладками окна Терминал, то бывает вылетает совсем. Но это уже может и к другому багу относиться...


В общем, плавающий баг. Что от меня требуется для локализации проблемы?
Comment 3 Константин Кондратюк 2009-02-02 16:26:40 MSK
(In reply to comment #2)
> В общем, плавающий баг. Что от меня
> требуется для локализации проблемы?
> 
Видимо, логи падений или способ воспроизведения.
Comment 4 Александр Морозов 2009-02-02 19:50:14 MSK
TeleTRADER зависает, когда пытается подключиться к хосту, к которому подключиться не удаётся. WS_connect выполняет poll с бесконечным таймаутом.

<wine@cellar bottle peoples/amorozov/3421>$ WINEDEBUG=+winsock wwxp terminal.exe 2>&1 | grep connect
trace:winsock:WS_connect socket 0130, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0130, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16
trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 80.94.84.12, port 1950 }, length 16

<wine@cellar bottle peoples/amorozov/3421>$ telnet 80.94.84.12 1950
Trying 80.94.84.12...

<wine@cellar bottle peoples/amorozov/3421>$ telnet 81.177.9.109 443
Trying 81.177.9.109...
Connected to 81.177.9.109.
Escape character is '^]'.
eeee
Connection closed by foreign host.

Реализация WSASendTo в WINE тоже содержит poll, который будет вызван с бесконечным таймаутом, если специально не задана величина таймаута для сокета.

http://msdn.microsoft.com/en-us/library/ms740532(VS.85).aspx
SO_SNDTIMEO
The timeout, in milliseconds, for blocking send calls. The default for this option is zero, which indicates that a send operation will not time out.

Если верить MSDN, то WSASendTo действительно по умолчанию должен ждать бесконечно.
Comment 5 Denis V. Chernosov 2009-02-03 10:02:07 MSK
Ну я приблизительно так и подозревал :)

А что делать?
Comment 6 Александр Морозов 2009-02-03 12:33:04 MSK
> А что делать?

Можно поместить сюда логи WINEDEBUG=+winsock при зависаниях, с комментариями, при каких условиях это получилось. Можно подождать, когда будет исправлена проблема с зависанием при перелогинивании, и протестировать у себя wine с исправлениями.
Comment 7 Александр Морозов 2009-02-03 13:40:34 MSK
В Windows connect при подключении к не отвечающему хосту ждёт не вечно, а около 21 секунды. Если в Wine заменить везде бесконечные таймауты на 20-секундные, то TeleTRADER зависает не навсегда, но всё же вполне заметно. В Windows же ничего подобного добиться не удалось. Скорее всего, проблема не в таймаутах, а где-то в другом месте.
Comment 8 Александр Морозов 2009-02-03 16:05:38 MSK
Created attachment 1046 [details]
Лог terminal.exe во время зависания

terminal.exe висит между строчками
trace:winsock:WSASendTo before poll (timeout -1)
и
trace:winsock:WSASendTo after poll
Comment 9 Александр Морозов 2009-02-04 17:52:56 MSK
terminal.exe создаёт более 20 потоков. Добавил в трейсы функций RegisterClassExW, WIN_CreateWindowEx, WS_connect и WSASendTo вывод идентификатора потока. В получившемся логе присутствуют 3 потока, один из них имеет дело с сокетами, один - с графикой, а ещё один (который на самом деле запущен самым первым) - с тем и другим одновременно. Когда этот поток застревает в poll, интерфейс программы зависает.
Comment 10 Александр Морозов 2009-02-05 15:30:43 MSK
Если не будет найдено лучшего решения, то можно использовать хак, предотвращающий замирание в poll первого потока terminal.exe.
Comment 11 Александр Морозов 2009-02-05 15:32:04 MSK
Created attachment 1047 [details]
Хак, предотвращающий зависание terminal.exe
Comment 12 Александр Морозов 2011-03-15 19:50:21 MSK
Отправил хак в рассылку.
Comment 13 Vitaly Lipatov 2014-09-11 18:41:51 MSK
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.