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

Откуда:
Сообщений: 42
Добрый день

Почему Firebird всех версий падает и разрывает все соединения если повреждена строка в какой нить таблице или страница с индексом а он всего лишь выполнял select в readonly транзакции?
В архитектуре Classic это еще не так болезненно, но вот при использовании SuperServer кучу пользователей выкидывает из программы, хотя они к этой таблице и этой записи и не обращались.
Можно же перехватить исключение и вернуть ошибку вместо набора данных?
С какой целью выбрано такое жесткое, снижающее общую доступность системы поведение?
5 сен 19, 07:23    [21964154]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Коваленко Дмитрий
Member

Откуда: Липецк
Сообщений: 548
Вадим Мещеряков
Добрый день

Почему Firebird всех версий падает ...

Кстати да, почему? Хороший вопрос.

Сегодня утром, в комнате счастья, просматривал статью

автор
включая подтвержденные результаты работы под промышленной нагрузкой

Подумалось - у меня оно (3.0.4) проработало 28 дней. Под нагрузкой. А потом навернулось при простое :)

---
Кстати, на этом сайте увидел еще одну статью - Непрерывное тестирование ...

Надо будет почитать. Хотя нахер ... лучше тесты добить.

---
Потому что работать на упреждение проблем - это ПРОСТО КАПЕЦ КАК ДОРОГО.
5 сен 19, 09:24    [21964221]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Вадим Мещеряков,

кхм... Вопрос конечно хороший. Но скорее всего правильно делает, ибо если БД побилась в одном месте то может и продолжить своё разрушение. Лучше уж сразу об этом заорать, мол чини базу пока не поздно.
5 сен 19, 09:41    [21964242]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Коваленко Дмитрий
Сегодня утром, в комнате счастья, просматривал статью

провокаторская джинса от postgrespro.
Вадим Мещеряков
Почему Firebird всех версий падает и разрывает все соединения если повреждена строка в какой нить таблице или страница с индексом

если индекс поврежден - ничего не падает. Также не падает и на internal gds consistency check, просто прекращает работать с базой, во избежание повреждений при неправильной ЗАПИСИ.
Падает только тогда, когда структуры повреждены так, что невозможно определить, что они повреждены. А повреждение в результате портит память, и т.д.

Вопрос вообще странный. Почему программы на Дельфи (и вообще) падают по AV? Потому же.
5 сен 19, 09:52    [21964255]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Коваленко Дмитрий
Member

Откуда: Липецк
Сообщений: 548
kdv
Коваленко Дмитрий
Сегодня утром, в комнате счастья, просматривал статью

провокаторская джинса от postgrespro.

Я понимаю, что падает все. Но проблемы FB все равно подбешивают.

А сюда написал, потому что вчера тоже про эту херню думал.
5 сен 19, 10:06    [21964271]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 42
Коваленко Дмитрий
если индекс поврежден - ничего не падает. Также не падает и на internal gds consistency check, просто прекращает работать с базой, во избежание повреждений при неправильной ЗАПИСИ.


Значит мой вопрос не корректный а правильный будет такой:

"Почему Firebird прекращает работать с базой если находит ошибку в записи или в индексе при select в readonly транзакции?"

Вопрос насколько это правильно отключить всех от базы по условию if (!thisPointer) появился после вот такого комментария к http://tracker.firebirdsql.org/browse/CORE-6137

confirmed on Windows 
and it is not releated to chaset tested with WIN1250 and NONE - same error 


Message: isc_dsql_fetch failed. 

SQL Message : -902 
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements 

Engine Code : 335544333 
Engine Message : 
internal Firebird consistency check (invalid SEND request (167), file: JrdStatement.cpp line: 327) 

------------------------------------------------------------------------------------------------------------------------------------------------------ 
in the source code it is 

