powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF: когда сервер завершает потоки?
25 сообщений из 36, страница 1 из 2
UDF: когда сервер завершает потоки?
    #39915200
VerLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Досталась мне в наследство UDF, написанная на free pascal с поддержкой потоков и потоковых переменных (threadvar).
Реализовано примерно так, как описано тут: https://www.ibphoenix.com/resources/documents/how_to/doc_307 (в секции Thread-level initialization and finalization).

И обнаружил странную для меня вещь - после использования какой-нибудь функции из этой библиотеки при закрытии коннекта (в архитектуре supeserver) процедура DllEntry не вызывается с reason = DLL_THREAD_DETACH.
Но при этом она вызывается именно с такой причиной самопроизвольно спустя примерно минуту-полторы после того как заканчивается активность в этом коннекте (хотя еще даже транзакция, в которой был вызов UDF не закоммичена).
Ясень пень, что это делает сервер FB (кому ж еще?)
Пробовал на FB 2.5., FB 3.0.2, на классике и суперсервере (все - под Windows) - поведение одинаковое

В связи с этим вопрос - потоки в UDF когда порождаются и убиваются сервером?

Вопрос интересен и в теории, но и на практике тоже.
В этой библиотеке отдельными функциями создаются в памяти объекты (как threadvar), отдельными функциями как-то обрабатываются и уничтожаются.
Полагаю, что её создатели считали, что в суперсервере будет в dll по одному потоку на коннект, но это очевидно не так.
Пока активность в коннекте непрерывна, то все хорошо (потому видимо и работало и никто этого не замечал). Но если создать объект, что-то поделать на клиенте больше пары минут без участия сервера и обратиться к этому объекту снова - то его уже не будет, так как поток, в котором он создавался уже завершен сервером, а новое обращение будет уже в новом потоке.

Не исключаю, что несу бред, но другого объяснения тому, что я наблюдаю, я не нахожу...

Еще вопрос в догонку - может ли в суперсервере быть для UDF один и тот же поток для разных коннектов? Это уже совсем странно, но что-то похожее на это я наблюдал в логах этой библиотеки. Возможно ошибаюсь и там просто логи криво написаны - до конца не разобрался.

Заранее благодарю за помощь!
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915227
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VerLeon,

насколько я помню в суперсервере и суперклассике для рабочих потоков используется пул потоков. Простаивающее соединение возвращает поток в пул, где он может умереть по тайм-ауту или использоваться другим соединением.

Создавать потоки в UDF это искать приключение на пятую точку. Не было оно никогда на это рассчитано.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915302
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я могу полностью объяснить эти эффекты (про классик советую перепроверить, там не так), но не буду.
Ибо не надо закладываться на чужое внутреннее поведение, которое может и будет меняться.
Нужно раз и навсегда запомнить - поток в сервере и коннект в сервере никак друг с другом не связаны.
Никак. Вообще. Никогда.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915352
VerLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.
Буду думать, чего теперь с этим делать...
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915362
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если время поджимает, то только переход на классик.
а вообще, конечно, от этого "творчества" надо отказываться.

зы: сам когда-то по молодости влетел - обернул MS CryptoAPI в UDF.
и никакие TreadVar-ы не спасли...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915370
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

в UDR кстати можно чуть более хитро писать.

З.Ы. В 4.0 неплохой набор встроенных криптографических функций добавили.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915382
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.01.2020 12:34, Симонов Денис пишет:
>
> в UDR кстати можно чуть более хитро писать.
>


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915387
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

не спасибо. Можно не значит нужно
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915595
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VerLeon
Спасибо за ответы.
Буду думать, чего теперь с этим делать...

Привет. Это от кого такое наследство?
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915615
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915619
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17.01.2020 18:14, Василий 2 пишет:
>
> Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере.
>

