Любая причина для вызова fsync перед вызовом fstat

У меня есть часть устаревшего кода, который вызывает вызов fsync перед звонком в fstat определить размер файла целевого файла. (в частности, код обращается только к st_size из структуры stat.)

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

1 ответ

Решение

На правильно реализованной файловой системе, вызывая fsync или же fdatasync не должен влиять на результат любого последующего stat / fstat / lstat вызов. Единственный эффект должен заключаться в том, что любые незаполненные записи и, в случае fsync любые измененные метаданные передаются в постоянное хранилище. stat и его варианты будут отлично работать с кэшированными записями, независимо от того, были ли реальные данные переданы в постоянное хранилище или нет.

Что сказал, будь fstat требуется в фрагменте кода, который вы изучаете, это вопрос семантики и зависит от того, как результат fstat используется. Например:

  • Если он используется из-за неправильного представления, что fsync должен быть вызван, чтобы иметь возможность получить текущие метаданные с stat, то вы, вероятно, можете удалить его.

  • Если он используется, например, для записи каких-либо данных контрольных точек, то это не является абсолютно неактуальным, хотя порядок вызовов может потребоваться изменить - для растущего файла данные контрольных точек должны указывать части файла, которые, безусловно, сделали его постоянное хранилище, поэтому было бы целесообразно позвонить fstat затем позвоните fsync * а затем напишите информацию о контрольной точке.

  • Если он используется в качестве своего рода монитора хода выполнения пользовательского интерфейса для связанной операции ввода-вывода, может иметь смысл отобразить объем данных, который фактически был передан на диск. В этом случае, однако, точность монитора не критична, поэтому порядок вызовов может не иметь большого значения.

Итак, каков результат fstat используется в вашем случае?

Отказ от ответственности: там могут быть реализации файловой системы, например, сетевые / распределенные, где вызов fsync может обновить кэш метаданных локального клиента для файла. В этом случае это fsync Вызов действительно может повысить надежность кода. Если это так, то у вас, вероятно, проблемы хуже, чем просто небольшая проблема с производительностью...

Другие вопросы по тегам