LINUX.ORG.RU

Видимость файла, ещё не записанного физически на носитель

 , , ,


0

2

Ситуация такая - один процесс записал файл и закрыл его вызовом close(), который завершился без ошибок. Гарантирует ли это, что другой процесс на этом же компьютере (запущенный под этой же ОС, если учитывать всякие виртуализации) сразу же может открыть этот файл и увидеть его полное содержимое? Допустим, файл ещё не записался физически на диск или удалённый сетевой сторедж, а находится пока в кэше файловой системы? Регламентирован ли этот момент в каких-нибудь стандартах, POSIX например? Как ведёт себя ведро? Что насчёт аналогичного поведения других ОС?

★★★★★

Дурацкий вопрос. В нормальных ФС гарантирует

niemand
()

Поидее тебе нужно сделать flush. Но я не знаток.

powerguy ★★★
()

ЕМНИП, close включает в себя flush, а тот блокируется и не передает управление обратно, пока данные не запишутся.

sambist ★★
()
Ответ на: комментарий от sambist

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

Harald ★★★★★
() автор топика
Ответ на: комментарий от Harald

Если уже на на диске, значит еще в буфере ядра. Другому процессу дадут прозрачно читать из этого буфера с актуальными данными.

Shadow1251
()

для этого и нужны в файловой системе файлы чтобы их можно было бы открывать и читать.

а если *бы* не было *бы* гарании (я записал и закрыл файл, а появится ли он теперь? или нужно подождать? но сколько тогда ждать?) — то нафиг нужна тогда такая файловая система? и как ей пользоваться?

вообще твой вопрос — очень похож на мой вопрос — операция «открыть файл или создать его» — является ли атомарной и консистентной? :-)

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)

Допустим, файл ещё не записался физически на диск

а хули тогда клоуз вызывать? иди, проспись.

darkenshvein ★★★★★
()
Ответ на: комментарий от darkenshvein

чтоб дескриптор освободить, для чего ж ещё )

Harald ★★★★★
() автор топика

Вопрос на самом деле хороший. И всё вроде должно быть хорошо! Но по-факту НЕТ!

Проверить легко. Берёшь, копируешь образ qcow2 машины. Как только cp завершает работу, тут же поднимаешь виртуалку со свежескопированного образа - результат меня не обрадовал... Всё битое нахрен.... - Повтоярешь операцию. Делаешь sync. - Всё ок.

DALDON ★★★★★
()
Последнее исправление: DALDON (всего исправлений: 1)

Регламентирован ли этот момент в каких-нибудь стандартах, POSIX например?

http://linux.die.net/man/3/write

This manual page is part of the POSIX Programmer's Manual

Writes can be serialized with respect to other reads and writes. If a read() of file data can be proven (by any means) to occur after a write() of the data, it must reflect that write(), even if the calls are made by different processes. A similar requirement applies to multiple write operations to the same file position. This is needed to guarantee the propagation of data from write() calls to subsequent read() calls. This requirement is particularly significant for networked file systems, where some caching schemes violate these semantics.

Хотя хз, конечно, как это все пересекается с реальностью

Deleted
()
Ответ на: комментарий от niemand

Да. Linux. Я попробую может сделать примерно такое: md5sum image.qcow2 ; cp image.qcow2{,.copy} ; md5sum image.qcow2.copy

Будет интересно? :)

DALDON ★★★★★
()
Ответ на: комментарий от DALDON

Берёшь, копируешь образ qcow2 машины. Как только cp завершает работу

операция копирования может быть реализована отложенным методом, т.е. процесс копирования ещё идет, но команда cp уже отработала. так раньше работало копирование на флешку - т.е. копировалось практически мгновенно, но если её вытащить, то файл был коррапнут.

vtVitus ★★★★★
()
Ответ на: комментарий от DALDON

Т.е. есть, реально cp, может быть не адекватным примером?

В данной теме да. У топик стартера проблема не в том, что данные не записались на диск (это в мане по close четко сказано, что close не гарантирует физическую записи на диск), а в том что возможно ли чтение данных из буфера linux/кеша диска в ситуации, когда данные ещё на записались.

