powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++: атомарно записать в файл 128MB.
41 сообщений из 41, показаны все 2 страниц
C++: атомарно записать в файл 128MB.
    #39306852
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть файл 512MB, хочется атомарно дописать туда 128MB. Атомарно - значит что после
Код: plaintext
1.
write(fd, buff, 128MB);


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

Дописать - не значит обязательно в конец и не значит, что одним последовательным куском. Можно заранее выделять в файле место и манипулировать страницами внутри. Как в любой файловой системе (fat32, ext3, ext4, другое) определить параметры атомарной записи? Вмысле, с какого смещения и сколько байт в файл записать, чтобы это гарантированно было атомарно? Например, предполагаю, что со смещений кратных 4096 писать размер блока 4096 - вполне атомарно для современных дисков с сектором 4096 байт, ибо файловая система кладёт файлы выравнивая их по секторам.

Обсудите сабж. Предложите простейшую структуру данных в файле и алгоритм для обеспечения сего.
P.S. Знаю про double buffering например, который вроде бы в InnoDB юзается: пишем последовательность страниц в этот буфер, делаем fsync(), потом поднявшись после падения достаём из этого буфера что там есть и распихиваем по месту назначения, делая fsync и очищая потом временный буфер. Но вопрос о размере атомарного блока остаётся.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306861
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedЕсть файл 512MB, хочется атомарно дописать туда 128MB.
Если так, то просто создай новый файл MyFile.tmp, запиши туда все с изменениями, затем переименуй старый в MyFile.bak, а этот на его место.

Если писать в один и тот же файл, то предусмотри секцию где будут указаны места файла находящиеся в процессе записи, т.е. перед записью туда пишешь меняю там и там, в конце записи убирай, тогда при открытии файла, прочитав эту секцию, увидишь что было недописано.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reciprocated, при данной постановке это невозможно. Ты просто можешь параллельно
вести журнал атомарных операций. Например

Код: plaintext
1.
2016-09-09 20:05:00 Begin write.....



И при следующем ребуте детектировать факт потери 128 Mb. И предпринять какие-то действия
по восстановлению. Пойти в веб или в БД и снова что-то выбрать или инициировать заново
процесс калькуляций.

Второй вариант. Если ты когда-либ работал с БД то там есть WAL (Write-Ahead-Log) или Redo-Log,
и в нем будет вся история операций с начала консистентного старта системы. Но в случае с БД
эти самые 128 Мб с неба не упали а были продуктом частичных более мелких транзакций и следовательно
уже имеются в истории. И никуда они не потеряются. (По крайней мере dba в это верят).

Но если ты счастливый обладатель дисковых хранилищ или каких-то хитрых псевдо-сетевых дисков
то возможно шансы потерять инфу с С++ у тебя минимальны. Главное чтоб кусок в 128 Мб успешно улетел
в сеть до отключения power. Но это уже не С++ а совершенно другие области знаний. И здесь
я-бы послушал предложения специалистов в этой области.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306868
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо это уже не С++ а совершенно другие области знаний. И здесь
я-бы послушал предложения специалистов в этой области.
ИМХУ если инфа важная, то УПС с обратной связью, который не даст неожиданно вырубится, а плавно выключит комп. Цена вопроса небольшая 3-5 т.р.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306879
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если упало питание - это кранты. никакие программные примочки тебе не помогут. только если файл создать новый, потом перименовать. так поступают базы данных.
сама файловая система после ткого збоя будет востанавливать данные. то есть ты не можешь такого гарантировать даже на нулевом кольце.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306883
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedКак в любой файловой системе (fat32, ext3, ext4, другое) определить параметры атомарной
записи?

Никак, обломись. Для журналируемых систем есть соответствующие API, но для каждой - своё
отдельное. Для остальных - просто обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306887
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reciprocatedво время которого упало питание, сдох процесс и т.п. я обнаруживаю файл в неком консистентном состоянии в том смысле, что отличаю внутри этого файла блоки с полезными данными от блоков с мусором.File Management Functions https://msdn.microsoft.com/en-US/library/windows/desktop/aa364232(v=vs.85).aspx

См. все что связано с transacted operation.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306890
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovReciprocatedКак в любой файловой системе (fat32, ext3, ext4, другое) определить параметры атомарной
записи?

