Sur OSX 10.10.3 utilisant VirtualBox 4.3.26 et vagrant 1.7.2 lors de l'utilisation de NFS pour le dossier partagé dans un invité Ubuntu 14.04 LTS, l'application PHP dans l'invité essayant d'utiliser LOCK_EX sur le dossier partagé se bloque simplement pour toujours (ou : trop longtemps pour être utilisable).
Cette configuration a fonctionné pendant des mois. Il y a environ deux jours, après un démarrage de l'hôte, la machine Vagrant est devenue inutilisable et depuis lors, une nouvelle version de cette VM présente ce problème (peut-être que le problème initial était déjà lié à cela).
Aucun nouveau logiciel n'a été installé au cours des derniers jours. La mise à jour d'OSX a été effectuée la semaine dernière, mais tout a continué à fonctionner sur cette machine.
Après de longues recherches, nous avons découvert que le coupable était le dossier partagé NFS. Nous utilisions cette ligne depuis longtemps :
config.vm.synced_folder ".", "/vagrant", type: nfs
A strace
à l'intérieur de l'invité ressemble à ceci :
[pid 26767] open("/vagrant/some/file", O_RDWR|O_CREAT, 0666) = 5
[pid 26767] fstat(5, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid 26767] lseek(5, 0, SEEK_CUR) = 0
[pid 26767] chmod("/vagrant/some/file", 0777) = 0
[pid 26767] flock(5, LOCK_EX
il est bloqué à ce stade. J'ai même pu le reproduire moi-même avec :
<?php
$f = fopen('lock.test', 'w');
echo "Trying to get lock on file ...\n";
var_dump(flock($f, LOCK_EX));
echo "Got lock, unlocking\n";
var_dump(flock($f, LOCK_UN));
echo "Exiting\n";
Comme on pouvait malheureusement s'y attendre, il s'est accroché dès le premier flock
ligne.
J'ai vérifié le /etc/expoerts
et s'est assuré qu'il s'agissait d'un fichier propre, sans résidus cassés ou anciens, une fois la VM éteinte.
La même configuration sur un autre 10.10.3 avec des logiciels identiques fonctionne sans problème (bien que le matériel soit un peu différent). J'ai construit la VM sur cet autre matériel plusieurs fois par jour et tout fonctionne comme prévu.
Il est évident qu'en raison de la perte de performance, il est absolument nécessaire de rétablir le bon fonctionnement de NFS (ne pas utiliser du tout le dossier partagé n'est actuellement pas une option).