SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0002016 | SAS.Планета | [All Projects] Баг | public | 15-07-2013 06:57 | 02-08-2013 12:02 |
|
Reporter | Garl | |
Assigned To | zed | |
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | resolved | Resolution | fixed | |
Platform | Windows | OS | 7 | OS Version | Home Premium |
Product Version | .Nightly | |
Target Version | 131111 | Fixed in Version | 131111 | |
|
Summary | 0002016: Обработка ошибок в BerkeleyDB |
Description | есть подозрения на битый кэш, но вдруг нет. |
Steps To Reproduce | |
Additional Information | |
Tags | No tags attached. |
Relationships | |
Attached Files | SASPlanet.Debug.elf (76,163) 15-07-2013 06:57 http://www.sasgis.org/mantis/file_download.php?file_id=1434&type=bug 16-07-2013-SASPlanet.Debug.elf (71,859) 16-07-2013 08:39 http://www.sasgis.org/mantis/file_download.php?file_id=1437&type=bug |
|
Issue History |
Date Modified | Username | Field | Change |
15-07-2013 06:57 | Garl | New Issue | |
15-07-2013 06:57 | Garl | File Added: SASPlanet.Debug.elf | |
15-07-2013 12:01 | zed | Note Added: 0012070 | |
15-07-2013 12:33 | zed | Note Added: 0012071 | |
15-07-2013 13:22 | Garl | Note Added: 0012072 | |
15-07-2013 13:36 | zed | Note Added: 0012073 | |
15-07-2013 13:44 | vasketsov | Note Added: 0012074 | |
15-07-2013 14:05 | zed | Note Added: 0012075 | |
15-07-2013 14:12 | vasketsov | Note Added: 0012076 | |
15-07-2013 14:17 | vasketsov | Note Added: 0012077 | |
15-07-2013 14:25 | zed | Note Added: 0012078 | |
15-07-2013 14:37 | vasketsov | Note Added: 0012079 | |
15-07-2013 14:38 | vasketsov | Note Added: 0012080 | |
15-07-2013 14:43 | zed | Note Added: 0012081 | |
15-07-2013 14:46 | zed | Note Added: 0012082 | |
15-07-2013 18:21 | vasketsov | Note Added: 0012090 | |
16-07-2013 04:55 | zed | Note Added: 0012092 | |
16-07-2013 05:20 | zed | Note Added: 0012096 | |
16-07-2013 05:45 | zed | Assigned To | => zed |
16-07-2013 05:45 | zed | Status | new => confirmed |
16-07-2013 05:45 | zed | Target Version | => 131111 |
16-07-2013 05:45 | zed | Summary | Berkley DB Unknown error message => Обработка ошибок в BerkeleyDB |
16-07-2013 07:28 | vasketsov | Note Added: 0012103 | |
16-07-2013 08:38 | Garl | Note Added: 0012104 | |
16-07-2013 08:39 | Garl | File Added: 16-07-2013-SASPlanet.Debug.elf | |
16-07-2013 08:39 | Garl | Note Edited: 0012104 | bug_revision_view_page.php?rev_id=5566 |
16-07-2013 08:40 | Garl | File Added: dbv_conv.jpg | |
16-07-2013 08:40 | Garl | File Added: dbv_conv_2.jpg | |
16-07-2013 08:41 | Garl | Note Edited: 0012104 | bug_revision_view_page.php?rev_id=5567 |
16-07-2013 08:44 | Garl | Note Added: 0012105 | |
16-07-2013 08:47 | Garl | Note Added: 0012106 | |
16-07-2013 08:47 | Garl | File Added: 12-43-SASPlanet.Debug.elf | |
16-07-2013 08:47 | Garl | Note Edited: 0012106 | bug_revision_view_page.php?rev_id=5569 |
16-07-2013 11:53 | zed | Note Deleted: 0012104 | |
16-07-2013 11:54 | zed | Note Deleted: 0012105 | |
16-07-2013 11:54 | zed | File Deleted: dbv_conv.jpg | |
16-07-2013 11:54 | zed | File Deleted: dbv_conv_2.jpg | |
16-07-2013 12:04 | zed | Note Deleted: 0012106 | |
16-07-2013 12:04 | zed | File Deleted: 12-43-SASPlanet.Debug.elf | |
16-07-2013 12:13 | zed | Note Added: 0012107 | |
17-07-2013 09:51 | vasketsov | Note Added: 0012109 | |
02-08-2013 12:02 | zed | Status | confirmed => resolved |
02-08-2013 12:02 | zed | Fixed in Version | => 131111 |
02-08-2013 12:02 | zed | Resolution | open => fixed |
Notes |
|
(0012070)
|
zed
|
15-07-2013 12:01
|
|
Какой-то странный стек вызовов. Вначале шла вполне прослеживаемая запись тайла в хранилище, а потом вдруг откуда ни возьмись оно вылетает в TBerkeleyDBValue.Assign.
А в sdb.log ничего не записалось? Там ещё есть подозрительный вызов функции __db_errx из libdb51.dll, т.е. скорее всего ошибка прилетела оттуда, но почему-то выстрелило чёрт-знает куда. Возможно как раз из-за переделанной обработки ошибок. |
|
|
(0012071)
|
zed
|
15-07-2013 12:33
|
|
>Возможно как раз из-за переделанной обработки ошибок.
Да, всё больше склоняюсь к этому мнению. Если библиотека сообщает нам об ошибке внутри себя, она возвращает код ошибки и сообщение, т.е. по сути, исключения как такового ещё и нету. А мы вдруг просим эврику показать нам последнее исключение. Вот оно и показывает абы что. |
|
|
(0012072)
|
Garl
|
15-07-2013 13:22
|
|
15-07-2013 10:47:18.798 Error [BerkeleyDB Value]: Bad magic value (ZVAL)
15-07-2013 10:54:36.103 Error [BerkeleyDB Value]: Bad CRC32 value: 0xA7B1EFD0
15-07-2013 10:54:38.204 Error [BerkeleyDB Value]: Bad CRC32 value: 0x1F8644D6
15-07-2013 10:54:55.807 BerkeleyDB: z14\4\2\19.11.sdbv page 6868 is on free list with type 7 e:\cache_dbv\sat_all_v1\
15-07-2013 11:01:11.031 Error [BerkeleyDB Value]: Bad magic value (▐6Yг)
15-07-2013 11:01:11.073 Error [BerkeleyDB Value]: Bad CRC32 value: 0x1CB62836
15-07-2013 11:01:51.595 BerkeleyDB: z17\39\23\156.93.sdbv page 186094 is on free list with type 7 e:\cache_dbv\sat_all_v1\ |
|
|
(0012073)
|
zed
|
15-07-2013 13:36
|
|
Ну вот и ошибки:
BerkeleyDB: z14\4\2\19.11.sdbv page 6868 is on free list with type 7 e:\cache_dbv\sat_all_v1\
BerkeleyDB: z17\39\23\156.93.sdbv page 186094 is on free list with type 7 e:\cache_dbv\sat_all_v1\
Так что это на 100% битый кэш. К тому же, ещё и с мусором, судя по сообщениям: Bad CRC32 value и Bad magic value
Но пока остаётся открытым вопрос, почему эврика не ловит все эти ошибки, что прилетают от либы и пишутся в лог. Возможно стоит переименовать тикет и посвятить его обработке ошибок Эврикой. |
|
|
|
>исключения как такового ещё и нету. А мы вдруг просим эврику показать
Если это про EBerkeleyDBEureka.Create, то это можно полечить добавлением проверки типа
if (ExceptObject <> nil) and not (ExceptObject is EAbort) then
вокруг
ShowLastExceptionData.
Это исключит вызов запуска эврики вне фрейма текущего исключения. |
|
|
(0012075)
|
zed
|
15-07-2013 14:05
|
|
>if (ExceptObject <> nil)
Так в противном случае и эврика ничего не должна показать. Даже без этой проверки.
У нас ситуация такая:
15-07-2013 11:01:11.073 Error [BerkeleyDB Value]: Bad CRC32 value: 0x1CB62836
15-07-2013 11:01:51.595 BerkeleyDB: z17\39\23\156.93.sdbv page 186094 is on free list with type 7 e:\cache_dbv\sat_all_v1\
т.е. вначале был нармальный эксепшен в САС, который Эврика не словила, затем прилетела ошибка из библиотеки, в результате чего создалось исключение EBerkeleyDBEureka и показало на предыдущий эксепшен (Bad CRC32 value). |
|
|
|
>в противном случае и эврика ничего не должна показать
Что-то мне не удалось найти, что помешает вызвать ExceptNotify.
Стек-то развернуть дело нехитрое.
А проверка там вида
if ((not Initialized) or (IsAParent(Obj, EAbort))) then
Exit; |
|
|
|
raise EBerkeleyDBExeption.Create(EMsg);
except
ShowLastExceptionData;
Хм. Знаешь, что будет в эврике при исключении в конструкторе EBerkeleyDBExeption (например при нехватке памяти)? |
|
|
(0012078)
|
zed
|
15-07-2013 14:25
|
|
Не знаю. А ты знаешь как ещё нормально сгенерировать исключение, чтобы оно попало в Эврику? В твоём случае, при ошибке в либе вида BerkeleyDB: z17\39\23\156.93.sdbv page 186094 is on free list with type 7 e:\cache_dbv\sat_all_v1\ Эврика всё равно промолчит. |
|
|
|
>знаешь как ещё нормально сгенерировать исключение
Не знаю ((( |
|
|
|
Но меня напрягает, что строка с BerkeleyDB:выглядит не как строка исключения. |
|
|
(0012081)
|
zed
|
15-07-2013 14:43
|
|
Ну так это и не исключение, а простое сообщение. "BerkeleyDB" это Error Prefix, который подсказывает, что ошибка в файле БД. Задаётся вручную в коде. Там ещё есть и "BerkeleyDB Env" - будет отсвечивать при ошибках в энвайронминте. |
|
|
(0012082)
|
zed
|
15-07-2013 14:46
|
|
К примеру есть такая ситуация:
15-07-2013 16:07:19.302 BerkeleyDB: file z8\0\0\0.0.sdbv has LSN 42/1241061, past end of log at 1/28 d:\coding\delphi\src\sas.planet\sas.planet.src\.bin\cache_dbv\sat\
15-07-2013 16:07:19.304 EBerkeleyDBExeption: BerkeleyDB: file z8\0\0\0.0.sdbv has LSN 42/1241061, past end of log at 1/28 d:\coding\delphi\src\sas.planet\sas.planet.src\.bin\cache_dbv\sat\
15-07-2013 16:07:19.307 EBerkeleyDBExeption: EBerkeleyDBExeption: BerkeleyDB: file z8\0\0\0.0.sdbv has LSN 42/1241061, past end of log at 1/28 d:\coding\delphi\src\sas.planet\sas.planet.src\.bin\cache_dbv\sat\
15-07-2013 16:07:19.310 EAssertionFailed: Assertion failure (D:\coding\Delphi\src\SAS.Planet\sas.planet.src\TileStorage\BerkeleyDB\u_BerkeleyDBPool.pas, line 187)
Эврика сообщила только про ассерт :(
Причём, меня ешё напрягает, что там один эксепшен словило 2 раза (3-я строка). |
|
|
|
>так это и не исключение, а простое сообщение
А зачем ты тогда хочешь его в эврику пропихнуть? И как?
>меня ешё напрягает, что там один эксепшен словило 2 раза
Это просто reraise в стеке, как раз никаких проблем с этим нет. |
|
|
(0012092)
|
zed
|
16-07-2013 04:55
|
|
>>так это и не исключение, а простое сообщение
>А зачем ты тогда хочешь его в эврику пропихнуть? И как?
Нужно сгенерировать исключение с этим сообщением, чтобы Эврика выкинула юзеру своё окошко и показало ошибку. После таких ошибок кэш уже всё-равно не рабочий и все манипуляции с ним из САСа нужно аварийно завершать. Сейчас же, это сообщение быстро мелькает на тайлах, изображение "застывает", и выкидывается EAssertionFailed. После этого юзер приходит в багтрекер с этим или подобным ассертом, с уверенностью, что проблема в САС, хотя на самом деле проблема в кэше и первое сообщение об этом чётко говорит. |
|
|
(0012096)
|
zed
|
16-07-2013 05:20
|
|
О, похоже мои вчерашние изменения не прошли даром. В тикете 0002018 лежит elf сгенерированный из-за аналогичной ошибки, но там уже верный стек и юзер увидел правильное сообщение. |
|
|
|
>После таких ошибок кэш уже всё-равно не рабочий
Почему? Это какая-то нештатная ошибка?
Например, в БД нарушение первичного ключа (xyzv) или даже если просто текст запроса неверно написать, не приводит к порче данных и падению базы.
А тут почему? Из-за одновременного доступа из разных потоков или процессов? |
|
|
(0012107)
|
zed
|
16-07-2013 12:13
|
|
Тут если БД ругается через вызов CallBack функции, означает фатальную ошибку. Для других ошибок, не фатальных, у функций read/write и прочих предусмотрен код возврата.
>А тут почему? Из-за одновременного доступа из разных потоков или процессов?
Где именно "тут"? В приведенном выше сообщении я специально удалил папку env на тестовом кэше, чтобы оно ругнулось. Проблемы Garl с "page 186094 is on free list with type 7" пока не ясно из-за чего. Многопоточность тут по-идее никак не должна влиять, бо я там засинхронизировал все вызовы по самое ни хочу. |
|
|
|
>вызов CallBack функции, означает фатальную ошибку
Понял. |
|