Запись или сброс файла в асинхронную NFS с помощью c++ ofstreams

У нас есть проект, в котором несколько узлов последовательно записывают данные в файл, а файл находится в NFS.

Раньше мы использовали синхронную NFS, поэтому сброс в файловые потоки работал нормально. Теперь у нас есть асинхронная NFS, и она не работает. Очевидно, что не работает в некотором смысле кэширование, и другие узлы не видят изменений, внесенных конкретным узлом.

Я хотел знать, есть ли способ принудительно сбросить данные из кеша на диск. Я знаю, что это неэффективно, но это заставит все работать, пока мы не получим реальное решение.


person rkb    schedule 22.10.2014    source источник
comment
ofstream понятия не имеет о базовой файловой системе. Возможно, поможет системный вызов sync(2). Но он синхронизирует все незавершенные буферы файлов.   -  person Oncaphillis    schedule 22.10.2014
comment
Я предполагаю, что вызов flush() приведет к базовому вызову fsync() или ioctl(). Может быть, запустить strace, чтобы убедиться, что это так? Если да, то возможно sync()? Если нет, возможно, получить дескриптор файла от rdbuf() и явно вызвать fsync() или ioctl()?   -  person Jason    schedule 23.10.2014


Ответы (1)


У меня была аналогичная проблема с использованием NFS с VxWorks. После некоторых экспериментов я нашел способ надежно сбросить данные на устройство:

int fd;
fd = open("/ata0a/test.dat", O_RDWR | O_CREATE);
write(fd, "Hallo", 5);
/* data is having a great time in some buffers... */
ioctl(fd, FIOSYNC, 0);   // <-- may last quite a while...
/* data is flushed to file */

Я никогда не работал с потоками и не знаю, предоставляет ли ваша ОС что-то похожее на код, показанный выше...

Но можно попробовать просто закрыть файл. Это приведет к очистке всех буферов. Но имейте в виду, что между закрытием файла и сбросом всех данных может пройти некоторое время, которое ваше приложение не видит, поскольку вызов «закрыть» может вернуться до того, как данные будут записаны. Кроме того, это создает много накладных расходов, поскольку впоследствии вам придется повторно открывать файл.

Если это не вариант, вы также можете написать столько «фиктивных данных» после ваших данных, чтобы буферы заполнялись. Это также приведет к записи данных в файл. Но это может занять много места на диске в зависимости от размера ваших данных.

person Lukas Thomsen    schedule 22.10.2014