|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
CyberMaxhvladЗачем nowait ? Не надо nowait Так если в wait, то сервер зависает. Я тогда что-то не понял. При работе в FB 2.5 я модификацию метаданных всегда делал в nowait-транзакции. FB при коммите сразу же выдавал сообщение об ошибке, если что-то пошло не так. Здесь же из-за особенностей FB3 пришлось это делать в wait-транзакции и получилось, что в случае lock conflict - зависание. Как тогда правильно?Указывать конечное время ожидания Перечитай 21662490 и 21662579 CyberMaxhvladЧто такое повторный запуск ? В какой тр-ции ? В IBExpert делаю выполнение этого же запроса (DROP TABLE IMP_TABLE) в этой же транзакции после неудачного предыдущего выполнения.Ну так таблица уже помечена как удаляемая (в кеше метаданных текущего коннекта). После роллбека пометка снимется. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 09:21 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Симонов ДенисCyberMax, попробуй провести эти эксперименты в isql, ибо IBExpert иногда наступает сам себе на...+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 09:22 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
CyberMaxМеня этот LC очень смущает. Ведь это означает, что есть какая-то конкурирующая транзакция. И я хочу выяснить, какая.Не обязательно тр-ция. Кеш метаданных удерживает блокировки объектов. Для этого не нужны тр-ции. Счётчик использования объекта метаданных (таблицы, индекса и т.п.) инкрементируется в двух случаях - при препарировании запроса - при выполнении запроса в тр-ции Соответственно декремент происходит при - уничтожении препарированного запроса - завершении тр-ции Итого, блокировку объекта может удерживать не только тр-ция, но и факт существования препарированного запроса (который так или иначе использует объект) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 09:33 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
hvlad]Не обязательно тр-ция. Кеш метаданных удерживает блокировки объектов. Для этого не нужны тр-ции. Счётчик использования объекта метаданных (таблицы, индекса и т.п.) инкрементируется в двух случаях - при препарировании запроса - при выполнении запроса в тр-ции Соответственно декремент происходит при - уничтожении препарированного запроса - завершении тр-ции Итого, блокировку объекта может удерживать не только тр-ция, но и факт существования препарированного запроса (который так или иначе использует объект) Тогда разрешите еще несколько вопросов: 1. Так как используется счетчик, нет возможности узнать, кто конкретно поставил блокировку? 2. В 3.0 кэш метаданных - раздельный. Каким образом увеличивается счетчик блокировок моего коннекта, если объект используется в другом коннекте? 3. Если транзакция завершается без уничтожения препарированного запроса - он уничтожится? 4. Блокировка действует в рамках транзакции. Или может быть такое, что активных транзакций нет, а блокировка - есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:09 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
CyberMax, а ты до этого работал в 2.5 SS? Просто те у кого был CS/SC особенно ничего и не заметили при переходе на 3.0 SS. Привыкли уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:14 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Симонов Дениса ты до этого работал в 2.5 SS? Я во всех версиях работал только с SS. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:19 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
CyberMax1. Так как используется счетчик, нет возможности узнать, кто конкретно поставил блокировку?Явно известно только в каком коннекте она используется. Чтобы узнать точнее, нужно перебрать все запросы в кеше метаданных данного коннекта. CyberMax2. В 3.0 кэш метаданных - раздельный. Каким образом увеличивается счетчик блокировок моего коннекта, если объект используется в другом коннекте?Никаким не увеличивается. CyberMax3. Если транзакция завершается без уничтожения препарированного запроса - он уничтожится?Конечно нет. Запросом владеет тот, кто его создал - пользователь. Системные запросы пока не обсуждаем. CyberMax4. Блокировка действует в рамках транзакции. Или может быть такое, что активных транзакций нет, а блокировка - есть?Блокировка метаданных никак не привязана к области действия тр-ции. Ещё раз. Есть объекты метаданных. Они загружаются в кеш метаданных по мере необходимости. С каждым таким объектом связан existence lock (блокировка существования). При загрузке объекта в кеш и до начала его использования берётся existence lock в shared (SH) режиме. Каждый "пользователь" объекта метаданных инкрементирует счётчик использования объекта. Пока счётчик не нулевой, existence lock не может быть отпущен. Есть два вида таких пользователей - препарированный запрос и активная тр-ция. Для того, чтобы удалить объект, нужно получить existence lock в exclusive (EX) режиме. Чтобы его получить, все кеши должны отпустить свои SH блокировки. Это невозможно, пока соотв. счётчики использования не нулевые. Таким образом, пока есть препарированные запросы, заинтересованные в данном объекте, и пока жива хоть одна тр-ция, в которой выполнялся подобный запрос, получить EX блокировку не удастся. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:41 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
hvlad, ну с транзакциями всё понятно. А вот возник такой вопрос, а можно ли сделать так чтобы при перекомпиляции объекта метаданных, связанные с ним препарированные запросы становились инвалидными и перепрепарировались как только эти запросы потребуются? Я не в смысле ближайшего будущего, а вообще теоретически. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 10:59 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Симонов Дениспопробуй провести эти эксперименты в isql, ибо IBExpert иногда наступает сам себе на... В общем, перезашел в IBExpert и попытался удалить таблицу IMP_TABLE, к которой никто из пользователей не обращался. Не получилось. Начал выгонять пользователей по одному и пытаться удалить таблицу. По итогу всех выгнал, остался один, но таблица все равно не удалялась. Перезашел - и заработало. Тут же удалил соседнюю такую же проблемную таблицу. Вариантов два: 1. IBExpert что-то не освобождает. 2. Firebird что-то не освобождает. Попробую покопать вариант 1, т.к. проверить вариант 2 не знаю как. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:10 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Симонов ДенисА вот возник такой вопрос, а можно ли сделать так чтобы при перекомпиляции объекта метаданных, связанные с ним препарированные запросы становились инвалидными и перепрепарировались как только эти запросы потребуются? Я не в смысле ближайшего будущего, а вообще теоретически.Теоритически - можно всё, что не противоречит теории :) На практике есть много вопросов. Например - Сейчас движок никак не отслеживает связь объект -> запрос в кеше метаданных, только в обратную сторону. Т.е. чтобы найти такие запросы, нужно проверить их все. - Что делать с запросом, который сейчас выполняется ? - Что делать с запросом, который выполнился, но тр-ция ещё не завершена ? Не думаю, что разные результаты выполнения одного запроса в одной тр-ции будут именно тем, что ожидает прикладной программист И т.д. - уверен, что это только верхушка айсберга ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:17 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
hvlad- Что делать с запросом, который сейчас выполняется ? - Что делать с запросом, который выполнился, но тр-ция ещё не завершена ? то же самое что и сейчас. Ругаться. Речь была только о препарированных запросах, которые не активны и транзакции которых завершены. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:29 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Симонов Денис, А сейчас бывают случаи, когда успешно препарированный и успешно выполнявшийся ранее запрос вдруг выдает ошибку, причём не уровня "запрос правильный, но записи такой не найдено", а уровня требующего изменения текста запроса и перепрепарирования? Навскидку мне кажется прикладные клиентские библиотеки и программы едва ли рассчитаны на автоматическое пере-препарирование запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:35 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Вообще, препарирование запроса существует только внутри транзакции, или "препарированность" может быть передана в следующую транзакцию, если сам запрос (текст, BLR) не меняется? В первом случае препарированные запросы имеет смысл сразу чистить, чтобы кэши освободить. Тут недавно как раз темы пробегали, что в FB3 гораздо больше памяти кэши отъедают. Во втором - наоборот, чтобы по возможности избежать более затратной проверки прав доступа. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:38 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Arioch, ты абсолютно не в теме. Писательский зуд ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 11:43 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Arioch, гм. к примеру, открыто 200 коннектов, активно 150 транзакций, при этом существует 500 запросов, из них привязаны к транзакциям штук 20. Остальные 480 - просто prepared, и держатся приложениями. Это реальные данные по одной из систем. В других - по другому. Сервер сам никакие препарированные запросы не держит. И т.д. Так что, надо быть поближе к реалиям. В mon$statements посмотреть, и всё такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 12:14 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
hvladНа практике есть много вопросов. Например - Сейчас движок никак не отслеживает связь объект -> запрос в кеше метаданных, только в обратную сторону. Т.е. чтобы найти такие запросы, нужно проверить их все. Можно пойти другим путём: 1) drop чего-то не удаляет объект физически, а всего лишь запись о нём из системных таблиц. 2) Когда эта удалённая запись становится мусором, сборщик мусора пробует получить лок и, если обломался, оставляет этот мусор в покое до следующего обнаружения. Получил - удаляет объект, ибо на него уже гарантированно никто не ссылается сейчас и не может сослаться в будущем. 3) Способ получения идентификаторов придётся немного переделать чтобы новая таблица не получила ид удалённой, но ещё не вычищенной. hvlad- Что делать с запросом, который сейчас выполняется ? - Что делать с запросом, который выполнился, но тр-ция ещё не завершена ? Не думаю, что разные результаты выполнения одного запроса в одной тр-ции будут именно тем, что ожидает прикладной программист При вышеописанной схеме запросы в незавершившихся транзакциях будут выдавать правильные результаты в соответствии с их уровнем изоляции. Возможен парадокс, когда заранее препарированный (в давно завершившейся транзакции) запрос возвращает данные из таблицы, а новое препарирование обламывается, но нормальный "прикладной программист" в такую ситуацию вряд ли попадёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 13:14 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov1) drop чего-то не удаляет объект физически, а всего лишь запись о нём из системных таблиц. 2) Когда эта удалённая запись становится мусором, сборщик мусора пробует получить лок и, если обломался, оставляет этот мусор в покое до следующего обнаружения. Получил - удаляет объект, ибо на него уже гарантированно никто не ссылается сейчас и не может сослаться в будущем. при таком раскладе, когда RECREATE выдаст ошибку (на фазе CREATE, между прочим) - это еще можно будет понять. Но когда отдельный DROP/COMMIT пройдет, а потом на CREATE "то же имя" получим "object N already exists", при этом в системных таблицах его не видно - вот это будет весело... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 17:59 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
dimitrпри таком раскладе, когда RECREATE выдаст ошибку (на фазе CREATE, между прочим) - это еще можно будет понять. Но когда отдельный DROP/COMMIT пройдет, а потом на CREATE "то же имя" получим "object N already exists", при этом в системных таблицах его не видно - вот это будет весело... Это мы получим если получение идентификатора будет идти в системной транзакции, которая работает в dirty read. А так, вроде бы, уникальное ограничение позволяет две записи с одинаковым значением если одна из них уже удалена. Или нет?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 18:29 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov2) Когда эта удалённая запись становится мусором, сборщик мусора пробует получить локНе нужно сборщик мусора превращать в сферического мета-коня. Это не будет работать. PS казалось бы - при чём тут инвалидация препарированных запросов... PPS ты хочешь приделать версионность к метаданным, это нормально, но зачем скрещивать ужа с ежом - я не понимаю ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 19:16 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
hvladPS казалось бы - при чём тут инвалидация препарированных запросов... Ну, до меня донеслись слухи, что WAIT - панацея и позволяет свободно альтерить любые объекты невзирая на подключенных пользователей. А тут вдруг сюрприз в виде данного топика... hvladPPS ты хочешь приделать версионность к метаданным, это нормально, но зачем скрещивать ужа с ежом - я не понимаю Если у тебя есть лучший план для их реализации, не томи, поделись светлой мыслью. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 20:07 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, сюрпризов пока что не обнаружено. wait тр-ция ведёт себя так, как ей положено. Ну а мои светлые мысли пока что останутся со мною. Их и так есть чем занять. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2018, 22:12 |
|
Зависание FB при удалении таблицы/поля
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovНу, до меня донеслись слухи, что WAIT - панацея и позволяет свободно альтерить любые объекты невзирая на подключенных пользователей. А тут вдруг сюрприз в виде данного топика... в данном топике дропают, а не альтерят... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.09.2018, 13:46 |
|
|
start [/forum/topic.php?fid=40&gotonew=1&tid=1560994]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
136ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 358ms |
total: | 616ms |
0 / 0 |