|
А кто как организует в своих программах контроль завершённости, транзакции обновления базы данных |
|
|
|
Mar 27 2008, 14:02
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(Aesthete Animus @ Mar 27 2008, 16:52)  Что-то я плохо понял суть вопроса И хорошо.. Кто "в теме" - тот поймёт.. А от тех кто не "в теме" мне ответы не нужны
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 27 2008, 14:16
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(Непомнящий Евгений @ Mar 27 2008, 17:12)  При записи самый неактуальный пакет перетирается. Если при этом произошла ошибка - то при последующем чтении CRC пакета будет неверное и система будет считать, что тут "пусто"; данные будут прочитаны из последнего актуального пакета. При следующей записи такой неудачный пакет будет затерт новым. Вот примерно так... А где же тут "откат"? Т.е. возврат к предыдущемц "хорошему" состоянию в случае если произошёл аборт во время записи и запись была сорвана (например, питалово вырубили)?
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 27 2008, 14:58
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Вот тут: Цитата Если при этом произошла ошибка - то при последующем чтении CRC пакета будет неверное и система будет считать, что тут "пусто"; данные будут прочитаны из последнего актуального пакета.
|
|
|
|
|
Mar 27 2008, 23:28
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(galjoen @ Mar 27 2008, 20:45)  Видимо в EEPROM всё таки какие-то блоки 8 байтные имеются. Да нет наверное.... Это скорей всего потому у Вас 8-ми байтный блок объFFевился потому что у Вас "пакеты" в EEPROM по 8 байт, т.е. потому что Вы пишите в EEPROM 8-ми байтными блоками
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 28 2008, 03:15
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Вот я думаю, что для возможности восстановления повреждённой записи базы данных, разрушенной по причине незавершённости транзакции, вызванной отключением питания нужно хранить каждую запись в 4-х экземплярах. Потому что если хранить в 3-х то не будет возможности восстановить запись методом мажоритарного голосования.
Рассмотрим пример с 3-мя копиями и объяснение почему 3-х копий не хватает.
Допустим мы обновляем запись в базе данных во внутренней FLASH (или EEPROM) микроконтроллера. Одну копию записи успеваем обновить полностью, а вот на середине обновления 2-й копии транзакция прерывается выключением питания.
В результате мы имеем: 1-я копия обновлена полностью 2-я копия обновлена наполовину 3-копия вообще НЕ обновлена
Как быть? Мажоритарным голосованием восстановить не получиться, т.е. у нас нет хотя бы 2-х одинаковых копий записи - все 3 копии различны. А вот если бы у нас было 4 копии, то мы бы смогли "откатить" запись на основании значений записи для 3-й и 4-й записи. А если бы, допустим, транзакция была бы прервана на середине не 2-й , а 3-й копии, то тогда мы смогли бы даже не откатывать запись, а продолжить и завершить транзакцию, взяв данные совпадающих между собой 1-й и 2-й копий
Сообщение отредактировал Дон Амброзио - Mar 28 2008, 03:34
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 28 2008, 05:17
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(galjoen @ Mar 27 2008, 20:45)  Только у меня не "флаг актуальности", а счётчик (2 байта). У кого он больше, тот пакет и последний. На самом деле достаточно одного бита. Актуальный пакет находится "по переходу". Пример: Код Пакеты П1 П2 П3 Флаг 1 1 0 Актуальный - П2
Пакеты П1 П2 П3 Флаг 1 1 1 Актуальный - П3
Пакеты П1 П2 П3 Флаг 0 1 1 Актуальный - П1
и т.д. В вашем случае получается примерно также, но вместо 1 бита вы храните 2 байта. Однако счетчик вероятно все равно может перескочить через 0 и вы получите тоже, что и у меня... Цитата(Дон Амброзио @ Mar 28 2008, 06:15)  Вот я думаю, что для возможности восстановления повреждённой записи базы данных, разрушенной по причине незавершённости транзакции, [...] У меня (см пример выше) П1, П2 и П3 - это НЕ КОПИИ. Это разные версии информации одного типа. Для верхнего примера П3 - самая младшая версия (из имеющихся), затем П1, затем П2 - актуальная версия. Когда мне придется сохранить информацию в очередной раз, пакет П3 будет затерт. Пусть при этом произошел сбой. Это значит, что я потерял самую старую версию информации (которая мне уже все равно не нужна). При следующем чтении будет прочитан П2, а П3 определен как "пустой". Для такой схемы нужно как минимум 2 "слота" под однотипный пакет. Чем больше "слотов" тем сильнее "размазывается" ресурс епрома (и тем медленее происходит определение актуального пакета)
|
|
|
|
|
Mar 28 2008, 06:28
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(blackbit @ Mar 28 2008, 09:06)  Не поверите - одним битом. Черным.  Сколько не пытались потом выбить прибор на ходу, в момент обновления firmware или базы данных, ни у кого не получилось. Ни у своих, ни у чужих. Вероятность "слёта" (т.е. случайного изменения) бита 50% (слетит или не слетит).. Так что ИМХО это ненадёжная защита...
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 28 2008, 08:31
|

