Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить