проблема целостности данных с ntfs, но не с ext3

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

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

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

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

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

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

Любая идея, что происходит, и почему это происходит именно так?

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

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


person puffadder    schedule 16.07.2011    source источник
comment
Вы пытались повторно открыть файл в первом потоке в режиме перезаписи? Кроме того, как вы читаете данные из файла 1 в потоке 2, вы снова открываете файл?   -  person Asad Rasheed    schedule 16.07.2011
comment
Вы используете ntfs-3g или драйвер ntfs в ядре?   -  person bdonlan    schedule 16.07.2011
comment
@Asad: Нет, я не открываю файл повторно, я просто перематываю (fp). Я попробую ваше предложение. @Bdonlan: я использую встроенный драйвер ntfs tuxera (коммерческий)   -  person puffadder    schedule 17.07.2011
comment
Я не знаком с драйвером Tuxera, но это похоже на ошибку конкретной реализации NTFS, которую вы используете. Проблема с SSD — это своего рода подсказка. Мы бы очень внимательно рассмотрели это, если бы это было в драйвере Microsoft NTFS.   -  person jrtipton    schedule 04.10.2011


Ответы (1)


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

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

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

person puffadder    schedule 10.10.2011