Menu

#1552 Провести ревизию кода в директиве FLYLINKDC_USE_SOCKET_COUNTER и обосновать её отключение.

Accepted
nobody
Stability (17)
Medium
Review
2015-01-13
2015-01-05
Anonymous
No

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 сокетов?

Discussion

  • Anonymous

    Anonymous - 2015-01-05

    Originally posted by: Pavel.Pimenov@gmail.com

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

    В коде ждали не сокеты а 5 секунд ( 500 * sleep(19))
    Это связано с тем что краш-коллектор не ловит случаи зависаний,
    а падения ловит хорошо

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

    Status: Accepted

     
  • Anonymous

    Anonymous - 2015-01-06

    Originally posted by: a.rain...@gmail.com

    Ага, понятно тогда, по поводу теории согласен, раз висло тогда вопрос снят. По идее да, сокеты в винде не прибиты к ядру к гвоздями, а стек работает скорее рядом чем в ядре и ресурсы закреплены за приложением, просто стрёмно немножко так делать, вот и написал. Однако стоит, наверно, в дебаге эту фичу оставить ведь счётчик увеличивается в конструкторе, а уменьшается в деструкторе, получается у нас деструктор для сокетов не всегда выполняется, это точно нормально? Ведь такое уже точно может к утечкам памяти приводить, но уже в самой программе.

     
  • Anonymous

    Anonymous - 2015-01-13

    Originally posted by: devils.c...@gmail.com

    Извините, что встреваю. Я перевел "кракозябры" из комментария.

    // TODO - Если слишком долго ждем. спросить диалогом и если ответят "да" - закрыться
    // TODO - случай зависания передать на флай-сервер

     
  • Anonymous

    Anonymous - 2015-01-13

    Originally posted by: Pavel.Pimenov@gmail.com

    Ага спасибо :)

     

    Last edit: Anonymous 2016-12-24

Log in to post a comment.

Monday.com Logo