Можно ли проверить данные нескольких последовательных записей, просто проверив последние n записанных байтов?
Просто чтобы прояснить, мои вопросы не зависят от языка / ОС (независимы).
Я работаю над программой (поддерживающей множество ОС, в настоящее время написанной на Golang), которая получает много фрагментов данных (например, поток фрагментов данных) и последовательно записывает все это в заранее заданную позицию (pos >= 0) в файл. Только 1 процесс с 1 потоком, обращающимся к файлу. Я использую обычную функцию записи, которая использует системный вызов write (который зависит от операционной системы, в которой она работает), а не буферизованный ввод-вывод.
Предполагается, что во время записи моей программы внезапно произошел сбой системы (наиболее серьезный вид сбоя: сбой питания).
Когда система снова включается, мне нужно проверить, сколько чанков полностью записано на жесткий диск. (*)
Жесткий диск, на который пишет моя программа, сегодня является обычным жестким диском для настольного компьютера или ноутбука (не какой-нибудь необычный (с батарейным питанием), который можно найти на некоторых высокопроизводительных серверах).
Предполагается, что повреждение битов при переносе и чтении с жесткого диска очень маловероятно и незначительно.
Мои вопросы:
- Нужно ли делать контрольную сумму для всех записанных кусков, чтобы проверить (*)?
Или мне просто нужно проверить и подтвердить, что n-ный блок корректен, и предположить, что все фрагменты перед ним (0 -> n-1) тоже верны?
2.1 Если 2. достаточно, значит ли это, что порядок последовательной записи гарантированно будет сохраняться ФС любой ОС (хотя произвольные записи все же можно переупорядочить)?
- Использует ли мой способ восстановления тот же принцип, что и для файла журнала, доступного только для добавления, который используется во многих защищенных от сбоев базах данных?
1 ответ
Я подозреваю, что вам лучше всего изучать циклические проверки на избыточность (CRC).
Насколько я понимаю, CRC позволит вам проверить, что на самом деле было написано.
Я также предполагаю, что беспокоиться о причине каких-либо ошибок не очень стоит (ошибки передачи по сравнению с ошибками по любой другой причине, такой как сбой питания).
Надеюсь это поможет.