проблема целостности данных с NTFS, но не Ext3 - PullRequest
1 голос
/ 16 июля 2011

В моем приложении я постоянно записываю данные в file1 и сбрасываю их на устройство. В другом потоке я читаю данные из file1 и записываю их в file2 .

Каждый раз, когда я делаю fwrite + fflush в файле1, я даю сигнал другому потоку начать чтение из него. Другой поток читает данные из файла file1 и выгружает их в файл file2. Довольно простая логика. Кроме того, через каждые несколько минут я возвращаюсь к началу файла1 и начинаю перезаписывать старые данные.

Теперь моя проблема состоит в том, что, как только я начинаю перезаписывать данные в file1 , данные, считанные в file2, иногда старые данные (т.е. данные, записанные в предыдущей итерации), даже если пишущий поток сообщил, что записал новые данные (и сбросил их).

Я пишу и читаю с твердотельного накопителя (128 ГБ SAMSUNG серии 470, если это помогает) на [C + linux + arm platfrom]. Я чувствую, что есть проблема с кэшем процессора. Возможно, запись поступает в кэш, а чтение потоком считывателя происходит из флэш-памяти и, следовательно, устаревших данных.

Проблема в том, что эта проблема возникает, если SSD отформатирован с NTFS. Если я отформатирую его с помощью ext3, проблема исчезнет. К сожалению, NTFS является жестким требованием. Другое интересное наблюдение состоит в том, что если у меня есть два потока чтения, оба получают устаревшие данные в разные моменты времени.

Событие после отключения кэша записи SSD (с hdparm -W0 / dev / sda1 ), я получаю ту же проблему с NTFS. Я плохо зацикливаюсь на этом больше недели.

Есть идеи, что происходит, и почему так происходит?

Любая помощь будет на вес золота ...

EDIT Оказывается, что драйвер NTFS не любит, когда я перезаписываю файл, перематывая указатель файла. Это известная вещь?

1 Ответ

0 голосов
/ 10 октября 2011

Хорошо, я нашел проблему сам (и как редко это происходит !!!).

Я обнаружил, что существует проблема с буферизацией библиотеки C (fread / fwrite).Поэтому я делаю fflush () перед каждым fread ().Это решает мою проблему (я не знаю, что именно пошло не так с драйвером, но я предполагаю, что существует некоторая проблема с буферизацией «чтения» функций ввода-вывода библиотеки C при чтении из того же места файлавторой раз).

Спасибо @Asad Rasheed и @jrtipton за ваш вклад:)

...