Ответ вроде как да - если даже данные ещё не на физическом диске, то они будут читаться из буффера, но доказательств у меня нема :). Я бы на всякий случай звал синхронизацию, если это сильно критично.

vtVitus ★★★★★
()
Ответ на: комментарий от DALDON

Да не. Предсказываю проблемы тебе в будущем с ZFS на линуксе. Могу тоже самое сделать на фре для прикола с большим файлом

niemand
()
Ответ на: комментарий от DALDON

Тут речь о том, что cp не гарантирует наличие данных на диске при возврате, но во внутренних буферах (ядра, vfs, ФС модуля) они будут

niemand
()
Ответ на: комментарий от DALDON

Как и говорил, в FreeBSD всё ок.

dd if=/dev/random of=lol bs=1m count=5000 && md5 lol && cp lol lol2 && md5 lol2

Вернула одинаковые циферки. Шли им багрепорт, а лучше вали с линукса, пока данные не потерял.

niemand
()
Ответ на: комментарий от vtVitus

Я бы на всякий случай звал синхронизацию, если это сильно критично.

Кстати, согласно POSIX sync запускает синхронизацию, но может вернуться до её окончания. Так что это тоже не даст гарантию, что данные будут на диске по окончании.

Но видны они будут всегда и сразу, иначе такую ФС можно выкидывать в помойку.

niemand
()
Ответ на: комментарий от niemand

Кхм... Попробовал на zfs:

time dd if=/dev/urandom of=lol bs=1M count=5000 && md5sum lol && cp lol lol2 && md5sum lol2
5000+0 записей получено
5000+0 записей отправлено
скопировано 5242880000 байт (5,2 GB), 297,356 c, 17,6 MB/c

real	4m57.398s
user	0m0.007s
sys	4m57.433s
32b898830b8cfd4817d62b872e0fa0a7  lol
32b898830b8cfd4817d62b872e0fa0a7  lol2
DALDON ★★★★★
()
Ответ на: комментарий от niemand

У VirtualBox производительность CPU ниже на 35% процентов по сравнению с нативной производительностью (тестировал сам, кучей способов, везде показывается стабильное отставание, я сжимал архивы, копировал большие файлы, и т.п.). У KVM не более 10. Разница ОЧЕНЬ, ОЧЕНЬ большая в продакшене. Я правда использую VB в продакшене, доволен, на очень простых задачах, на что-то серьёзное - увы, не годно.

DALDON ★★★★★
()
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

Полусырую zfs в линуксе вы тоже используете «в продакшене»? У меня игрушки виндовые в VirtualBox идут, поэтому я доволен

niemand
()
Ответ на: комментарий от niemand

Вопрос в том, какие собственно идут игрушки? :) Полусырая zfs в linux? Пока я не гоняю её в жёстком продакшене (но 300 гб ценной инфы уже доверил), но у меня продакшен очень слабый, хайлоада нету. Но в целом - гоняю. Пока всё работает.

DALDON ★★★★★
()
Ответ на: комментарий от sambist

close включает в себя flush, а тот блокируется и не передает управление обратно, пока данные не запишутся

flush передаёт данные в ОС, а для записи на диск нужен sync или fsync

anonymous
()

Системный дисковый кеш не делится на приложения. Не важно произошла ли запись на диск или нет.

anonymous
()
Ответ на: комментарий от DALDON

Полусырая zfs в linux?

А нет что ли? В FreeBSD я ей доверил хомяк с 2 ТБ ценного прона, но это в FreeBSD.

Вопрос в том, какие собственно идут игрушки?

От Valve (все халвы, портал), Мор (Утопия), Might and Magic, вангеры. Ну и что-то ещё. Не идут Периметр и готика, например

niemand
()
Ответ на: комментарий от niemand

VB умеет уже 3D полноценное? Больно крутые игры идут у тебя...

Ну VB, слишком медленнен в плане CPU, а в целом - система прекрасная, у меня там машинки в продакшене годами бегают, в том числе фряха.

Пока не могу ничего ужасного сказать про zfs в linux, я тоже был скептиком, меня тут на ЛОРе знающие люди обучили её пользовать. :)

DALDON ★★★★★
()
Ответ на: комментарий от niemand

Ну в общем они не бросили эту затею. Молодцы коль так!

DALDON ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.