/ / O fsync de um diretório pai garante a sincronização de metadados de todos os subdiretórios recursivos? - android, linux, nativo, ext4, fsync

O fsync de um diretório pai garante a sincronização de metadados de todos os subdiretórios recursivos? - android, linux, nativo, ext4, fsync

Atualmente estou escrevendo um aplicativo Android que precisa trabalhar com muitos arquivos no lado nativo.

Recentemente, tive vários problemas de perda de dados ou inconsistência ao atualizar ou renomear esses arquivos. (Todos esses arquivos são armazenados em vários subdiretórios de um diretório pai / raiz comum).

Depois de ler vários artigos sobre o fsync (), decidi usá-lo. No entanto, eu tinha uma coisa incerta:

A chamada de fsync () em um diretório pai garante a sincronização de metadados de todos os subdiretórios, recursivamente?

Ou seja, digamos que eu faça muitas operações de renomeação de vários arquivos em subdiretórios diferentes dentro de um diretório pai comum.

Então eu deveria chamar fsync () em cada subdiretórioseparadamente ou chamando fsync () no meu diretório pai é o suficiente para garantir que os metadados de todos os subdiretórios (e seus diretórios filhos recursivamente) estejam sincronizados com o dispositivo físico?

Basicamente, a ideia é economizar tempo evitandovárias chamadas fsync (). Ou levaria mais tempo para o fsync () em um diretório de nível superior comparado ao fsync () em cada subdiretório individual? (Assumindo fysnc () no diretório de nível superior sincroniza todos os metadados do subdiretório)

Respostas:

2 para resposta № 1

Quando o fsync é chamado em um diretório, a operaçãotrata seu alvo mais como um arquivo do que um contêiner de arquivos. Da perspectiva do sistema de arquivos, um diretório é um tipo especial de arquivo que contém metadados sobre outros arquivos.Quando o fsync é aplicado a um diretório, esses metadados sobre os arquivos contidos são sincronizados, mas não os próprios subdiretórios / arquivos.

Se você quiser garantir que todo o conteúdo esteja devidamente sincronizado, você deve fsync explicitamente.