|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Доброго времени суток! Досталась мне в наследство 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 один и тот же поток для разных коннектов? Это уже совсем странно, но что-то похожее на это я наблюдал в логах этой библиотеки. Возможно ошибаюсь и там просто логи криво написаны - до конца не разобрался. Заранее благодарю за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 09:52 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
VerLeon, насколько я помню в суперсервере и суперклассике для рабочих потоков используется пул потоков. Простаивающее соединение возвращает поток в пул, где он может умереть по тайм-ауту или использоваться другим соединением. Создавать потоки в UDF это искать приключение на пятую точку. Не было оно никогда на это рассчитано. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 10:18 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Я могу полностью объяснить эти эффекты (про классик советую перепроверить, там не так), но не буду. Ибо не надо закладываться на чужое внутреннее поведение, которое может и будет меняться. Нужно раз и навсегда запомнить - поток в сервере и коннект в сервере никак друг с другом не связаны. Никак. Вообще. Никогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 11:21 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Буду думать, чего теперь с этим делать... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 12:17 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
если время поджимает, то только переход на классик. а вообще, конечно, от этого "творчества" надо отказываться. зы: сам когда-то по молодости влетел - обернул MS CryptoAPI в UDF. и никакие TreadVar-ы не спасли... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 12:24 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий, в UDR кстати можно чуть более хитро писать. З.Ы. В 4.0 неплохой набор встроенных криптографических функций добавили. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 12:34 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
17.01.2020 12:34, Симонов Денис пишет: > > в UDR кстати можно чуть более хитро писать. > Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 12:45 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий, не спасибо. Можно не значит нужно ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 12:49 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
VerLeon Спасибо за ответы. Буду думать, чего теперь с этим делать... Привет. Это от кого такое наследство? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 17:42 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 18:14 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
17.01.2020 18:14, Василий 2 пишет: > > Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере. > закат солнца вручную (С) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 18:18 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий, Если закатывается, то что в этом плохого? про FREE_IT и как оно реализовано помним? тоже закат солнца вручную ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 19:31 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Arioch про FREE_IT и как оно реализовано помним? напомни, пожалуйста, что там ужасного. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.01.2020, 20:36 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Gallemar VerLeon Спасибо за ответы. Буду думать, чего теперь с этим делать... Привет. Это от кого такое наследство? Привет! В SM это и уже хз кто так написал. Но самое удивительное, что оно работает, видимо потому что всегда это быстро проходит без простоев, потому и проскакивает все в одном потоке. Все отчеты так работают в SM - работа со списками практически во всех есть. Но там вся работа в рамках одного запроса (хранимки) - создали, наполнили, отработали, убили. Я бы этого даже не заметил, но сейчас переделываю их под linux, и вот с этим сборщиком мусора трахаюсь, так как в linux нет DllEntry и не понятно, когда чистить эти threadvars, если их принудительно не почистили ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 08:00 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2 Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере. Оно почти так и сделано - есть функции создания, всяких там манипуляций и удаления, но только через threadvars, а они в каждом потоке свои. Теперь по-хорошему надо свой пул писать и самому им управлять, а не на потоки ориентироваться. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 08:08 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2, Arioch, не надо писать заведомо не безопасный код. Василий 2Можно возвращать/принимать в UDF функциях указатель на выделенные данные, и добавить функцию удаления. Т.е. контролировать удаление из кода на сервере. а что если между функцией создания указателя на внутренний объект и функцией удаления произошла ошибка? Ошибка не в коде UDF, а просто тупо сработало какое-то ограничение целостности, ваш указатель окажется висячим и произойдёт утечка памяти. Конечно можно подстелить соломку с обработкой исключений, но в PSQL с обработкой ошибок не всё так просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 09:37 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
VerLeon, тебе уже сказали забудь про потоки. Нет явной связи между потоками и подключениями. По крайней мере в SuperServer и SuperClassic ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 09:39 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий закат солнца вручную (С) А шо ви таки имеете сказать против? Симонов Денис а что если между функцией создания указателя на внутренний объект и функцией удаления произошла ошибка? Ошибка не в коде UDF, а просто тупо сработало какое-то ограничение целостности, ваш указатель окажется висячим и произойдёт утечка памяти. Конечно можно подстелить соломку с обработкой исключений, но в PSQL с обработкой ошибок не всё так просто. Ну тут собственно если уж очень надо - придется либо делать when any do, либо смириться с вероятностью утечки. Хотя тоже решаемо, например, можно запоминать указатель в контекстных переменных или временной таблице и удалять в триггере on disconnect. Либо еще вариант - просто учитывать, что будет по одному выделенному объекту на поток. Если один коннект не может быть передан от одного потока к другому (тут я не уверен, но это было бы довольно странно), то можно принять за постулат, что коннект всегда живет в рамках одного потока. Соответственно тогда перед созданием объекта надо удалить его предыдущее значение (возможно, оставшееся от предыдущего коннекта), ну и в DLLMain по DLL_THREAD_DETACH тоже его удалять. Вариант с FREE_IT тоже есть, и в некоторых случаях он выглядит намного лучше, но только если требуемые переменные можно выделить одним куском. Если это объект или структура с динамическими полями - то облом. Также неприменимо, если данные нужно передавать за границу функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 10:24 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2, фигня это всё. Ибо есть delete from mon$attachments которая 100% приведёт к утечке. И не when any do, ни disconnect уже не сработают. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 10:27 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Симонов Денислибо смириться с вероятностью утечки. в SuperServer ну, ну... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 10:40 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Симонов Денис Василий 2, фигня это всё. Ибо есть delete from mon$attachments которая 100% приведёт к утечке. И не when any do, ни disconnect уже не сработают. А если проткнуть хард иголкой, то есть вероятность получить битую базу. Сдуру можно и известно какой орган сломать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 10:56 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
"delete from mon$attacments" - вполне штатный способ отключения клиентов. Это вам не молотком по серверу стучать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 11:05 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Если действовать по схеме "один объект на поток", то ничего не утечет даже при таком прибитии коннектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:35 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
чукчо не читатель. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:38 |
|
|
start [/forum/topic.php?fid=40&msg=39915200&tid=1560464]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
168ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 280ms |
total: | 540ms |
0 / 0 |