Переписывает небольшой файл atom на ext4?

Предположим, что у нас есть файл FILE_SIZE bytes и:

  • FILE_SIZE <= min(page_size, physical_block_size);
  • размер файла никогда не изменяется (т.е. truncate() или append write() никогда не выполняются);
  • файл изменяется только путем полной перезаписи его содержимого, используя:

    pwrite(fd, buf, FILE_SIZE, 0);
    

На ext4 гарантируется, что:

  • Такие записи являются атомарными относительно параллельных чтений?
  • Такие записи являются транзакционными в отношении сбоя системы?

    (т.е. после сбоя содержимое файла полностью из предыдущей записи, и мы никогда не увидим частичный файл записи или пустой файл)

Является ли второе истиной:

  • с data=ordered?
  • с data=journal или, альтернативно, с возможностью ведения журнала для одного файла?

    (используя ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL))

  • когда physical_block_size < FILE_SIZE <= page_size?


Я нашел связанный вопрос, который связывает обсуждение с 2011 года. Однако

  • Я не нашел явного ответа на мой вопрос 2.
  • Интересно, если это верно, то он документирован где-то?
+3
источник поделиться
2 ответа

Из моего эксперимента он не был атомарным.

В основном мой эксперимент состоял в том, чтобы иметь два процесса: один писатель и один читатель. Писатель пишет в файл в цикле, и читатель читает из файла

Процесс записи:

char buf[][18] = {
    "xxxxxxxxxxxxxxxx",
    "yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
   pwrite(fd, buf[i], 18, 0);
   i = (i + 1) % 2;
}

Процесс чтения

while(1) {
    pread(fd, readbuf, 18, 0);
    //check if readbuf is either buf[0] or buf[1]
}

Через некоторое время для запуска обоих процессов я мог видеть, что readbuf является либо xxxxxxxxxxxxxxxxyy, либо yyyyyyyyyyyyyyyyxx.

Итак, это окончательно показывает, что записи не являются атомарными. В моем случае записи в 16 байт всегда были атомарными.

Ответ был: POSIX не ограничивает атомарность для записи/чтения, кроме труб. 16-байтовая атомарность, которую я видел, была специфичной для ядра и может/может измениться в будущем.

Подробности ответа в фактическом сообщении: написать (2)/прочитать (2) атомарность процессов в Linux

+4
источник

Я знаком с теорией о файловых системах вообще, а не с внедрением Ext4. Возьмите это как образованное предположение.

Да, я считаю, что один сектор читает и пишет будет атомарным, потому что

  • Ссылка, предоставленная вами quotes "В настоящее время одновременные чтения/записи являются атомарными только по отдельным страницам, но не находятся в системном вызове."
  • Запись в секторе диска (512 байт) - это атомный согласно Стивену Твиди. В частном письме с ним он признал, что эта гарантия не хуже, чем аппаратное обеспечение.
  • Внешние файловые системы перезаписывают данные на месте, без копирования при записи. Нет распределения.
  • несколько усилий для внедрения встроенных данных, очень маленькие файлы могут вставляться в сам дескриптор. Если вам нужно хранить только несколько байтов, это может повлиять.

Не уверен, что на одной странице, но в режиме полного журналирования мало смысла отправлять меньше, чем страница в журнал до совершения.

+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос