URL: https://www.opennet.dev/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10482
[ Назад ]

Исходное сообщение
"Атомарная замена 'файлов'"

Отправлено Аноним , 16-Дек-24 06:07 
... по-видимому невозможна в Linux.

Требования: транзакционность. Два разрешённых состояния:
* есть оригинальный файл, нет замены нигде
* есть замена в нужном месте, оригинального файла нет

Два запрещённых:
* есть оригинальный файл, замена насрана где-то
* нет ни оригинала, ни замены

Обычный файл вы можете создать с флагом O_TMPFILE (временный файл, не пишущийся в журнал), а потом попробовать атомарно заменить через renameat2(..., RENAME_EXCHANGE), но файлы в /proc/self/fd - это симлинки, и renameat2 в них не умеет. Можно, конечно, попробовать поиграться с readlink, но он вам выдаст несуществующий путь.

Hardlink - не умеет заменять файлы, флаг AT_REPLACE так и не был добавлен.

Директория/симлинк: вы не можете ни создать их с заменой, ни создать их файлы через open с флагом O_TMPFILE, и потом тип поменять. Сами же вызовы для их создания флаги не поддерживают.

Складывается впечатление, что так сделано намеренно, чтобы с race conditions дел не иметь.


Содержание

Сообщения в этом обсуждении
"Атомарная замена 'файлов'"
Отправлено Аноним , 17-Дек-24 11:59 
Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному имени на другой. Для любых разумных применений этого хватает. Проблемы только у гениев, которым хочется в ту же самую айноду резко положить другое содержимое. Где у вас есть такие возможности, там и процветайте, собственно.

"Атомарная замена 'файлов'"
Отправлено pavel_simple. , 17-Дек-24 12:51 
> Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному
> имени на другой. Для любых разумных применений этого хватает. Проблемы только
> у гениев, которым хочется в ту же самую айноду резко положить
> другое содержимое. Где у вас есть такие возможности, там и процветайте,
> собственно.

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


"Атомарная замена 'файлов'"
Отправлено DeerFriend , 17-Дек-24 18:02 
>> Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному
>> имени на другой. Для любых разумных применений этого хватает. Проблемы только
>> у гениев, которым хочется в ту же самую айноду резко положить
>> другое содержимое. Где у вас есть такие возможности, там и процветайте,
>> собственно.
> Вася хочет, не файл заменить атомарно(для чего нужные сисколы есть), а заменить
> для работающего процесса открытый файл. Ну, я так понял, но этот
> поток бреда сложно однозначно понять

только не рассказывайте ему про sighup


"Атомарная замена 'файлов'"
Отправлено Аноним , 18-Дек-24 09:44 
> только не рассказывайте ему про sighup

но тебе-то можно рассказать, что sighup без соответствующего обработчика не работает?


"Атомарная замена 'файлов'"
Отправлено DeerFriend , 18-Дек-24 11:50 
> без соответствующего обработчика

проблема разработчика


"Атомарная замена 'файлов'"
Отправлено ACCA , 17-Дек-24 21:35 
Конечно невозможно. Такое только в однозадачных системах бывает.
"Замена насрана" может быть в памяти другого процесса.

"Атомарная замена 'файлов'"
Отправлено Аноним , 19-Дек-24 16:57 
Это временно.

"Атомарная замена 'файлов'"
Отправлено ACCA , 28-Дек-24 07:04 
Угу. Всё время, пока оба процесса меряются временем обновления.

"Атомарная замена 'файлов'"
Отправлено Tron is Whistling , 25-Дек-24 12:08 
"Обычный файл вы можете создать с флагом O_TMPFILE (временный файл, не пишущийся в журнал), а потом попробовать атомарно заменить через renameat2"

Это уже нарушение второй группы условий (одновременно насрана замена и есть оригинал).
Вердикт - кривые входные условия, транзакционности нескольких операций в ФС действительно нет.