Никак, обломись. Для журналируемых систем есть соответствующие API, но для каждой - своё
отдельное. Для остальных - просто обломись.

Мне не нужны функции журналируемой ФС.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306891
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alternatives to using Transactional NTFS https://msdn.microsoft.com/en-us/library/windows/desktop/hh802690(v=vs.85).aspx

" It allows for Windows developers to have transactional atomicity for file operations in transactions with a single file, in transactions involving multiple files, ..."
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306892
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black если упало питание - это кранты. никакие программные примочки тебе не помогут. только если файл создать новый, потом перименовать. так поступают базы данных.
сама файловая система после ткого збоя будет востанавливать данные. то есть ты не можешь такого гарантировать даже на нулевом кольце.
Мужики-то не знали... особенно такие мужики:
- которые сделали диски, дописывающие кеши после отрубания питалова
- которые придумали WAL
- которые придумали double buffering

Как же тогда работают журналы в журналируемых ФС, сохраняя структуру этих ФС после всех отрубаний питалова.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306894
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Alternatives to using Transactional NTFS https://msdn.microsoft.com/en-us/library/windows/desktop/hh802690(v=vs.85).aspx

" It allows for Windows developers to have transactional atomicity for file operations in transactions with a single file, in transactions involving multiple files, ..."
Маркетинг буллшит. Не переходить же на другую ФС, если можно просто узнать размер блока и юзать fsync().
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306896
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedМне не нужны функции журналируемой ФС.

Тогда не выпендривайся и используй атомарный rename. Или обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306897
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.

Текущее простое и сердитое решение, которое вроде бы это гарантирует.
Кто считает, что не гарантирует - скажите конкретно где и почему.

запись
- хотим дописать 76 кб данных
- добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним.
- вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним
- дописываем наши данные
- вызываем fsync()

чтение после сбоя
1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306898
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovReciprocatedМне не нужны функции журналируемой ФС.

Тогда не выпендривайся и используй атомарный rename. Или обломись.

Чё-то ты не можешь отличить журнал ФС от журнала моего файла...
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306901
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНе переходить же на другую ФС, если можно просто узнать размер блока и юзать fsync().Какую ОС и файловую систему используете?
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306904
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovReciprocatedМне не нужны функции журналируемой ФС.

Тогда не выпендривайся и используй атомарный rename. Или обломись.

+1

Тема не относится к С++ и к конструктивному обсуждению.

Предлагаю автора с темой вернуть в ПТ.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306905
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglDimitry Sibiryakovпропущено...

Тогда не выпендривайся и используй атомарный rename. Или обломись.

+1

Тема не относится к С++ и к конструктивному обсуждению.

Предлагаю автора с темой вернуть в ПТ.
К С++ не относится, C++ тут как кейворд привлечения пытливых умов, ибо толпы тусующиеся вокруг других ключевых слов менее вероятно чё-нибудь дельное напишут.

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нечестно обсуждать такую тему в С++. Пускай все участники сообщества тоже включаются.

Перенес в Программинг
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306911
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новая версия алгоритма.

запись
- пример: хотим добавить 76 кб данных
- добавляем в конец файла header фиксированного размера, в который пишем hash данных + размер данных (76*1024). Можно записать hash этого header прямо перед ним самим
- дописываем наши данные (76 kb payload)
- вызываем fsync() - как барьер памяти. Порядок записи header1 и data1 неважен, лишь бы отделить эту пару от header2 и data2.

чтение после сбоя
1. Открываем файл сначала и последовательно проверяем: если очередной header в неадеквате (файл кончился раньше размера header (он фиксир.), hash header-a не совпало) — считаем всё пространство файла начиная с header-а далее пустым. Потеряем только 1 запись, ведь в середине ничего не переписывали.
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их hash не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306918
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ReciprocatedНовая версия алгоритма.

запись
- пример: хотим добавить 76 кб данных
- добавляем в конец файла header фиксированного размера, в который пишем hash данных + размер данных (76*1024). Можно записать hash этого header прямо перед ним самим
- дописываем наши данные (76 kb payload)
- вызываем fsync() - как барьер памяти. Порядок записи header1 и data1 неважен, лишь бы отделить эту пару от header2 и data2.

