No OSX 10.10.3 usando o VirtualBox 4.3.26 e o vagrant 1.7.2 ao usar o NFS para a pasta compartilhada em um convidado do Ubuntu 14.04 LTS, o aplicativo PHP no convidado tentando usar o LOCK_EX na pasta compartilhada simplesmente bloqueia para sempre (ou : muito tempo para ser utilizável).
Essa configuração costumava funcionar por meses. Cerca de dois dias atrás, após um host inicializar a máquina do Vagrant, ela ficou inutilizável e, desde então, uma nova compilação dessa VM exibe esse problema (talvez o problema inicial já estivesse relacionado a isso).
Nenhum novo software foi instalado nos últimos dias. A atualização do OSX foi realizada por volta da semana passada, mas tudo nessa máquina continuou funcionando.
Após uma longa pesquisa, descobrimos que o culpado é a pasta compartilhada do NFS. Nós estávamos usando essa linha há muito tempo:
config.vm.synced_folder ".", "/vagrant", type: nfs
Um strace
no convidado é assim:
[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
ele trava neste momento. Eu mesmo poderia reproduzi-lo com:
<?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";
Como infelizmente esperado, ficou na primeira linha flock
.
Eu verifiquei o sistema /etc/expoerts
e verifiquei se era um arquivo limpo sem sobras quebradas / antigas depois que a VM foi encerrada.
A mesma configuração em outro 10.10.3 com outro software idêntico funciona sem problemas (embora um hardware um pouco diferente). Eu criei a VM nesse outro hardware várias vezes ao dia e tudo funciona conforme o esperado.
Obviamente, devido à perda de desempenho, é absolutamente desejável que o NFS funcione corretamente novamente (não usar a pasta compartilhada atualmente não é uma opção).