Безопасная запись части файлового алгоритма (запись атомарной части)

Предположим, я хочу написать простую базу данных (работа на Linux), которая должна удовлетворять следующим условиям:

У него только две функции:

  1. write_chunk (индекс, байты)
  2. read_chunk (индекс)

Где index - целое число от 0 до 1M, а байты - чанк 100 байтов. Я хочу, чтобы состояния файлов передавались атомарно после каждого вызова write_chunk.

Так что я хочу быть уверен:

  1. Блок из 100 байтов записывает в файл с индексом позиции *100
  2. Все 100 байтов пишутся атомарно (или не пишутся вообще)
  3. Если внезапное отключение происходит при записи (предыдущие действительные 100 байт восстановлены)

Я воображаю реализации, как это:

Напишите реализацию функции:

  1. Перед тем, как начать запись 100 байтов, мы копируем предыдущие 100 байтов из индекса позиции *100 в другой файл для отката (индекс также копируется). также мы подписываем все данные файла отката хешем. Сделайте fsync при откате.
  2. Затем мы начинаем писать новые 100 байтов с индексом позиции *100, делаем fsync.
  3. Если шаг 2 в порядке, мы удаляем все данные из файла отката.
  4. Мы возвращаем нормально функцию вызывающего абонента.

Прочитать реализацию функции:

  1. Если мы начинаем чтение и откат файла не пустым и действительным, мы восстанавливаем 100 байт из отката и удаляем откат или просто удаляем откат, если хеш недействителен.

  2. Мы читаем чанк из индекса позиции *100 и возвращаем данные

Я в безопасности с помощью следующего алгоритма?

Поэтому я хочу быть уверен, что я на том же уровне безопасности, что и базы данных, такие как mysql или postgresql, выполняющие вставку после фиксации.

Какую технику я могу использовать, чтобы гарантировать атомарную и долговременную запись, я имею в виду, может быть, мне нужно использовать хеширование на чанке, чтобы убедиться, что он действительный, или использовать двойную копию файла отката. Или сохраняйте данные в файле отката немного позже, чтобы обеспечить очистку дисковых подсистем. (Я слышал, что я не безопасен, даже если я вызываю fsync после записи, это зависит от подсистемы диска, тогда он физически записывает данные).

1 ответ

Это должно работать, пока у вас нет параллелизма, то есть только одна из этих функций может запускаться одновременно.

Почему бы вам не использовать простую встроенную базу данных?

Другие вопросы по тегам