jrd_req* JrdStatement::findRequest(thread_db* tdbb) 
{ 
    SET_TDBB(tdbb); 
    Attachment* const attachment = tdbb->getAttachment(); 
    const JrdStatement* const thisPointer = this;	// avoid warning 
    if (!thisPointer) 
        BUGCHECK(167);	/* msg 167 invalid SEND request */ 
5 сен 19, 10:07    [21964272]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Вадим Мещеряков
Почему Firebird всех версий падает и разрывает все соединения если повреждена строка в какой нить таблице или страница с индексом а он всего лишь выполнял select в readonly транзакции?
Пример падения ?
5 сен 19, 10:12    [21964276]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
Вадим Мещеряков,

ах ты про опубликованный тобой баг. Ну так это же сделано не намеренно.

Видишь ли если дело дошло то багчека, то поздно пить боржоми.
Это условие которое не должно достигаться никогда, если в коде нет ошибки. И оно является лишь следствием, где-то пропущена какая-то проверка или обработка которая должна была предотвратить эту ситуацию.
5 сен 19, 10:12    [21964277]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 42
hvlad
Пример падения ?

Никто не присылал баз в которых запись повреждена или индексная страница?
Когда SuperServer обращается к такой записи - рвет все соединения

Я на днях ремонтировал с помощью gfix -mend базу в книжном магазине заказчика. Магазин не мог работать пока не починили.
5 сен 19, 10:52    [21964325]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

05.09.2019 10:52, Вадим Мещеряков пишет:
> Я на днях ремонтировал с помощью gfix -mend базу в книжном магазине заказчика.
> Магазин не мог работать пока не починили.

а с поломатым кассовым аппаратом магазин работать может?
а если трубу прорвало, или электричество кончилось?

Posted via ActualForum NNTP Server 1.5

5 сен 19, 11:02    [21964327]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Вадим Мещеряков
Когда SuperServer обращается к такой записи - рвет все соединения
Где ПАДЕНИЕ, блин ? Когда научимся называть вещи своими именами ?

Что лучше :
- работать с возможно повреждённой памятью и плевать что из-за этого будет записано в БД

- тщательно проверять каждую страницу при любом к ней обращении (только при
чтении с диска - не достаточно, память могла повредить злобная UDF, или случайный
космический нейтрон) - и тормозить при этом до невозможности

- честно сказать: я вижу то, чего быть не может никогда, х\з что там ещё, давай-ка
лучше всё остановим и ты меня перезапустишь (возможно после проверок)

PS изначальная архитектура IB\FB - классик, там такой подход вполне оправдан.
5 сен 19, 11:18    [21964340]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Вадим Мещеряков
Я на днях ремонтировал с помощью gfix -mend базу
Это не ремонт. Это убийство.
5 сен 19, 11:18    [21964342]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Вадим Мещеряков
Member

Откуда:
Сообщений: 42
hvlad
Это не ремонт. Это убийство.

После gfix -mend можно до конца рабочего дня дотянуть а там уже и перебэкапить
После перебэкапа в базе два варианта.
1. дубликаты записей (удаляю)
2. нет записи(ей) (беру из копии базы или из локальной копии документа)

Какие еще есть возможности быстро восстановить работоспособность?

На самом деле, это не часто приходится делать, как правило на небольших объектах, но всегда внезапно.
5 сен 19, 11:34    [21964359]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Вадим Мещеряков
Member

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

- честно сказать: я вижу то, чего быть не может никогда, х\з что там ещё, давай-ка
лучше всё остановим и ты меня перезапустишь (возможно после проверок)

PS изначальная архитектура IB\FB - классик, там такой подход вполне оправдан.

Понял, все логично. Я совсем и не думал про страницы в памяти
5 сен 19, 11:36    [21964363]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
Вадим Мещеряков
Коваленко Дмитрий
если индекс поврежден - ничего не падает. Также не падает и на internal gds consistency check, просто прекращает работать с базой, во избежание повреждений при неправильной ЗАПИСИ.


Значит мой вопрос не корректный а правильный будет такой:

"Почему Firebird прекращает работать с базой если находит ошибку в записи или в индексе при select в readonly транзакции?"

Вопрос насколько это правильно отключить всех от базы по условию if (!thisPointer) появился после вот такого комментария к http://tracker.firebirdsql.org/browse/CORE-6137

confirmed on Windows 
and it is not releated to chaset tested with WIN1250 and NONE - same error 


Message: isc_dsql_fetch failed. 

SQL Message : -902 
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements 

Engine Code : 335544333 
Engine Message : 
internal Firebird consistency check (invalid SEND request (167), file: JrdStatement.cpp line: 327) 

------------------------------------------------------------------------------------------------------------------------------------------------------ 
in the source code it is 

jrd_req* JrdStatement::findRequest(thread_db* tdbb) 
{ 
    SET_TDBB(tdbb); 
    Attachment* const attachment = tdbb->getAttachment(); 
    const JrdStatement* const thisPointer = this;	// avoid warning 
    if (!thisPointer) 
        BUGCHECK(167);	/* msg 167 invalid SEND request */ 


Очень плохой стиль кода, когда вызывают метод несконструированного объекта... Проверка должна была быть ранее.
5 сен 19, 16:30    [21964759]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Симонов Денис
Member

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

товарищ ты хоть понимаешь для чего сей код был сделан?

Этот код из разряда ну мы всё проверили, но вдруг случился п.... и вот тогда кидаем багчек и прекращаем работу. Т.е. багчек он потому так и называется, что если уж туда попало, то возможно это баг в сервере. Это как раз кусок кода для отлова багов.
5 сен 19, 16:56    [21964788]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Этот фрагмент не имеет никакого отношения к реальному багу.
5 сен 19, 17:06    [21964798]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
Симонов Денис
Siemargl,

товарищ ты хоть понимаешь для чего сей код был сделан?

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

По стандарту С++ вызов метода по нулевому указателю это UB
5 сен 19, 17:06    [21964799]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
hvlad
Этот фрагмент не имеет никакого отношения к реальному багу.
Возможно, что BUGCHECK(167) вызвался в другом месте, но в любом случае этот код не имеет права на существование.
5 сен 19, 17:08    [21964801]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Siemargl
hvlad
Этот фрагмент не имеет никакого отношения к реальному багу.
Возможно, что BUGCHECK(167) вызвался в другом месте
Этот багчек является псевдо-случайным следствием совершенно другого бага. И он, кстати, выполнил свою работу - не дал разломать БД окончательно.

Siemargl
но в любом случае этот код не имеет права на существование.
Не делай так. Будь молодцом и примером для всех юных пионеров.
5 сен 19, 17:16    [21964805]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
hvlad
Siemargl
пропущено...
Возможно, что BUGCHECK(167) вызвался в другом месте
Этот багчек является псевдо-случайным следствием совершенно другого бага. И он, кстати, выполнил свою работу - не дал разломать БД окончательно.

Siemargl
но в любом случае этот код не имеет права на существование.
Не делай так. Будь молодцом и примером для всех юных пионеров.

Лучше поздно assert, чем никогда....

Для юных пионеров я пока написал пару статей о надежном программировании.

Линтером то пользуетесь? Он должен был спалить такое.
5 сен 19, 22:45    [21964977]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Siemargl
Линтером то пользуетесь?
???

Siemargl
Он должен был спалить такое.
Какое - такое ? :)
5 сен 19, 23:10    [21964985]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
hvlad
Siemargl
Линтером то пользуетесь?
???
https://en.wikipedia.org/wiki/Lint_(software)
hvlad
Siemargl
Он должен был спалить такое.
Какое - такое ? :)
UB
6 сен 19, 00:06    [21965008]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

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