Знающий
   
Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544

|
Цитата 50% (слетит или не слетит).. Т.е. как у той блондинки. - Какова вероятность, что вы встретите динозавра на улице? -50 на 50. Или всречу, или нет. Заливаем в ЕЕПРОМ данные хоть блоками по 1, хоть по 256 байт. Затем дожидаемся подтверждения, что данный блок успешно "лег" в ЕЕПРОМ. После этого шлем следующий блок данных. Если в течении нескольких итераций блок данных не попадает адресату, то значит нелады с получателем. Всё. Тревожная ситуация. Какой смысл дальше "орать" в пустоту? Далее понятно.
|
|
|
|
|
Mar 28 2008, 19:56
|

Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241

|
Цитата(galjoen @ Mar 27 2008, 20:45)  Пользую примерно такой-же способ как 'Непомнящий Евгений'. Только у меня не "флаг актуальности", а счётчик (2 байта). У кого он больше, тот пакет и последний. Ещё по теме хочу сказать, что длина пакета в EEPROM д.б. кратна 8 и начинаться он должен с адреса кратного 8. Я к такому выводу пришёл, когда у меня 8 байт в EEPROM объFFились. Видимо в EEPROM всё таки какие-то блоки 8 байтные имеются. У меня тоже счётчик. Надо сказать с ним есть непределённость определённая... Вобщем или кодов для счёта будет БОЛЬШЕ числа страниц flash для перезаписи. Или нельзя сказать чётко какая последняя. С битом -- это по-моему бред. Как там последнюю найти? Только если не удалять сразу неактуальные записи. Я вот не удаляю, стираю только при записи. А дописываю как есть по кругу (есть пул flash-страниц для циклической перезаписи). Да, когда у меня было всего 2 страницы в другом приборе, там было 2 БИТА. Ибо по 1 биту нифига непонятно кто последний в таком случае. А так есть серия номеров последовательно с разрывом (зацикленность опускаем), соответственно тот что перед разрывом -- последний. Поэтому номеров и БОЛЬШЕ должно быть чем страниц. Да, про неопределённость. Это когда разрывов в нумерации больше одного. Тут хоть по rand() выбирай нужный блок...
Сообщение отредактировал Kirill Frolov - Mar 28 2008, 20:07
--------------------
[ZX]
|
|
|
|
|
Mar 29 2008, 10:06
|

Частый гость
 
Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241

