Les démons meurent avec une erreur de bus lorsque leurs binarys vivent sur NFS

Nous avons des daemons exécutant sur plusieurs hôtes.

Les images exécutables du démon sont ces très grands binarys hébergés sur NFS.

Lorsque les files binarys sont mis à jour sur le server NFS, les démons précédemment exécutés tombent parfois morts avec une erreur de bus. Je suppose que ce qui se passe est que le server NFS remplace les binarys d'une manière qui est invisible pour la couche VFS sur les clients NFS, de sorte qu'ils finissent par charger des pages à partir du binary mis à jour, ce qui conduit naturellement à la folie.

Nous avons essayé de déplacer les nouveaux binarys en place au lieu de cp, mais cela ne semble pas le résoudre.

Je considère simplement mlock () dans le script de démarrage du démon, mais sûrement il y a des options ou des sémantiques magiques que nous devrions abuser. Existe-t-il une meilleure façon de résoudre ce problème?

La meilleure solution que nous avons trouvée consiste à toujours installer la binary avec une string de version à la fin de son nom et à maintenir un lien symbolique qui pointe toujours vers la dernière version.

/mnt/foo/bar -> bar-20111201000000 /mnt/foo/bar-20111201000000 /mnt/foo/bar-20111115000000 

Lorsque vous installez la nouvelle version, vous modifiez atomiquement un nouveau lien symbolique sur l'ancien.

Lorsque vous exécutez le décalage binary de NFS, votre process mappe le nom binary versionné, que les nouvelles installations ne perturberont pas. Il a également cette fonctionnalité de bon bonus où vous pouvez exécuter ps et voir immédiatement quelle version du binary est en cours d'exécution.

C'est un problème courant avec NFS. Lorsque vous supprimez le file, la connection NFS existante croit que le tableau de statistics qu'il contient est correct, il va se recharger et get une erreur de bus.

Ce que vous voulez faire, c'est déplacer le binary existant, mettre le nouveau binary en place, après que chacune des machines a commencé à utiliser le nouveau binary, supprimez l'ancien. Apache fait cela quand il essaie de mmap servi des files de NFS qui changent aussi.