Линтер (на данном сайте) - это скорее что-то про СУБД :)
Нет, не пользуюсь. Ни тем, ни этим :)

Что палить-то ? Ты к чему прицепился ? И зачем ? :)

Каким боком проверка this на NULL вдруг стала страшным преступлением ?
Если её туда всунули, значит когда-то был краш в этом месте.
Да, подстелили соломку на будущее - святой стандарт против ?
6 сен 19, 00:24    [21965013]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
В данному случае UB такое: для this == nullptr - реакция линтера "условие всегда ложно"

А то тут малограмотных полфорума, банят то, что не понимают.
6 сен 19, 00:29    [21965014]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
Яс. Нужен сильно развернутый ответ.
https://habr.com/ru/company/abbyy/blog/205070/
6 сен 19, 00:31    [21965015]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
Ну и я вроде и не против.

Но не у меня падает и ломается.
6 сен 19, 00:33    [21965016]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Siemargl
В данному случае UB такое: для this == nullptr - реакция линтера "условие всегда ложно"
А там не такой код. И это зря. Он конечно может понять, что this в переменную скопировали, тут не нужно гением быть.
Такие проверки просто так не появляются. Так что - нет, оно не всегда ложно, увы.

Siemargl
А то тут малограмотных полфорума, банят то, что не понимают.
Совершенно согласен - полно малограмотных, считающих что понимают чужой код по одной строке.

