|
|
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим. Текущее простое и сердитое решение, которое вроде бы это гарантирует. Кто считает, что не гарантирует - скажите конкретно где и почему. запись - хотим дописать 76 кб данных - добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним. - вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним - дописываем наши данные - вызываем fsync() чтение после сбоя 1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым 2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header можно тупо размер файла хранить где-то дополнительно скажем в заголовке файла или в отдельном месте после записи куска данных в файл апдейтить этот размер что <= размера то в консистентном состоянии что > размера -- это кусок кала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:26 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
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 решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть. ниче не решило твой хеадер может теоретичнски являться куском кала просто у них структура чудесным образом совпала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:29 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
или скажем 1 создаем доп файл, записываем в него размер файла, в кот нужно писать 2 пишем в файл 3 удаляем доп. файл после сбоя 1 если доп файла нет то все ок 2 если доп выйл есть то не все ок, ок тоько столько байт сколько записано в доп файле ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:36 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Новый ГодReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим. Текущее простое и сердитое решение, которое вроде бы это гарантирует. Кто считает, что не гарантирует - скажите конкретно где и почему. запись - хотим дописать 76 кб данных - добавляем в конец файла header постоянного размера, в который пишем hash данных + размер данных (76*1024) + hash самого header перед ним. - вызываем fsync() -- это как барьер памяти, не позволяющий переупорядочить операции записи перед ним и за ним - дописываем наши данные - вызываем fsync() чтение после сбоя 1. если header в неадеквате (файл кончился раньше размера header (он фиксир.), hash хидера не совпало) - считаем всё пространство файла далее пустым 2. если header вменяем, но в файле осталось меньше данных чем сказано в header или данных хватило, но их HASH не совпал с указанным в header - пункт (1) - считаем файл пустым, начиная с начала header можно тупо размер файла хранить где-то дополнительно скажем в заголовке файла или в отдельном месте после записи куска данных в файл апдейтить этот размер что <= размера то в консистентном состоянии что > размера -- это кусок кала Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:55 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Новый ГодReciprocatedпропущено... 1. Ок 2. Я не юзаю промежуточных буферов, сразу отправляю данные OS через ::write(), мне одного fsync() хватит 3. Не понял что вы хотите, если задача успешно вроде бы решена. Как хотите - можете поставить себе задачу придумать такую структуру данных и алгоритм, которые работают через запись в середину, тогда и разгребайте грабли сами и описывайте алгоритм. Решение с дописыванием в конец header + data решило задачу, я обошёлся без необходимости что-то ворочать в середине. Но если очень хочется - условия это не запрещают. Лишь бы новые данные каким-то образом консистентно добавились в хранилище без утечки "дисковой памяти" и с возможностью половинчатые записи потом увидеть. ниче не решило твой хеадер может теоретичнски являться куском кала просто у них структура чудесным образом совпала Хедер кусок кала - это описано в предусмотрениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:55 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНовый Годпропущено... можно тупо размер файла хранить где-то дополнительно скажем в заголовке файла или в отдельном месте после записи куска данных в файл апдейтить этот размер что <= размера то в консистентном состоянии что > размера -- это кусок кала Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные. ну так и есть же, вроде все правильно кусок данных в файле до size -- валидный или ты нам че-то недоговариваешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 00:59 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Новый ГодReciprocatedпропущено... Хотелось бы кализировать только не записавшуюся часть файла, а не все ранее накопленные данные. ну так и есть же, вроде все правильно кусок данных в файле до size -- валидный или ты нам че-то недоговариваешь Всё. Теперь понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 01:04 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНовый Годпропущено... ниче не решило твой хеадер может теоретичнски являться куском кала просто у них структура чудесным образом совпала Хедер кусок кала - это описано в предусмотрениях. ты его с какого-то перепуга в конец пишешь а потом данные как после сбоя ты определяешь по какому смещению у тебя header? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 01:04 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНовый Годпропущено... ну так и есть же, вроде все правильно кусок данных в файле до size -- валидный или ты нам че-то недоговариваешь Всё. Теперь понял. если у тебя не абстрактный файл а какой-то свой, я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 01:07 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Новый ГодReciprocatedпропущено... Хедер кусок кала - это описано в предусмотрениях. ты его с какого-то перепуга в конец пишешь а потом данные как после сбоя ты определяешь по какому смещению у тебя header? Header предваряет каждую запись. Header-ов в файле много. Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла). Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 02:18 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Новый ГодReciprocatedпропущено... Всё. Теперь понял. если у тебя не абстрактный файл а какой-то свой, я бы заголовок в начале сделал, и в нем поле с последним валидным размером данных Головой seek-ать дорого по времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 02:18 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНовый Годпропущено... ты его с какого-то перепуга в конец пишешь а потом данные как после сбоя ты определяешь по какому смещению у тебя header? Header предваряет каждую запись. Header-ов в файле много. Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла). Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку. уу какая штука прям лог с историей тогда можно сделать еще так ты не дописывай в конец файла каждый раз а делай всегда новый файл а потом можно просто написать merge utility и собирать куски данных оффлайн из многих файлов в один чтоб уменшить колво файлов в ней можно удалять дублирующиеся или ненужные данные а когда читаешь -- читай из всех файлов в определенном порядке иногда у тебя будет запускаться процесс, который собирае данные из всех файлов в один а ненудные файлы удаляет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 02:43 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНовый Годпропущено... ты его с какого-то перепуга в конец пишешь а потом данные как после сбоя ты определяешь по какому смещению у тебя header? Header предваряет каждую запись. Header-ов в файле много. Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла). Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку. Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2016, 09:09 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ИзопропилReciprocatedпропущено... Header предваряет каждую запись. Header-ов в файле много. Открываю файл с начала и пробегаю до последнего валидного header (или до конца файла). Файл как лента стриммерная. Шашлык из валидных записей. Как только попался горелый кусок мяса - остальное фтопку. Футер ещё добавь в каждую запись с каким-нибудь хэшем, чтоб при разрушении файловой системы не пострадать без разницы, куда хеш писать, в хедер или в футер мне эта структура больше транзакшн лог напоминает, чем хранилище данных ну да, хрен с ним, его можно консолидировать время от времени, работать будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2016, 14:45 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
Reciprocated, формируется новый файл, потом старый подменяемся новым путем удаления старого и переименования нового. почти атомарно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2016, 06:22 |
|
||
|
C++: атомарно записать в файл 128MB.
|
|||
|---|---|---|---|
|
#18+
ReciprocatedНапоминаю задачу: нет задачи гарантированно записать данные. Есть задача оставить файл в консистентном состоянии, т.е. можно записать кусок кала, но при поднятии достать все старые данные и понять, что этот кусок является плохим. ИМХУ ты журнал транзакций изобретаешь. Возьми документацию по какой-нибудь СУБД (MSSQL, SQLite, Postgre и т.д.) и почитай как там проблема решена. Для всех СУБД эта проблема актуальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2016, 06:53 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39306952&tid=1340615]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 220ms |
| total: | 402ms |

| 0 / 0 |