чтение после сбоя
1. Открываем файл сначала и последовательно проверяем: если очередной header в неадеквате (файл кончился раньше размера header (он фиксир.), hash header-a не совпало) — считаем всё пространство файла начиная с header-а далее пустым. Потеряем только 1 запись, ведь в середине ничего не переписывали.
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их hash не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
1. Должно работать. Если файл увеличен заранее - выделены кластеры и замаплены на сектора, то и ошибок файловой системы не должно быть.
2. Почему не std::fstream::flush ?
3. И что стало в условияем? "Дописать - не значит обязательно в конец и не значит, что одним последовательным куском."
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306927
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинReciprocatedНовая версия алгоритма.

запись
- пример: хотим добавить 76 кб данных
- добавляем в конец файла header фиксированного размера, в который пишем hash данных + размер данных (76*1024). Можно записать hash этого header прямо перед ним самим
- дописываем наши данные (76 kb payload)
- вызываем fsync() - как барьер памяти. Порядок записи header1 и data1 неважен, лишь бы отделить эту пару от header2 и data2.

чтение после сбоя
1. Открываем файл сначала и последовательно проверяем: если очередной header в неадеквате (файл кончился раньше размера header (он фиксир.), hash header-a не совпало) — считаем всё пространство файла начиная с header-а далее пустым. Потеряем только 1 запись, ведь в середине ничего не переписывали.
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их hash не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
1. Должно работать. Если файл увеличен заранее - выделены кластеры и замаплены на сектора, то и ошибок файловой системы не должно быть.
2. Почему не std::fstream::flush ?
3. И что стало в условияем? "Дописать - не значит обязательно в конец и не значит, что одним последовательным куском."
1. Ok. Полезно выделить заранее кусман...
2. Не знал про такое, не важно как именно fsync() дёрнуть
3. Это не условие, а дозволение - оно есть по-прежнему.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306931
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ReciprocatedВася Уткинпропущено...

1. Должно работать. Если файл увеличен заранее - выделены кластеры и замаплены на сектора, то и ошибок файловой системы не должно быть.
2. Почему не std::fstream::flush ?
3. И что стало в условияем? "Дописать - не значит обязательно в конец и не значит, что одним последовательным куском."
1. Ok. Полезно выделить заранее кусман...
2. Не знал про такое, не важно как именно fsync() дёрнуть
3. Это не условие, а дозволение - оно есть по-прежнему.
1. Ошибки ФС могут быть только при изменении размера файла, при условии, что сжатие в ФС отключено.
2. Возможно понадобятся оба: обязательно OS fsync() и возможно C++ flush() : http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641
Например, так: http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream
3. А тут надо уточнить, "не значит обязательно в конец" - это значит перезаписывать середину, или сначала сдвигать все последующие блоки, а затем писать в свободную середину?
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306933
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reciprocated, 19649369 , 19649465 классная штука и должна работать, а на ntfs можно заюзать и файловые потоки.

Только теперь нужно подумать как "атомарно" увеличить размер файла и как "атомарно" записать header.

--
А может просто после каждой небольшой порции писать этот header(ECC,CRC).
О, а диски у себя в патрохах так и делают!

Так что rename.bak и/или write.log очень даже ФС независимо.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306939
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMReciprocated, 19649369 , 19649465 классная штука и должна работать, а на ntfs можно заюзать и файловые потоки.

Только теперь нужно подумать как "атомарно" увеличить размер файла и как "атомарно" записать header.

--
А может просто после каждой небольшой порции писать этот header(ECC,CRC).
О, а диски у себя в патрохах так и делают!

Так что rename.bak и/или write.log очень даже ФС независимо.
Атомарно размер файла увеличивать не надо.
Атомарно записывать header не надо.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306940
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинReciprocatedпропущено...

1. Ok. Полезно выделить заранее кусман...
2. Не знал про такое, не важно как именно fsync() дёрнуть
3. Это не условие, а дозволение - оно есть по-прежнему.
1. Ошибки ФС могут быть только при изменении размера файла, при условии, что сжатие в ФС отключено.
2. Возможно понадобятся оба: обязательно OS fsync() и возможно C++ flush() : http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641
Например, так: http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream
3. А тут надо уточнить, "не значит обязательно в конец" - это значит перезаписывать середину, или сначала сдвигать все последующие блоки, а затем писать в свободную середину?
1. Ок
2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит
3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306942
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.

