|
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 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2, как ты отличишь тот же это поток или нет? Это может сработать только в архитектуре Classic. Тут Влад уже сказал количество коннектов никак не связано с количеством потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:40 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Симонов Денис, а я никогда не спорю с "молодыми дарованиями"... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:43 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий, тут цель чтобы кто-то другой его советы за истину не принял ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:49 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2Если один коннект не может быть передан от одного потока к другому (тут я не уверен, но это было бы довольно странно), то можно принять за постулат, что коннект всегда живет в рамках одного потока. насчет постулатов - вы, видимо, невнимательно читали исходное сообщение этого топика, а также сообщение 22061422 . ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 13:57 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Симонов Денис Василий 2, как ты отличишь тот же это поток или нет? Это может сработать только в архитектуре Classic. Тут Влад уже сказал количество коннектов никак не связано с количеством потоков. Идея была в использовании DLL_THREAD_DETACH. Разумеется, такая схема будет работать только в том случае, если активный коннект не передается между потоками . Судя по всему , данное предположение было неверно, и стало быть, со стороны UDF тут мало что можно сделать. kdv Василий 2Если один коннект не может быть передан от одного потока к другому (тут я не уверен, но это было бы довольно странно), то можно принять за постулат, что коннект всегда живет в рамках одного потока. насчет постулатов - вы, видимо, невнимательно читали исходное сообщение этого топика, а также сообщение 22061422 . Что ж, если перечитать то сообщение примерно раз десять и помедитировать над ним в течение часа, то в самом деле можно догадаться о его скрытом смысле. Каюсь, не уделил ему причитающегося внимания. Смиренно благодарю за верное целеуказание, в отличие от некоторых. @МП в твоем случае говорить это, конечно, почти бессмысленно, но чуть меньше бронзовения и чуть больше конструктива было бы намного полезней Кстати, по поводу delete from mon$attachments. Во-первых, неплохо бы в доке четко прописать, что при таком убиении никакие триггеры не отработают. Потому что это вовсе не очевидно, причем не только мне, но и Таблоиду . Во-вторых, как-то в принципе удивительно, что экстренный механизм паники hvlad Указание от ДБА убить коннект - это форсмажор с точки зрения сервера. Форсмажор диктует немедленное прекращение всякой активности в данном коннекте. Есс-но, никакие триггеры и роллбеки тут вызываться не будут. применяется как "штатный способ отключения клиентов" ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 14:59 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2Во-первых, неплохо бы в доке четко прописать, что при таком убиении никакие триггеры не отработают. был уверен что про триггеры ON DISCONNECT, ON ROLLBACK там написано... Ну же сегодня добавлю замечание ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 15:06 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
20.01.2020 14:59, Василий 2 пишет: > МП в твоем случае говорить это, конечно, почти бессмысленно, но чуть меньше бронзовения и чуть больше конструктива было бы намного полезней Вася, если у тебя есть фонтан, заткни его - дай отдохнуть фонтану. (С) - Козьма Прутков Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 15:08 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2, если читать сообщения в топике последовательно, то первое же моё сообщение 22061336 явно намекало, что на этой схеме можно поставить крест. Следующим сообщением Влад подтвердил сказанное мной. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 15:15 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2 если перечитать то сообщение примерно раз десять и помедитировать над ним в течение часа Василий 2 можно догадаться о его скрытом смысле hvlad Нужно раз и навсегда запомнить - поток в сервере и коннект в сервере никак друг с другом не связаны. Никак. Вообще. Никогда. И если ещё немного помедитировать, то и это Василий 2 как-то в принципе удивительно ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 15:17 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Мимопроходящий Вася, если у тебя есть фонтан, заткни его - дай отдохнуть фонтану. (С) - Козьма Прутков Я и смотрю, ты давным-давно заткнул, а разоткнуть уже не получается Симонов Денис Василий 2, если читать сообщения в топике последовательно, то первое же моё сообщение 22061336 явно намекало, что на этой схеме можно поставить крест. Следующим сообщением Влад подтвердил сказанное мной. Оно намекало с долей неуверенности, к тому же лишь одно слово переводило используемую схему пула потоков из стандартной "занял поток-отработал-закрылся-вернул поток" в более сложную. Не так уж трудно было его не заметить hvlad Скрытом ? А как же ещё более открыто написать: Ну, например, чуть больше деталей, вроде того, что соединение при простое может "отдавать поток" в пул и забирать уже другой. Наверно, я автоматически воспринял тот пост в стиле "так делать не надо потому что не надо" :D есть у здешних экспертов (в прямом смысле, без сарказма!) такой грешок по отношению к всяческим трюкам определенной степени пер-ректальности ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 17:51 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
Василий 2, не хотел писать, но придется. Еще раз обращаю внимание - исходном сообщении топика автор КОНСТАТИРОВАЛ, что DLL_THREAD_DETACH при закрытии коннекта не вызывается, а вызывается "как-то потом". А вы начали фантазировать про привязку тредов к коннектам. Я не очень понимаю, зачем если уже ясно, что нечто работает "не так", пытаться сочинять какие-то абстрактные схемы. Тут оно всё равно "так" работать не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2020, 18:35 |
|
UDF: когда сервер завершает потоки?
|
|||
---|---|---|---|
#18+
kdv Василий 2, не хотел писать, но придется. Еще раз обращаю внимание - исходном сообщении топика автор КОНСТАТИРОВАЛ, что DLL_THREAD_DETACH при закрытии коннекта не вызывается, а вызывается "как-то потом". А вы начали фантазировать про привязку тредов к коннектам. Я не очень понимаю, зачем если уже ясно, что нечто работает "не так", пытаться сочинять какие-то абстрактные схемы. Тут оно всё равно "так" работать не будет. В исходном сообщении было одно "не так", у меня же было другое "не так". В любом случае, все прояснилось и смысла заново все мусолить нет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2020, 11:22 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1560464]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 176ms |
0 / 0 |