Então, o que a especificação NFSv3 diz, é basicamente para as duas operações de dados NFS a seguir
- Operação WRITE com o conjunto de bits estável
- COMMIT
o servidor tem permissão para retornar sucesso ao cliente somente depois que os dados atingirem o armazenamento estável. Isto é o que o servidor Linux NFS implementa com a opção de exportação "sync" padrão. Com "assíncrono", o servidor pode enganar e retornar sucesso, mesmo que os dados não estejam em armazenamento estável.
Ou seja, o problema de corrupção potencial com async é basicamente algo ao longo do seguinte
- O servidor retorna sucesso para uma operação WRITE ou COMMIT
- O cliente vê o sucesso e, em algum momento, exclui as páginas de seu próprio cache (por que desperdiçar espaço mantendo-as por aí, já que elas já estão no armazenamento do servidor, pensa)
- O servidor trava, perdendo, assim, os dados que não foram confirmados no armazenamento estável
- O cliente se reconecta ao servidor, mas como não há registro de quais dados foram gravados ou não, não é possível saber exatamente quais dados foram perdidos.
Agora, o último ponto é o mais sério, pois não há como saber quais dados foram perdidos / corrompidos ou não.
OTOH, se o cliente falhar, qualquer dado sujo no cache do cliente (que não tenha sido liberado) será perdido, mas o programador do cliente pode contorná-lo (ou seja, somente após fsync () ou close () retornar sucesso pode o programador assumir que os dados estão em armazenamento estável).