Текущее простое и сердитое решение, которое вроде бы это гарантирует.
Кто считает, что не гарантирует - скажите конкретно где и почему.

запись
- хотим дописать 76 кб данных
- добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним.
- вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним
- дописываем наши данные
- вызываем fsync()

чтение после сбоя
1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306944
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedВася Уткинпропущено...

1. Ошибки ФС могут быть только при изменении размера файла, при условии, что сжатие в ФС отключено.
2. Возможно понадобятся оба: обязательно OS fsync() и возможно C++ flush() : http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641] http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync/2340641#2340641
Например, так: http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream] http://stackoverflow.com/questions/676787/how-to-do-fsync-on-an-ofstream
3. А тут надо уточнить, "не значит обязательно в конец" - это значит перезаписывать середину, или сначала сдвигать все последующие блоки, а затем писать в свободную середину?
1. Ок
2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит
3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть.
ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306945
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или скажем

1 создаем доп файл, записываем в него размер файла, в кот нужно писать
2 пишем в файл
3 удаляем доп. файл

после сбоя
1 если доп файла нет то все ок
2 если доп выйл есть то не все ок, ок тоько столько байт сколько записано в доп файле
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306952
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.

Текущее простое и сердитое решение, которое вроде бы это гарантирует.
Кто считает, что не гарантирует - скажите конкретно где и почему.

запись
- хотим дописать 76 кб данных
- добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним.
- вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним
- дописываем наши данные
- вызываем fsync()

чтение после сбоя
1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым
2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header
можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306953
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

1. Ок
2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит
3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть.
ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
Хедер кусок кала - это описано в предусмотрениях.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306956
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...

можно тупо размер файла хранить где-то дополнительно
скажем в заголовке файла или в отдельном месте
после записи куска данных в файл апдейтить этот размер
что <= размера то в консистентном состоянии
что > размера -- это кусок кала
Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные.



ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306957
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные.



ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
Всё. Теперь понял.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306958
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...

ниче не решило
твой хеадер может теоретичнски являться куском кала
просто у них структура чудесным образом совпала
Хедер кусок кала - это описано в предусмотрениях.

ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306959
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...




ну так и есть же, вроде все правильно
кусок данных в файле до size -- валидный
или ты нам че-то недоговариваешь
Всё. Теперь понял.

если у тебя не абстрактный файл а какой-то свой,
я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306968
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

Хедер кусок кала - это описано в предусмотрениях.

ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306969
Фотография Reciprocated
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Новый ГодReciprocatedпропущено...

Всё. Теперь понял.

если у тебя не абстрактный файл а какой-то свой,
я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных
Головой seek-ать дорого по времени.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306974
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...


ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.

уу какая штука
прям лог с историей

тогда можно сделать еще так
ты не дописывай в конец файла каждый раз
а делай всегда новый файл

а потом можно просто написать merge utility
и собирать куски данных оффлайн
из многих файлов в один
чтоб уменшить колво файлов
в ней можно удалять дублирующиеся или ненужные данные

а когда читаешь -- читай из всех файлов в определенном порядке

иногда у тебя будет запускаться процесс, который собирае данные из всех файлов в один
а ненудные файлы удаляет
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39306987
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНовый Годпропущено...


ты его с какого-то перепуга в конец пишешь а потом данные
как после сбоя ты определяешь по какому смещению у тебя header?
Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307201
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилReciprocatedпропущено...

Header предваряет каждую запись. Header-ов в файле много.
Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла).
Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку.
Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать
без разницы, куда хеш писать, в хедер или в футер

мне эта структура больше транзакшн лог напоминает, чем хранилище данных
ну да, хрен с ним, его можно консолидировать время от времени, работать будет
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307347
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reciprocated,
формируется новый файл, потом старый подменяемся новым путем удаления старого и переименования нового. почти атомарно.
...
Рейтинг: 0 / 0
C++: атомарно записать в файл 128MB.
    #39307350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим.
ИМХУ ты журнал транзакций изобретаешь. Возьми документацию по какой-нибудь СУБД (MSSQL, SQLite, Postgre и т.д.) и почитай как там проблема решена. Для всех СУБД эта проблема актуальна.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C++: атомарно записать в файл 128MB.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]