|
Цитата(Непомнящий Евгений @ Mar 29 2008, 11:47)  см разобранный пример выше. Записи никогда не удаляю. Самая старая просто перетирается, когда надо записать новую. 5 раз смотрел, ничего не понял. Я знаю, что для кодировании информации выбора одного из N надо минимум log2(N)+1 битов. А тут ерунда какая-то. Напиши какие значения этого бита у 9 последовательных записей. (т.е. чистый флеш, записали раз, записали два...) Сколько кстати блоков флеша? Не больше 8-и? Если это работает, значит старые записи таки переписываются, хотя бы этот бит сбрасывается.
--------------------
[ZX]
|
|
|
|
|
Mar 29 2008, 10:17
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Чистая эмпирика: 1. Блоки данных с CRC16 в конце прекрасно самосинхронизируются при фиксированной длине блока. Таким образом, достаточно отследить последний правильный кадр методом скользящего CRC. 2. При overlapping-записи в память никаких проблем не наблюдается, если длина записываемого блока нечетная (ессно, при четном размере свободного пространства памяти  , и наоборот ). Ой, поправлюсь - если размер памяти не кратен длине блока. Судите сами - последний блок никогда не уложится в верхнюю границу, и не надо никаких дополнительных условий для того, чтобы продолжить сканировать память сначала. Может, несколько тормознуто (всегда полное сканирование), зато без признаков искусственного интеллекта. Девайс никогда не захватит весь мир.
|
|
|
|
|
Mar 29 2008, 12:49
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Kirill Frolov @ Mar 29 2008, 13:06)  Напиши какие значения этого бита у 9 последовательных записей. (т.е. чистый флеш, записали раз, записали два...) Сколько кстати блоков флеша? Не больше 8-и? Если это работает, значит старые записи таки переписываются, хотя бы этот бит сбрасывается. Блоков ("слотов") - теоретически сколько угодно. Я обычно делаю не больше 5. Пример (обозначение: ПS(F), где S - номер слота, F - флаг. П2(1) - пакет во втором слоте, флаг = 1) Код 0. Начальное состояние: пусто - все слоты пусты (т.е. у каждого неверная CRC) 1. Пишем 1-й пакет: П1(1) пусто ..... 2. Пишем 2-й пакет П1(1) П2(1) пусто ....... ... 9. Пишем 9-й пакет: П1(1) П2(1) ......... П8(1) П9(1) 10. Пишем 10-й пакет: П1(0) П2(1) ......... П8(1) П9(1) 11. Пишем 11-й пакет: П1(0) П2(0) П3(1) ......... П8(1) П9(1) ... 18. Пишем 18-й пакет: П1(0) П2(0) .... П8(0) П9(0) 19. Пишем 19-й пакет: П1(1) П2(0) ..... П9(0) и т.д. Чтобы определить актуальный пакет, ищем первый переход 0-1 или 1-0. Если нашли - то пакет слева от перехода и будет актуальным (случай 10 - актуален П1, 11 - П2, 19 - П1) Если не нашли - актуален последний пакет (случаи 1-9, 18). PS Насчет теории информации - лень доказывать, но интуитивно - для этого примера у тебя есть 9 информационных бит (частично зависимых между собой), а не 1. Причем не совсем бит - флаг может быть 1, 0 или НЕВЕРЕН (у пакета с неправильной CRC). Т.е. получается соответствие: 1 НЕВЕРЕН ... НЕВЕРЕН = 1-й пакет ... 1 1 1 1 .. 1 = последний пакет 0 0 1 ... 1 = 2-й пакет и т.д.
|
|
|
|
|
Mar 30 2008, 14:00
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(Igor26 @ Mar 28 2008, 12:31)  Затем дожидаемся подтверждения, что данный блок успешно "лег" в ЕЕПРОМ. От кого? От кого "дожидаемся подтверждения"? Цитата(Kirill Frolov @ Mar 29 2008, 14:06)  5 раз смотрел, ничего не понял. Аналогично.. Галиматья какая-то
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
|
Mar 30 2008, 14:32
|

Местный
  
Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947

|
Цитата(oran-be @ Mar 30 2008, 18:13)  В случае облома в любом месте будет известно, что типа данных во флеше нет, либо они не валидны.. А как же откат?
--------------------
После устранения бага в программе она стала работать....хуже
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|