Originally created by: a.rain...@gmail.com
В коммите [r17994] провели довольно опасное изменение, вероятно, в целях ускорения завершения работы.
Суть беспокойства: Добавление директивы FLYLINKDC_USE_SOCKET_COUNTER потенциально очень опасно ибо отключение ожидания завершения работы сокетов при завершении работы софтины:
отключение вызова
BufferedSocket::waitShutdown();
в глобальной функции
void shutdown(GUIINITPROC pGuiInitProc, void *pGuiParam, bool p_exp /*= false*/)
может привести к куче непредсказуемых последствий начиная от странных и необъяснимых падений программы в процессе закрытия во многих местах, т.е. в любом месте, где ведётся работа с сокетами, и заканчивая утечкой системных ресурсов, что ещё хуже и может привести к отвалу возможности установить соединения на машине и (или) значимой утечке памяти в сетевом стеке ОС.
Волнуюсь поскольку в логе указано совсем другой смысл этого изменения:
* Выкинул фичу подсчета соединений FLYLINKDC_USE_SOCKET_COUNTER
Сама функция тоже стрёмная:
void BufferedSocket::waitShutdown()
{
int l_max_count = 500;
while (g_sockets > 0 && --l_max_count)
{
sleep(10); // TODO - Åñëè ñëèøêîì äîëãî æäåì. ñïðîñèòü äèàëîãîì è åñëè îòâåòÿò "äà" - çàêðûòüñÿ
// TODO - ñëó÷àé çàâèñàíèÿ ïåðåäàòü íà ôëàé-ñåðâåð.
}
}
Кто может рассказать почему этот механизм решили выпилить и откуда взялось магическое правило, что ждать надо только первые 500 сокетов?
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: Pavel.Pimenov@gmail.com
Несколько раз слали дампы где флай висел вечно в том месте.
вероятно рассинхронизировался этот глобальный счетчик где-то
В коде ждали не сокеты а 5 секунд ( 500 * sleep(19))
Это связано с тем что краш-коллектор не ловит случаи зависаний,
а падения ловит хорошо
про утечку соединений на уровне OC подробнее.
если приложение завершается - умирают и все его сокеты автоматом
это не красиво, но зато не приводит к зависанию у клиента.
Но и глобальный счетчик - тоже не красиво и теоретически все должно работать без него
поэтому я его и выкинул.
Status: Accepted
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: a.rain...@gmail.com
Ага, понятно тогда, по поводу теории согласен, раз висло тогда вопрос снят. По идее да, сокеты в винде не прибиты к ядру к гвоздями, а стек работает скорее рядом чем в ядре и ресурсы закреплены за приложением, просто стрёмно немножко так делать, вот и написал. Однако стоит, наверно, в дебаге эту фичу оставить ведь счётчик увеличивается в конструкторе, а уменьшается в деструкторе, получается у нас деструктор для сокетов не всегда выполняется, это точно нормально? Ведь такое уже точно может к утечкам памяти приводить, но уже в самой программе.
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: devils.c...@gmail.com
Извините, что встреваю. Я перевел "кракозябры" из комментария.
// TODO - Если слишком долго ждем. спросить диалогом и если ответят "да" - закрыться
// TODO - случай зависания передать на флай-сервер
View and moderate all "tickets Discussion" comments posted by this user
Mark all as spam, and block user from posting to "Tickets"
Originally posted by: Pavel.Pimenov@gmail.com
Ага спасибо :)
Last edit: Anonymous 2016-12-24