Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Есть один запрос, вроде бы примитивный, который отрабатывает успешно в 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 возможно?
9 авг 19, 18:00    [21945839]     Ответить | Цитировать Сообщить модератору
 Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Трассировки операций с блобами нет, увы.

Invalid blob id может быть в результате чтения временного блоба после завершения тр-ции, в которой он был создан (т.е. баг в приложении), или
(нужно уметь на это наступить) из-за сборки мусора, если блоб читается в read committed тр-ции.
Во втором случае уровень изоляции snapshot должен помочь.
9 авг 19, 18:05    [21945840]     Ответить | Цитировать Сообщить модератору
 Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
Arioch
Member

Откуда:
Сообщений: 10967
Нет вообще, или нет в 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 думает иначе... Надеюсь, серверу от этого не хуже.
  • 9 авг 19, 18:37    [21945863]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    Arioch
    Нет вообще, или нет в FB2 ? Вроде ещё в 2012 собирались - 13036447
    Кто собирался ? Кто вообще об этом с тех пор вспоминал ? Кому оно было реально нужно всё это время ?

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

    Arioch
    Проверялись варианты...
    Т.е. оно легко воспроизводится ?
    9 авг 19, 18:59    [21945889]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    Кстати, а такие функции, как 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
    12 авг 19, 00:17    [21946717]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    rdb_dev
    Member

    Откуда: с болот
    Сообщений: 2929
    Arioch
    Если вам это sexy, ну типа убить Оракл и завоевать мир Большого Железа - то вы будете это делать.
    Нет - нет.
    http://tracker.firebirdsql.org/secure/IssueNavigator.jspa?reset=true&reporterSelect=specificuser&reporter=arioch
    Не смеши!
    Тут "секси" не печь очевидно выгодные плюшки, а выпекать стандартные кирпичи из ржаной муки в соответствии со стандартом, сочинённым флагманами отрасли.
    12 авг 19, 09:08    [21946784]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    Arioch
    hvlad
    Кто собирался ? Кто вообще об этом с тех пор вспоминал ?


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

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

    PS Ты много репортов про IBX\DBX\Delphi\еtс создал ?
    Много тебе сделали ?
    Часто напоминал ?
    12 авг 19, 09:09    [21946785]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    rdb_dev, Arioch,

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

    ЗЫ не здесь, умоляю
    12 авг 19, 09:10    [21946788]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    rdb_dev
    Member

    Откуда: с болот
    Сообщений: 2929
    hvlad, не о чем говорить. Всё и так очевидно.
    12 авг 19, 09:11    [21946789]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch,

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

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


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


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


    и тут Остапа понесло...
    Дружище ни о каком бодании с Оракулом речи не идёт. Вот есть MySql, есть PostgreSql вот с ними по разумным фичам тягаться можно и нужно
    12 авг 19, 09:29    [21946810]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 10531
    В трекере ответил.
    12 авг 19, 11:01    [21946892]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch
    Любопытное в трейсе для DBX, окончания выполнения выглядит как exec-stmt-finish -> commit -> close cursor -> free-stmt
    Я как-то думал, что курсоры живут внутри транзакций и закрываться должны перед закрытием транзакции, но DBX думает иначе... Надеюсь, серверу от этого не хуже.


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

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


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

    З.Ы. По поводу решения проблемы. Ты проверил нет ли случайно в DataSetProvider.Options флага poFetchBlobOnDemand? Ну если конечно ты через него работаешь
    12 авг 19, 11:26    [21946929]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    Симонов Денис
    для начала попробуй poFetchBlobOnDemand


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

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


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

    а что при этом убивается когда-то присущая IB/FB предсказуемость и лёгкость в администрировании неподготовленными пользователями - так и постгресс с ней
    12 авг 19, 11:42    [21946961]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    Симонов Денис
    Вот и получается, что в процессе вызова commit закрываются все курсоры и освобождаются статменты. Их трейс показывает действия самого DBX, а не сервера.


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

    1) не прав, порядок действий DBX корректен
    2) вообще прав, но на практике серверу на это наплевать потoму-то и потому-то, съест и не подавится
    3) прав, и в каких-то случаях может привести к проблемам
    12 авг 19, 11:45    [21946968]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    hvlad
    В трекере ответил.


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

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

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

    как и минимум нашёлся ещё один баг DBX....
    12 авг 19, 11:48    [21946976]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch,

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

    Проблема в том что блоб вычитается по идентификатору в другой транзакции. Вообще если это косяк DBX.то тут врядли что сделаешь. Флагов у них я не нашёл. Можно конечно попробовать после каждого фетча блоб руками вычитывать. По идее у них записи пакетами в SimpleDataSet читаются. о все пакеты вроде как должны быть в одной транзакции, иначе бред выходит
    12 авг 19, 12:01    [21946992]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    hvlad
    PS Ты много репортов про 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!" и прочие "можно ли сотни гигабайт? легко!" Так что "курс на Оракл", увы, очевиден.
    12 авг 19, 12:05    [21946995]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    Симонов Денис
    По идее у них записи пакетами в SimpleDataSet читаются


    это другая библиотека, MIDAS/CDS/как-там-её-потом-обозвали
    12 авг 19, 12:06    [21946996]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch
    Симонов Денис
    По идее у них записи пакетами в SimpleDataSet читаются


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


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

    З.Ы. Тебе прям точно нужен этот глючный dbExpress? Заменить его никак?
    12 авг 19, 12:23    [21947019]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch
    ALTER TABLE ALTER_TEXT ALTER COLUMN TARGET TYPE T_TEXT_BLOB;


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

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

    З.Ы. Нудение про старые хотелки здесь оффтоп
    12 авг 19, 12:29    [21947026]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    на упрощённом сэмпле явное управление транзакциями проблему снимает.

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

    кроме того, там есть явное закрытие 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? или зачем это?..)
    12 авг 19, 12:32    [21947030]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Arioch
    Member

    Откуда:
    Сообщений: 10967
    Симонов Денис
    Теперь внимание вопрос: как ты представляешь преобразование VARCHAR в BLOB "на лету"?


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

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

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

    в конце концов ровно та же проблема раньше была с добавлением not null и прочих constraint на живых данных - справились же
    12 авг 19, 12:35    [21947034]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch
    Забавно, т.е. чтение BLOB выполняется как почему-то два BLR-запроса


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

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


    в принципе может. Если при закрытии commit транзакции весь курсор вычитывается целиком (то что не дочитано)
    12 авг 19, 12:38    [21947040]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Симонов Денис
    Member

    Откуда: Рязань
    Сообщений: 9831
    Arioch
    select cast('abcde' as blob sub_type text) from rdb$database

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


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

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

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


    не сравнивай яблоки с апельсинами. При добавлении ограничения not null никаких преобразований не делается. Просто делается проверка всех записей на удовлетворение этому ограничению
    12 авг 19, 12:42    [21947046]     Ответить | Цитировать Сообщить модератору
     Re: TraceAPI 2.5 - разделить чтение rows и чтение blob'ов в этих rows?  [new]
    Dimitry Sibiryakov
    Member

    Откуда:
    Сообщений: 48163

    Симонов Денис
    на каждый старый варчар плодим временный блоб.

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

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

    Posted via ActualForum NNTP Server 1.5

    12 авг 19, 12:49    [21947056]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
    Все форумы / Firebird, InterBase Ответить