Любая причина для вызова fsync перед вызовом fstat
У меня есть часть устаревшего кода, который вызывает вызов fsync
перед звонком в fstat
определить размер файла целевого файла. (в частности, код обращается только к st_size из структуры stat.)
Посмотрев документы, я не думаю, что это необходимый вызов, но я хотел получить мнение эксперта.
1 ответ
На правильно реализованной файловой системе, вызывая fsync
или же fdatasync
не должен влиять на результат любого последующего stat
/ fstat
/ lstat
вызов. Единственный эффект должен заключаться в том, что любые незаполненные записи и, в случае fsync
любые измененные метаданные передаются в постоянное хранилище. stat
и его варианты будут отлично работать с кэшированными записями, независимо от того, были ли реальные данные переданы в постоянное хранилище или нет.
Что сказал, будь fstat
требуется в фрагменте кода, который вы изучаете, это вопрос семантики и зависит от того, как результат fstat
используется. Например:
Если он используется из-за неправильного представления, что
fsync
должен быть вызван, чтобы иметь возможность получить текущие метаданные сstat
, то вы, вероятно, можете удалить его.Если он используется, например, для записи каких-либо данных контрольных точек, то это не является абсолютно неактуальным, хотя порядок вызовов может потребоваться изменить - для растущего файла данные контрольных точек должны указывать части файла, которые, безусловно, сделали его постоянное хранилище, поэтому было бы целесообразно позвонить
fstat
затем позвонитеfsync
* а затем напишите информацию о контрольной точке.Если он используется в качестве своего рода монитора хода выполнения пользовательского интерфейса для связанной операции ввода-вывода, может иметь смысл отобразить объем данных, который фактически был передан на диск. В этом случае, однако, точность монитора не критична, поэтому порядок вызовов может не иметь большого значения.
Итак, каков результат fstat
используется в вашем случае?
Отказ от ответственности: там могут быть реализации файловой системы, например, сетевые / распределенные, где вызов fsync
может обновить кэш метаданных локального клиента для файла. В этом случае это fsync
Вызов действительно может повысить надежность кода. Если это так, то у вас, вероятно, проблемы хуже, чем просто небольшая проблема с производительностью...