В OSX 10.10.3 с использованием VirtualBox 4.3.26 и vagrant 1.7.2 при использовании NFS для общей папки в гостевой системе Ubuntu 14.04 PHP-приложение заставляет гостя, пытающегося использовать LOCK_EX для общей папки, просто блокироваться навсегда (или: слишком долго быть пригодным для использования).
Эта установка использовалась в течение нескольких месяцев. Около двух дней назад после загрузки хоста машина Vagrant вышла из строя, и с тех пор новая сборка этой ВМ обнаруживает эту проблему (возможно, первоначальная проблема уже была связана с этим).
За последние несколько дней новое программное обеспечение не было установлено. Обновление OSX было выполнено примерно на прошлой неделе, но все на этом компьютере продолжало работать.
После долгих поисков мы обнаружили, что виновником является общая папка NFS. Мы использовали эту линию уже давно:
config.vm.synced_folder ".", "/vagrant", type: nfs
strace
внутри гостя выглядит так:
[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
это висит в этой точке. Я мог бы даже сам воспроизвести это с помощью:
<?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";
Как и ожидалось, он висел прямо на первой линии flock
.
Я проверил систему /etc/expoerts
и убедился, что это чистый файл без сломанных / старых остатков после закрытия виртуальной машины.
Та же самая настройка на другом 10.10.3 с идентичным другим программным обеспечением работает без проблем (хотя и немного другое оборудование). Я собирал виртуальную машину на этом другом оборудовании несколько раз в день, и все работает как положено.
Очевидно, что из-за потери производительности абсолютно необходимо снова заставить NFS работать должным образом (вообще не использовать общую папку в настоящее время не вариант).