The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Атомарная замена 'файлов'"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Разное)
Изначальное сообщение [ Отслеживать ]

"Атомарная замена 'файлов'"  +/
Сообщение от Аноним (0), 16-Дек-24, 06:07 
... по-видимому невозможна в Linux.

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

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

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

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

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

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от Аноним (1), 17-Дек-24, 11:59   +/
Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному имени на другой. Для любых разумных применений этого хватает. Проблемы только у гениев, которым хочется в ту же самую айноду резко положить другое содержимое. Где у вас есть такие возможности, там и процветайте, собственно.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #2

2. Сообщение от pavel_simple. (?), 17-Дек-24, 12:51   +/
> Какой-то бред ламерский. Хардлинк позволяет предельно атомарно заменить файл по указанному
> имени на другой. Для любых разумных применений этого хватает. Проблемы только
> у гениев, которым хочется в ту же самую айноду резко положить
> другое содержимое. Где у вас есть такие возможности, там и процветайте,
> собственно.

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #3

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #5

4. Сообщение от ACCA (ok), 17-Дек-24, 21:35   +/
Конечно невозможно. Такое только в однозадачных системах бывает.
"Замена насрана" может быть в памяти другого процесса.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #7

5. Сообщение от Аноним (5), 18-Дек-24, 09:44   +/
> только не рассказывайте ему про sighup

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #6

6. Сообщение от DeerFriend (?), 18-Дек-24, 11:50   +/
> без соответствующего обработчика

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

7. Сообщение от Аноним (7), 19-Дек-24, 16:57   +/
Это временно.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #9

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

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

Ответить | Правка | Наверх | Cообщить модератору

9. Сообщение от ACCA (ok), 28-Дек-24, 07:04   +/
Угу. Всё время, пока оба процесса меряются временем обновления.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру