Безопасная запись части файлового алгоритма (запись атомарной части) - PullRequest
0 голосов
/ 07 февраля 2019

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

Он имеет только две функции:

  1. write_chunk (index, bytes)
  2. read_chunk (index)

Где 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. Мы возвращаем ok функции вызывающей функции.

Чтение реализации функции:

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

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

Безопасен ли я по следующему алгоритму?

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

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

1 Ответ

0 голосов
/ 08 февраля 2019

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

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

...