Siemargl
Нужен сильно развернутый ответ.
Который не имеет ни малейшего отношения к приведенному фрагменту кода.

Может пора снять шоры с глаз и подумать - а зачем оно там на самом деле ?

И заодно рассказать - к каким ужасам оно приводит ? :)
6 сен 19, 00:42    [21965018]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Siemargl
Ну и я вроде и не против.
Вот и хорошо.

Siemargl
Но не у меня падает и ломается.
Оно падало не там, я уже говорил.
Уже не падает, кстати.
6 сен 19, 00:43    [21965019]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
hvlad
И это зря.
И это НЕ зря
:)
6 сен 19, 00:44    [21965020]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
hvlad
...
Siemargl
Нужен сильно развернутый ответ.
Который не имеет ни малейшего отношения к приведенному фрагменту кода.

Может пора снять шоры с глаз и подумать - а зачем оно там на самом деле ?

И заодно рассказать - к каким ужасам оно приводит ? :)

Я же сказал, что проверять надо было раньше 21964759. К ужасам лишняя бесполезная проверка не приводит.

Но шоры можно и снять, слушаю внимательно вашу версию.
6 сен 19, 00:48    [21965022]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
hvlad
Member

Откуда:
Сообщений: 10531
Siemargl
Я же сказал, что проверять надо было раньше
А ты каждый вызов каждого метода проверяешь указатель объекта на нулл ?
Можешь верить, можешь не верить, но в реально подозрительных местах она есть.
Но, в позу стать конечно проще (21964801)

Siemargl
К ужасам лишняя бесполезная проверка не приводит.
Ну, хоть что-то :)
Насчёт бесполезности - тут не тебе судить.

Siemargl
Но шоры можно и снять, слушаю внимательно вашу версию.
Вот предыдущая версия данного кода, до того, как ф-ция EXE_find_request стала методом JrdStatement::findRequest

jrd_req* EXE_find_request(thread_db* tdbb, jrd_req* request, bool validate)
{
...
/* I found a core file from my test runs that came from a NULL request -
 * but have no idea what test was running.  Let's bugcheck so we can
 * figure it out
 */
	if (!request)
		BUGCHECK /* REQUEST */ (167);	/* msg 167 invalid SEND request */

И появилась эта проверка ещё во времена FB1, а то и IB

И выкидывать её просто потому, что линтер не велит - нафиг-нафиг.
6 сен 19, 00:57    [21965026]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6273
hvlad,

Ну я тоже грешен, и излишние проверки потом не удаляю..

Но код совсем не идентичен.

В Си версии был входной контракт, что request != NULL, а в С++ этот контракт должен был вынесен на создание объекта JrdStatement ( в этом куске кода не видно, есть ли он)

И более того, в С коде должен был быть аналогичный контракт на tdbb != NULL, а вот в С++ версии его не видно (возможно в макросе SET_TDBB, но вряд ли).

Собственно, пора закруглять философскую тему. Думаю, мало кому интересно.
6 сен 19, 01:23    [21965030]     Ответить | Цитировать Сообщить модератору
 Re: Почему Firebird всех версий падает и разрывает все соединения если повреждена строка?  [new]
Vlad F
Member

Откуда:
Сообщений: 873
Siemargl,

Очень даже интересно. На самом деле в последнее время совсем мало стало интересных тем, имхо.
6 сен 19, 20:29    [21965702]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить