La documentation Perl 5.x indique que son implémentation de flock (..) utilisera l'un des appels natifs suivants, commençant à 1 et progressant vers 3 s'il n'est pas disponible:
- troupeau (2)
- fcntl (2)
- lockf (3)
C'est très bien. Cependant, vous avez peut-être remarqué leur exclusion de responsabilité selon laquelle flock (2) ne doit pas être utilisé sur un NFS. Le doc suggère d'utiliser un drapeau -Ud_flock pour forcer Perl à utiliser flock (2). La page de manuel de flock (2) (sur Redhat) indique une clause de non-responsabilité similaire concernant les problèmes NFS.
Ma question est, pourquoi!?!? Je n'arrive pas à trouver un article approfondi ou une explication de POURQUOI flock (2) n'est pas sûr sur un NFS.
J'ai écrit plusieurs scripts de test en C et Perl, sur Redhat (où flock (2) est utilisé) et sur Solaris (où fcntl (2) est utilisé). J'ai exécuté strace / truss pour m'assurer que Perl utilisait bien flock (2) et fcntl (2) respectivement. Je n'ai pu reproduire aucun problème où un verrou n'était pas respecté! Ce qui donne??
la source
Je suis à peu près sûr que vous examinez les préoccupations héritées. Rappelons que le manuel Perl5 a été publié en 1994 et qu'il ne s'agissait que d'une édition du manuel Perl4 de 1991. À l'époque, on pouvait probablement dire à propos du souvent appelé Nightmare File System que "ce n'est pas à quel point l'ours danse qui étonne, mais qu'il danse du tout ".
NFS2 à l'époque de 1991 rampait lentement hors de Sun vers d'autres plates-formes et était relativement grossier. Le modèle de sécurité était essentiellement inexistant (la racine sur une machine cliente pouvait lire l'intégralité du contenu d'un montage NFS) et le verrouillage - via nfs.lockd - était de ce côté expérimental. Vous auriez été stupide de vous attendre à ce que la sémantique de troupeau fonctionne correctement si elle existait entre deux implémentations prétendument interopérables différentes. Le coaxial était le PHY Ethernet dominant à l'époque que de nombreux utilisateurs du réseau n'ont jamais eu le déplaisir d'utiliser (que voulez-vous dire que vous avez oublié de mettre la résistance de terminaison 50𝛀?) Si cela vous donne une meilleure maîtrise de l'état des intranets.
Larry Wall et son équipe avaient toutes les raisons de faire des hypothèses pessimistes sur l'exactitude des verrous NFS à l'époque, et c'est le genre de programmation défensive que les futurs jockeys de code détestent supprimer car il est si difficile de prouver l'absence de défaut par supprimer l'ancien code qui est réintroduit dans l'interopérabilité avec un système hérité dont vous n'avez même jamais entendu parler.
Depuis lors, NFS s'est considérablement amélioré et lockd a migré dans le temps vers une fonctionnalité du noyau Linux 2.6. Pour une collection de systèmes 2003+, le verrouillage de fichiers NFS peut probablement être approuvé, surtout s'il est bien testé dans votre application sur les nombreuses plates-formes sur lesquelles elle s'exécute.
Tout ce qui précède a été enregistré de mémoire, et pourrait probablement être corroboré par la recherche (par exemple, http://nfs.sourceforge.net/ ) mais la preuve - comme on dit - se trouve dans le verrouillage, et si vous ne l'avez pas testé , il est présumé cassé.
la source
Un autre, directement à partir de la FAQ Linux-NFS: nfs.sf.net
la source
flock
n'a pas, ne fait pas, et ne se verrouille pas sur les montages nfs.C'est obsolète maintenant. NFS4 prend en charge le verrouillage à l'intérieur du protocole (aucun démon lockd ou mécanisme de rappel RPC n'est requis) et la
flock()
méthode de Perl fonctionne très bien - nous l'utilisons en production.De très anciennes versions du noyau implémentées
flock
(le syscall) en tant que no-op sur NFS, et d'autres choses comme le verrouillage de plage d'octets n'étaient pas correctement prises en charge. C'est de là que vient l'hystérie.la source