powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
25 сообщений из 55, страница 1 из 3
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39847631
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть один запрос, вроде бы примитивный, который отрабатывает успешно в IBExpert (FIB+) и падает c Invalid BLOB ID в аппликухе (Delphi XE2 / dbExpress).

Первая библиотека коммерческая, вторая и вовсе без исходников.
Попытался задействовать Trace - https://sourceforge.net/projects/fbprofiler
К сожалению, показывает только начало и окончание выполнения запроса.
README.tracе_services из FB 2.5.9 тоже вроде показывает только это.

Пока версия, что FIB+ вычитывает все блобы непосредственно после каждой строки, а dbExpress сначала вычитывает сколько-то строк (типа, на целый экран таблицы, хотя там никакой визуальщины в этом месте нет), а потом уже пытается вычитать все блобы за послние n строк - а они уже перестали существовать.

Получить извне программ и библиотек (у dbx нет исходников в принципе) последовательности вычитывания rows и blobs на FB25 возможно?
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39847632
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трассировки операций с блобами нет, увы.

Invalid blob id может быть в результате чтения временного блоба после завершения тр-ции, в которой он был создан (т.е. баг в приложении), или
(нужно уметь на это наступить) из-за сборки мусора, если блоб читается в read committed тр-ции.
Во втором случае уровень изоляции snapshot должен помочь.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39847645
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет вообще, или нет в FB2 ? Вроде ещё в 2012 собирались - 13036447

Нет, там не то что транзакция, там даже statement ещё не завершился!
В том и прикол, что в IBE все было оттестировано, а аппликуха посыпалась.

Прям хоть каким-нибудь WireShark'ом смотреть и учить wire protocol......

P.S. БД, если что, прошла B&R. Перезапуск FB service и т.д.

Проверялись варианты
FB 2.1.7 win32: backup & restore & application

FB 2.1.7 win32: backup & restore; FB 2.5.9 Win64 application

FB 2.1.7 win32: backup FB 2.5.9 Win64 restore & application

----

Любопытное в трейсе для DBX, окончания выполнения выглядит как exec-stmt-finish -> commit -> close cursor -> free-stmt
Я как-то думал, что курсоры живут внутри транзакций и закрываться должны перед закрытием транзакции, но DBX думает иначе... Надеюсь, серверу от этого не хуже.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39847666
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНет вообще, или нет в FB2 ? Вроде ещё в 2012 собирались - 13036447 Кто собирался ? Кто вообще об этом с тех пор вспоминал ? Кому оно было реально нужно всё это время ?

AriochНет, там не то что транзакция, там даже statement ещё не завершился!
В том и прикол, что в IBE все было оттестировано, а аппликуха посыпалась.Тогда пробуй поднять уровень изоляции тр-ции.
Или заблокировать сборку мусора на время операции.

AriochПроверялись варианты...Т.е. оно легко воспроизводится ?
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848051
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, а такие функции, как COALESCE и NULLIF - это тоже просто другая форма CASE или как-то иначе?

hvladТ.е. оно легко воспроизводится ?

Как оказалось, да.

http://tracker.firebirdsql.org/browse/CORE-6119

hvladКто собирался ? Кто вообще об этом с тех пор вспоминал ?

мониторинг запросов извне программ? да регулярно вспоминался. В том числе обсуждались подменные fbclient.dll с логированием запросов - и жаль, что таких нет в составе FB, вам казалось бы проще всего такую сделать спец-сборку...

Ты ещё учти, что вам хоть напоминай - хоть нет.
Если вам это sexy, ну типа убить Оракл и завоевать мир Большого Железа - то вы будете это делать.
Нет - нет.
http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&reporterSelect=specificuser&reporter=arioch
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848081
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochЕсли вам это sexy, ну типа убить Оракл и завоевать мир Большого Железа - то вы будете это делать.
Нет - нет.
http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&reporterSelect=specificuser&reporter=arioch Не смеши!
Тут "секси" не печь очевидно выгодные плюшки, а выпекать стандартные кирпичи из ржаной муки в соответствии со стандартом, сочинённым флагманами отрасли.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848082
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochhvladКто собирался ? Кто вообще об этом с тех пор вспоминал ?

мониторинг запросов извне программ? да регулярно вспоминался.Нет. Мониторинг блобов.
Мониторинг запросов уже лет 10 как есть.

AriochТы ещё учти, что вам хоть напоминай - хоть нет.Тебе хоть объясняй, хоть нет...

PS Ты много репортов про IBX\DBX\Delphi\еtс создал ?
Много тебе сделали ?
Часто напоминал ?
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848084
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev, Arioch,

вот и встретились, вот и поговорите :)

ЗЫ не здесь, умоляю
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848085
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, не о чем говорить. Всё и так очевидно.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848102
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