закат солнца вручную (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915645
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Если закатывается, то что в этом плохого? про FREE_IT и как оно реализовано помним? тоже закат солнца вручную
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39915678
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch про FREE_IT и как оно реализовано помним?
напомни, пожалуйста, что там ужасного.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916185
VerLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gallemar
VerLeon
Спасибо за ответы.
Буду думать, чего теперь с этим делать...

Привет. Это от кого такое наследство?


Привет! В SM это и уже хз кто так написал. Но самое удивительное, что оно работает, видимо потому что всегда это быстро проходит без простоев, потому и проскакивает все в одном потоке.
Все отчеты так работают в SM - работа со списками практически во всех есть. Но там вся работа в рамках одного запроса (хранимки) - создали, наполнили, отработали, убили.

Я бы этого даже не заметил, но сейчас переделываю их под linux, и вот с этим сборщиком мусора трахаюсь, так как в linux нет DllEntry и не понятно, когда чистить эти threadvars, если их принудительно не почистили
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916186
VerLeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий 2
Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере.


Оно почти так и сделано - есть функции создания, всяких там манипуляций и удаления, но только через threadvars, а они в каждом потоке свои. Теперь по-хорошему надо свой пул писать и самому им управлять, а не на потоки ориентироваться.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916209
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2, Arioch,

не надо писать заведомо не безопасный код.

Василий 2Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере.

а что если между функцией создания указателя на внутренний объект и функцией удаления произошла ошибка? Ошибка не в коде UDF, а просто тупо сработало какое-то ограничение целостности, ваш указатель окажется висячим и произойдёт утечка памяти. Конечно можно подстелить соломку с обработкой исключений, но в PSQL с обработкой ошибок не всё так просто.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916210
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VerLeon,

тебе уже сказали забудь про потоки. Нет явной связи между потоками и подключениями. По крайней мере в SuperServer и SuperClassic
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916229
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий

закат солнца вручную (С)

А шо ви таки имеете сказать против?

Симонов Денис
а что если между функцией создания указателя на внутренний объект и функцией удаления произошла ошибка? Ошибка не в коде UDF, а просто тупо сработало какое-то ограничение целостности, ваш указатель окажется висячим и произойдёт утечка памяти. Конечно можно подстелить соломку с обработкой исключений, но в PSQL с обработкой ошибок не всё так просто.

Ну тут собственно если уж очень надо - придется либо делать when any do, либо смириться с вероятностью утечки. Хотя тоже решаемо, например, можно запоминать указатель в контекстных переменных или временной таблице и удалять в триггере on disconnect. Либо еще вариант - просто учитывать, что будет по одному выделенному объекту на поток. Если один коннект не может быть передан от одного потока к другому (тут я не уверен, но это было бы довольно странно), то можно принять за постулат, что коннект всегда живет в рамках одного потока. Соответственно тогда перед созданием объекта надо удалить его предыдущее значение (возможно, оставшееся от предыдущего коннекта), ну и в DLLMain по DLL_THREAD_DETACH тоже его удалять.

Вариант с FREE_IT тоже есть, и в некоторых случаях он выглядит намного лучше, но только если требуемые переменные можно выделить одним куском. Если это объект или структура с динамическими полями - то облом. Также неприменимо, если данные нужно передавать за границу функции.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916234
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,

фигня это всё. Ибо есть delete from mon$attachments которая 100% приведёт к утечке. И не when any do, ни disconnect уже не сработают.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916244
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денислибо смириться с вероятностью утечки.

в SuperServer ну, ну...
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916252
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
Василий 2,

фигня это всё. Ибо есть delete from mon$attachments которая 100% приведёт к утечке. И не when any do, ни disconnect уже не сработают.

А если проткнуть хард иголкой, то есть вероятность получить битую базу.
Сдуру можно и известно какой орган сломать.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916255
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"delete from mon$attacments" - вполне штатный способ отключения клиентов.
Это вам не молотком по серверу стучать.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916323
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если действовать по схеме "один объект на поток", то ничего не утечет даже при таком прибитии коннектов.
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916324
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чукчо не читатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UDF: когда сервер завершает потоки?
    #39916329
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,

как ты отличишь тот же это поток или нет? Это может сработать только в архитектуре Classic.
Тут Влад уже сказал количество коннектов никак не связано с количеством потоков.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / UDF: когда сервер завершает потоки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]