|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_Если используется оптимистичный подход (а я почти уверен что так и есть), и эксклюзивная блокировка страницы происходит только непосредственно перед записью новой версии на страницу. Firebird, в отличие от того же MSSQL не удерживает страничные блокировки до окончания тр-ции (ибо страничные блокировки не являются механизмом обеспечения изоляции тр-ции). Ему достаточно взять краткую блокировку только на время непосредственного изменения страницы (такие блокировки ещё называют латчами). Andrey_Возможна такая ситуация, что обе транзакции вычитали одну и ту же запись (с одинаковой историей версий), обе создали у себя новую версию (дельты там, сжатие, все дела), первая успела записать новую версию на страницу, а вторая при попытке записи обнаружила, что версия записи, которая должна ссылаться на новую уже ссылается на что-то (ну или как-то иначе определила, что та версия которую она создала - бракованая). Это конечно не дедлок, но вылететь с лок конфликт в такой ситуации можно... Это уже ближе к тому, что там происходит :) Andrey_А можно и корректно обработать создав новую версию на основании той истории версий, которая есть сейчас.Для этого нужно: - откатить всю работу, которую сделали между первоначальным чтением и созданием новой версии - повторить всю эту работу, основываясь на обновлённой OLD версии - молиться, чтобы кто-то снова не втиснулся до нас со своим апдейтом Т.е. мало того, что тут происходит потенциальная беготня по кругу, но и никто не знает сколько там работы сделали before триггеры - может они пол-бд перечитали и заменили. Посему решение о повторе работы лежит на программисте, а не навязывается автоматом. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2016, 23:26 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_подключиться к базе тройки с сервера 2.5. если ты имеешь в виду поключиться к серверу тройке через fbclient.dll от 2.5 - то это наплевать. тут могут возникнуть вопросы уровня сетевого обмена, но с самим файлом БД работает только сервер, и ему почти все равно, кто ему поставляет команды. если ты имеешь в виджу файл БД с ODS 12 открыть сервером FB 2.5 или файл ODS 11.x открыть сервером FB 3 - то это невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 11:21 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_Но возможно это моя вина, я мог запутаться и подключиться к базе тройки с сервера 2.5. Это не возможно. А вот перепутать локальный протокол с embedded можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 11:30 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Симонов ДенисAndrey_Но возможно это моя вина, я мог запутаться и подключиться к базе тройки с сервера 2.5. Это не возможно. А вот перепутать локальный протокол с embedded можно.К порче БД это никак привести не может ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 12:43 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Симонов ДенисAndrey_Но возможно это моя вина, я мог запутаться и подключиться к базе тройки с сервера 2.5.Это не возможно. А вот перепутать локальный протокол с embedded можно.Сам перечитал, что написал. В общем ничего криминального вроде не делал. Вряд ли это описание принесет пользу, но чтобы не забыть как что было, оставлю его тут. Что я делал: Ставил FB 3 из дистрибутива Firebird-3.0.0.32483_2_x64, при инсталяции он правильно определил, что у меня установлен 2.5 и отказался выполнять э...начальные настройки. Сервер запускал с ключем -a (это dev-машина и я предполагал что потребуется частое переключение между 2.5 и 3.0, а настраивать их одновременную работу не хотелось т.к. они нужны поочереди) На клиенте использовал fbclient.dll из WOW64 Строка подключения всегда была вида 127.0.0.1:D:\и т.д. (с новыми протоколами пока не разбирался, попробовал что так работает и ладно) Базу бекапил клиентом и сервером 2.5, ресторил клиентом и сервером 3.0 В firebird.conf менял только ServerMode, игрался с разными вариантами (восновном Super и SuperClassic, непомню запускал ли я тест на Classic или нет.) Клиентское приложение стартовало 43 потока, каждый выполнял коннект к базе (10 инсерт-потоков, 10 апдейтящих по одной рандомной записи, 3 апдейтящих одну и ту же рандомную запись, 20 читающих эту же рандомную запись). 2 раза в секунду во все потоки приходил ивент по которому они все стартовали транзакцию, выполняли кто-что должен и коммитились. Это не моя идея такого теста, я бы проеверял, как всегда, скорость отклика на N-условно паралельных запросов. При завершении работы приложения я старался корректно выполнять disconnect, но часто некоторые потоки зависали из-за эксепшенов (те самые лок конфликты) и я приложение срубал через Ctrl+F2 из Delphi или в диспетчере задач когда standalone. То есть, при срубании могло оставаться 1-4 коннекта с открытыми транзакциями. Тестовых запусков приложения было порядка 15. Восновном они были короткие т.к. происходило зависание потоков. Но были и тесты крутившиеся несколько минут. Других коннектов к серверу (IBExpert например) небыло. Краш был обнаружен на утро следующего дня. Не уверен что это важно, вроде в FB нет шедулеров работающих с диском по таймеру. Ну кроме управляемого MaxUnflushedWriteTime, но этот параметр я не трогал. Ошибка выдается при запросе select * from "Table1" статистика базыDatabase "D:\DB\RDBTEST_3.0.FDB" Database header page information: Flags 0 Generation 29095 System Change Number 0 Page size 16384 ODS version 12.0 Oldest transaction 28854 Oldest active 28901 Oldest snapshot 28901 Next transaction 28902 Sequence number 0 Next attachment ID 612 Implementation HW=AMD/Intel/x64 little-endian OS=Windows CC=MSVC Shadow count 0 Page buffers 0 Next header page 0 Database dialect 3 Creation date Jul 26, 2016 18:33:10 Attributes force write Variable header data: Sweep interval: 20000 *END* Database file sequence: File D:\DB\RDBTEST_3.0.FDB is the only file Analyzing database pages ... Expected data on page 177 Table1 (128) Primary pointer page: 163, Index root page: 164 Pointer pages: 1, data page slots: 1632 Data pages: 1632, average fill: 78% Primary pages: 1295, secondary pages: 337, swept pages: 621 Empty pages: 5, full pages: 1344 Fill distribution: 0 - 19% = 176 20 - 39% = 69 40 - 59% = 20 60 - 79% = 90 80 - 99% = 1276 Index PKTable1 (0) Root page: 1006, depth: 2, leaf buckets: 13, nodes: 35444 Average node length: 5.30, total dup: 0, max dup: 0 Average key length: 3.00, compression ratio: 1.27 Average prefix length: 2.82, average data length: 1.00 Clustering factor: 2786, ratio: 0.08 Fill distribution: 0 - 19% = 1 20 - 39% = 0 40 - 59% = 1 60 - 79% = 0 80 - 99% = 11 Table2 (129) Primary pointer page: 167, Index root page: 168 Pointer pages: 1, data page slots: 1608 Data pages: 1608, average fill: 80% Primary pages: 1312, secondary pages: 296, swept pages: 632 Empty pages: 3, full pages: 1354 Fill distribution: 0 - 19% = 143 20 - 39% = 72 40 - 59% = 20 60 - 79% = 89 80 - 99% = 1284 Index FKTable2Table1 (1) Root page: 1015, depth: 2, leaf buckets: 19, nodes: 36000 Average node length: 5.16, total dup: 7996, max dup: 27 Average key length: 2.85, compression ratio: 1.34 Average prefix length: 3.01, average data length: 0.81 Clustering factor: 20372, ratio: 0.57 Fill distribution: 0 - 19% = 0 20 - 39% = 5 40 - 59% = 8 60 - 79% = 0 80 - 99% = 6 Index PKTable2 (0) Root page: 597, depth: 2, leaf buckets: 13, nodes: 35445 Average node length: 5.30, total dup: 0, max dup: 0 Average key length: 3.00, compression ratio: 1.27 Average prefix length: 2.82, average data length: 1.00 Clustering factor: 2927, ratio: 0.08 Fill distribution: 0 - 19% = 1 20 - 39% = 0 40 - 59% = 1 60 - 79% = 0 80 - 99% = 11 И да, господа, я знаю что прежде чем говорить "я тестировал" нужно разобраться в инструменте который тестируешь. Давайте сейчас это не будем обсуждать, цель - найти последовательность действий для краша базы, а не наставить меня на путь истинный по поводу использования дефолтного конфига. И еще, не трогайте пожалуйста меня за двойные кавычки. Я сам их терпеть не могу, но опять же, корпоративный CodeStyle. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 12:45 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvlad, почти не может исключение - когда аппликуха падает и вместе с ней падает сaм embedded с непредсказуемыми последствиями или ещё хуже, аппликуха не падает но тихо "срёт в память" и попадает иногда в кэши встройки за что я его и не люблю ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 12:54 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvlad Удалось относительно стабильно воспроизвести краш базы. Всё окружение, как я описывал раньше, те самые 43 коннекта. После нескольких итераций теста (когда на сервер одновременно уходит 43 запроса) в логе FB появляется ошибка: USER-PC Thu Jul 28 17:11:20 2016 Database: D:\DB\RDBTEST_3.0_CORRUPTION.FDB internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2307) После этого иногда сервер падает, иногда работает, но при выключении иногда зависает, а иногда вылетает (иконка в трее не ищезает :)) Вобщем, в результате первой ошибки структуры в памяти оказываются повреждены. Если с таким не полностью упавшим сервером продолжить работать, иногда это приводит к wrong page type. Крашится как Super так как SuperClassic. Сейчас жду разрешения от начальства, чтобы выслать не поломанный бекап+исходники тестов (они вообще для другого делались). В любом случае, даже если разрешения не будет, дома заново напишу. Кстати, куда высылать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 17:44 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_, спасибо. Ошибка, правда, совсем другая, но это может быть связано. Высылай на hvlad at users sourceforge net, если есть возможность куда-то выложить - тем лучше. Если стабильно воспроизводится, то можно exe, без исходников. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2016, 19:17 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvlad, Отправил с исходниками. Руководство дало свое высочайшее соизволение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2016, 00:48 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_, Спасибо. Можешь выслать exe ? Не у всех есть Delphi, тем более нужной версии :) И, я надеюсь, путь к БД, логин и пароль не вшиты в exe, можно будет задать свои ? PS провайдер глючит с отправкой почты, поэтому пишу тут ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2016, 09:50 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvlad, Только добрался до компьютера. Выслал бинарник с файлом параметров. Очень жаль, что не у всех установлено делфи нужной версии :) Хотя, это делает меня, как специалиста, более ценным. И когда ко мне приходят бинарники, я боюсь их запускать, по этому подумал, что будет лучше без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2016, 20:23 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_, проблему воспроизвёл, баг в fb3 подтверждаю. Он весьма специфичный и, похоже, достаточно редкий. Исправление будет через пару дней, надеюсь. Ещё раз спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2016, 23:30 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2016, 20:41 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvlad http://tracker.firebirdsql.org/browse/CORE-5327 Спасибо, тоже проверю. Позже. А на 2.5 бекпорт не планируется? P.S. Тестовый пример с исходниками можно распостранять т.к. если исходники вышли за пределы компании, их нельзя считать privat. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2016, 10:59 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_А на 2.5 бекпорт не планируется?Эта ошибка появилась в fb3 (с 64-битными номерами тр-ций), так что я сильно сомневаюсь, что 2.5 затронут ;) Если наши тестеры не смогут сделать воспроизводимый пример своими силами, приаттачу exe, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2016, 11:22 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_hvlad http://tracker.firebirdsql.org/browse/CORE-5327 Спасибо, тоже проверю. Позже...Позже настало. И совершенно случайно я нашел 100% путь воспроизведения. Тот бекап, что я высылал ресторится с ошибками. Точнее при ресторе (с ключами -r -rep) он не говорит, что есть ошибки, но валидация (с ключами -v -n) по свежеотрестореной базе выдает вот такое в firebird.log: USER-PC Mon Sep 26 17:30:39 2016 Database: D:\DB\RDBTEST_3.0.FDB Validation started USER-PC Mon Sep 26 17:30:39 2016 Database: D:\DB\RDBTEST_3.0.FDB Error: Page 177 wrong type (expected data encountered unknown (89)) USER-PC Mon Sep 26 17:30:39 2016 Database: D:\DB\RDBTEST_3.0.FDB Error: Data page 177 {sequence 0} is confused in table Table1 (128) USER-PC Mon Sep 26 17:30:39 2016 Database: D:\DB\RDBTEST_3.0.FDB Validation finished: 2 errors, 0 warnings, 0 fixed Могу повторно выслать бекап, если потерялся за давностью лет. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2016, 17:48 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_, проверил на текущем снапшоте - валидация ошибок не даёт. Ты уверен, что ресторил\проверял на новом билде ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2016, 19:17 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_, проверил на 3.0.0.32483-2_x64 - проблему не вижу ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2016, 19:21 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_Точнее при ресторе (с ключами -r -rep) и чем же эти ключи отличаются от -c в плане создания шаблона БД и заливки туда метаданных и данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2016, 20:31 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
hvladAndrey_, на 3.0.0.32483-2_x64 - проблему не вижуПрошу прощения, сам запутался и ввел всех в заблуждение - ресторил одну базу, а валидировал другую. Если рестор+валидацию делать с правильной базой - валидация никаких ошибок не выдает. Я рак, мне стыдно. В будущем буду более тщательно проверять условия экспериментов. kdvAndrey_Точнее при ресторе (с ключами -r -rep) и чем же эти ключи отличаются от -c в плане создания шаблона БД и заливки туда метаданных и данных?Возможно ничем. Кроме того что в описании ключа rep явно написано слово -replace. А мне и нужно replace. А в описании ключа -c этого слова не написано. offtopПожалуйста, поймите: 1. Не все кто обращается сюда с вопросами, последние 10 лет занимаются исключительно фаербердом. Для многих СУБД это 3-4-10 по приоритету задача. 2. Из-за высокой скорости современных компьютеров в последнее время стало очень популярно "программирование брутфорсом". Это когда написал-скомпилировал-ошибка-передал-скомпилировал-запустил-ошибка-переделал-скомпилировал-запустил-работает-ЗАБЫЛ про задачу и переключился на следующую. И, к сожалению, я подхожу в обе категории. По этому я глубоко не вникал в смысл, механику работы, причины появления, побочные эффекты от сочетаний и другие особенности каждого ключа. Я сделал просто - перед рестором я прочитал что в консоль выдает gbak, подобрал подходящие по описанию опции, попробовал, заработало, написал батник и ЗАБЫЛ про задачу. О причинах почему сейчас сложилось именно так можно написать целую книгу, но я лучше пойду поработаю - кушать хочется больше, чем словоблудить. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2016, 12:18 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_Прошу прощения, сам запутался и ввел всех в заблуждение - ресторил одну базу, а валидировал другуюУ всех бывает :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2016, 12:43 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Andrey_Возможно ничем. Кроме того что в описании ключа rep явно написано слово -replace. А мне и нужно replace. А в описании ключа -c этого слова не написано. не надо привыкать к хреновым опциям. Как показывает практика, -replace не нужен вообще никогда и ни за чем. http://www.ibase.ru/gbak/#restore Что здесь отсутствует? Правильно, знакомый многим параметр -r. Параметр -r на самом деле не -r[estore], а -r[eplace], т.е. не "восстановить", а "заменить" имеющуюся базу данных. Т.е. если в предыдущем примере команды заменить -c на -r, то существующая база данных e.fdb будет молча удалена. Этого допускать нельзя, потому что по разным причинам восстановление из резервной копии может не состояться, и тогда вы останетесь без оригинальной базы данных и с невосстановимой резервной копией. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 02:13 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
kdvКак показывает практика, -replace не нужен вообще никогда и ни за чем. Мне нужен. Всегда и везде. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 09:43 |
|
Забавное поведение rec_version в wait-транзакциях
|
|||
---|---|---|---|
#18+
Hello, Miwaonline! You wrote on 29 сентября 2016 г. 11:32:48: Miwaonline> Мне нужен. Всегда и везде.+1 у нас рестор выполняется на отдельном резервном сервере. 7 папочек по дням недели. в каждой соответственно восстановленная база на этот день. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2016, 11:35 |
|
|
start [/forum/topic.php?fid=40&msg=39281728&tid=1561953]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 432ms |
0 / 0 |