для начала попробуй poFetchBlobOnDemand

AriochКстати, а такие функции, как COALESCE и NULLIF - это тоже просто другая форма CASE или как-то иначе?

это что какое открытие? И вообще каким боком это относится к твоему топику


AriochЕсли вам это sexy, ну типа убить Оракл и завоевать мир Большого Железа - то вы будете это делать.
Нет - нет.
http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&reporterSelect=specificuser&reporter=arioch

и тут Остапа понесло...
Дружище ни о каком бодании с Оракулом речи не идёт. Вот есть MySql, есть PostgreSql вот с ними по разумным фичам тягаться можно и нужно
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848157
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В трекере ответил.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848171
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochЛюбопытное в трейсе для DBX, окончания выполнения выглядит как exec-stmt-finish -> commit -> close cursor -> free-stmt
Я как-то думал, что курсоры живут внутри транзакций и закрываться должны перед закрытием транзакции, но DBX думает иначе... Надеюсь, серверу от этого не хуже.

ну дык ты же сам эти действия не делаешь. Вот и получается, что в процессе вызова commit закрываются все курсоры и освобождаются статменты. Их трейс показывает действия самого DBX, а не сервера.

AriochВ том и прикол, что в IBE все было оттестировано, а аппликуха посыпалась.

забавно было бы думать что если IBExpert что то успешно обработал, то и приложение должно сделать тоже самое.

З.Ы. По поводу решения проблемы. Ты проверил нет ли случайно в DataSetProvider.Options флага poFetchBlobOnDemand? Ну если конечно ты через него работаешь
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848192
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдля начала попробуй poFetchBlobOnDemand

Для этого нужно как минимум выкинуть dbExpress и пользоваться другой библиотекой - MIDAS/CDS.

Дружище ни о каком бодании с Оракулом речи не идёт. Вот есть MySql, есть PostgreSql вот с ними по разумным фичам тягаться можно и нужно

постгрессовцы вполне бодаются с MS-SQL и Oracle где могут, так что ты только подтвердил ориентиры.

а что при этом убивается когда-то присущая IB/FB предсказуемость и лёгкость в администрировании неподготовленными пользователями - так и постгресс с ней
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848198
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисВот и получается, что в процессе вызова commit закрываются все курсоры и освобождаются статменты. Их трейс показывает действия самого DBX, а не сервера.

понятно, что действия DBX, но на моё взгля дпорядок действий DBX тут вывернут наизнанку, а именно - что курсор надо закрывать до коммита, а не после. Я в этом прав или нет?

1) не прав, порядок действий DBX корректен
2) вообще прав, но на практике серверу на это наплевать потoму-то и потому-то, съест и не подавится
3) прав, и в каких-то случаях может привести к проблемам
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848204
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladВ трекере ответил.

ты чем снимал трассу, fbtracemanager? с каким конфигом?

я на реальной аппликухе fbprofiler'ом никаких левых транзакций не видел.

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

как и минимум нашёлся ещё один баг DBX....
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848215
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

к проблемам это не имеет абсолютно никакого отношения. Если commit будет вызван до закрытия курсора и уничтожения запроса, то и клиент и сервер в любом случае сделают это автоматически.

Проблема в том что блоб вычитается по идентификатору в другой транзакции. Вообще если это косяк DBX.то тут врядли что сделаешь. Флагов у них я не нашёл. Можно конечно попробовать после каждого фетча блоб руками вычитывать. По идее у них записи пакетами в SimpleDataSet читаются. о все пакеты вроде как должны быть в одной транзакции, иначе бред выходит
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848218
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladPS Ты много репортов про IBX\DBX\Delphi\еtс создал ?

это ваш внутренний классификатор, снаружи недоступный
я вижу репорты "в целом", что вижу о том и пою.

впрочем, я и с Delphi где-то полгода назад описывал запутанный случай, который сносил FB21 на этапе просто подключения к БД. Интереса не вызвало вообще.

ну, документацию и WWW оставим, как и инсталлятор, вы типа к этому никак не относитесь.

CORE-5004 Method to demand use out-of-process stadalone server ( or oppositely, embedded engine) in DPB or connection string
CORE-5185 Connection string: to have option demanding/prohibiting use of embedded (in-process) engine.
регулярно у людей проблемы, когда они на винде внезапно выпадают в embedded, даже не зная, что это такое, и получают наведённые ошибки с правами доступа, как уровня SQL, так и уровня OS.
ну да, небожителям не до проблем идиотов.....

CORE-4641/CORE-5186 - self-security database не требующая админского доступа к database.conf - обсуждалось ещё с fb3 beta, если не alpha - и вроде да, можно, да, сделаем попозже, когда решатся основные проблемы - ну так говорилось. И до сих пор говорится. толку с напоминаний?

CORE-3925 - bugcheck - с 2012 года висел, пока другой человек не подключился и не начал напоминать. Теперь якобы исправлен, в будущих сборках тройки, но не в 2.5.9

ALTER column between BLOB SUB_TYPE TEXT and VARCHAR - вам не нравится CORE-6052 и другие тикеты на ту же тему? ну так заведите правильный тикет. Сейчас в функционале - дырка просто. Пересоздание столбца - чистая теория, потому что тянет за собой по зависимостям пересоздание половины БД. А существующих, но невалидных зависимоcтей в ФБ нет.

Зато много статей типа "Simple INSERT/UPDATE/DELETE test — please participate!" и прочие "можно ли сотни гигабайт? легко!" Так что "курс на Оракл", увы, очевиден.
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848219
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисПо идее у них записи пакетами в SimpleDataSet читаются

это другая библиотека, MIDAS/CDS/как-там-её-потом-обозвали
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848230
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochСимонов ДенисПо идее у них записи пакетами в SimpleDataSet читаются

это другая библиотека, MIDAS/CDS/как-там-её-потом-обозвали

странно, тогда с какого перепуга она на закладке dbExpress?

З.Ы. Тебе прям точно нужен этот глючный dbExpress? Заменить его никак?
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848235
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochALTER TABLE ALTER_TEXT ALTER COLUMN TARGET TYPE T_TEXT_BLOB;

ну это бред чистой воды. Как ты себе представляешь такое изменение на уровне сервера?

Сейчас когда меняется тип столбца через ALTER COLUMN реального преобразования данных не происходит. Просто добавляется новый формат и старые форматы "на лету" преобразуются к новому. Теперь внимание вопрос: как ты представляешь преобразование VARCHAR в BLOB "на лету"?

З.Ы. Нудение про старые хотелки здесь оффтоп
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848238
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на упрощённом сэмпле явное управление транзакциями проблему снимает.

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

кроме того, там есть явное закрытие query, и вот эта последовательность - сначала закрываем транзакцию, а потом курсор, она вполне может получиться оттуда...

но с другой стороны, fbprofiler через traceapi вообще не видел отдельных транзакций и ошибки с блобами...

прогнал через fbprofiler исходный вчерашний сэмпл (нет явного управления транзакциями и query не закрывается), забавно....

start transaction
prepare stmt
exec stmt start
exec stmt finish

start transaction - ага, вложенная!
compile BLR
execute BLR
compile BLR
execute BLR
commit

start transaction
compile BLR
....

Забавно, т.е. чтение BLOB выполняется как почему-то два BLR-запроса, каждый из которых надо ещё компилировать (т.е. не prepared? или зачем это?..)
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848242
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТеперь внимание вопрос: как ты представляешь преобразование VARCHAR в BLOB "на лету"?

select cast('abcde' as blob sub_type text) from rdb$database

и да, можно исправить это преобрзаование "на лету", если оно якобы исторически сломанное, хотя никто никаких примеров этому так и не дал

или можно для этого случая принудительно конвертировать данные, если исправить по-другом не получается

в конце концов ровно та же проблема раньше была с добавлением not null и прочих constraint на живых данных - справились же
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848246
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochЗабавно, т.е. чтение BLOB выполняется как почему-то два BLR-запроса

не обязательно 2 может и больше. Сначала открытие блоба, а потом посегментное чтение. сегментов может быть больше чем 1.

Ariochи вот эта последовательность - сначала закрываем транзакцию, а потом курсор, она вполне может получиться оттуда...

в принципе может. Если при закрытии commit транзакции весь курсор вычитывается целиком (то что не дочитано)
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848250
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochselect cast('abcde' as blob sub_type text) from rdb$database

и да, можно исправить это преобрзаование "на лету", если оно якобы исторически сломанное, хотя никто никаких примеров этому так и не дал

да ну на фиг. Т.е. новые блобы мы храним перманентно, а на каждый старый варчар плодим временный блоб. А потом удивляемся откуда глюки лезут и почему БД растёт

Ariochили можно для этого случая принудительно конвертировать данные, если исправить по-другом не получается

в конце концов ровно та же проблема раньше была с добавлением not null и прочих constraint на живых данных - справились же

не сравнивай яблоки с апельсинами. При добавлении ограничения not null никаких преобразований не делается. Просто делается проверка всех записей на удовлетворение этому ограничению
...
Рейтинг: 0 / 0
TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
    #39848257
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисна каждый старый варчар плодим временный блоб.

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

Аффтар, проверил бы ты это поведение на четвёрке. Туда, кажется, приняли мой патч по
предотвращению преждевременного удаления блобов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 55, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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