Estou tentando usar bloqueios flock () / BSD para bloquear arquivos usados em vários clientes, mas os arquivos ficam corrompidos. Por quê? A. Os bloqueios flock () / BSD atuam apenas localmente nos clientes Linux NFS anteriores à 2.6.12. Use bloqueios fcntl () / POSIX para garantir que os bloqueios de arquivo sejam visíveis para outros clientes.
Aqui estão algumas maneiras de serializar o acesso a um arquivo NFS.
Use a API de bloqueio fcntl () / POSIX. Esse tipo de bloqueio fornece bloqueio de intervalo de bytes em vários clientes via protocolo NLM ou NFSv4. Use um arquivo de bloqueio separado e crie links físicos para ele. Veja a descrição na seção O_EXCL da página do manual creat (2). Vale ressaltar que até o início do kernels 2.6, o O_EXCL cria não era atômico nos clientes Linux NFS. Não use O_EXCL cria e espera comportamento atômico entre vários clientes NFS, a menos que você esteja executando um kernel mais recente que o 2.6.5.
É um problema conhecido que o Perl usa o bloqueio flock () / BSD por padrão. Isso pode interromper programas portados de outros sistemas operacionais, como o Solaris, que esperam que os bloqueios flock / BSD funcionem como bloqueios POSIX.
No Linux, o uso do bloqueio de arquivos em vez de um link físico tem o benefício adicional de verificar o cache do cliente com o servidor. Quando um bloqueio de arquivo é adquirido, o cliente limpa o cache da página desse arquivo para que quaisquer leituras subsequentes obtenham novos dados do servidor. Quando um bloqueio de arquivo é liberado, qualquer alteração no arquivo desse cliente é liberada novamente no servidor antes que o bloqueio seja liberado, para que outros clientes que aguardam o bloqueio do arquivo possam ver as alterações.
O cliente NFS na 2.6.12 fornece suporte para bloqueios flock () / BSD em arquivos NFS, emulando os bloqueios no estilo BSD em termos de bloqueios de intervalo de bytes POSIX. Outros clientes NFS que usam o mesmo mecanismo de emulação ou que usam bloqueios fcntl () / POSIX, verão os mesmos bloqueios que o cliente NFS Linux vê.
Nos sistemas de arquivos Linux locais, os bloqueios POSIX e BSD são invisíveis um para o outro. Portanto, devido a essa emulação, os aplicativos em execução em um servidor NFS Linux ainda verão os arquivos bloqueados pelos clientes NFS como bloqueados com um bloqueio fcntl () / POSIX, independentemente de o aplicativo no cliente estar usando um estilo BSD ou um POSIX- bloqueio de estilo. Se o aplicativo do servidor usar bloqueios flock () BSD, ele não verá os bloqueios usados pelos clientes NFS.