Ответ 1
Это произошло из-за изменение, которое кто-то захотел в Cygwin SQLite. Я был сторонником этого пакета, когда этот вопрос был задан, и я сделал изменение, вызвавшее этот симптом.
Это изменение было выпущено как версия Cygwin SQLite 3.7.12.1-1
, и он исправил проблему с одним человеком, но имел этот плохой побочный эффект, препятствующий взаимодействию Cygwin Subversion с собственными реализациями Subversion для Windows.
Что произошло?
Основная проблема здесь в том, что Subversion 1.7 изменил рабочую копию на диске. Часть этого изменения включает новый файл базы данных SQLite, .svn/wc.db
. Теперь, чтобы реализовать SQLite concurrency гарантирует, SQLite блокирует файл базы данных во время доступа к ней.
Это все прекрасно и понятно, но вы столкнулись с проблемой, когда пытаетесь смешивать Windows native и POSIX семантику блокировки файлов. В Windows блокировка файлов почти всегда означает обязательную блокировку, но в системах Linux -— который Cygwin пытается подражать; блокировка обычно означает консультативное блокирование вместо этого.
Это помогает понять, откуда происходит "ошибка ввода-вывода диска".
Изменение Cygwin SQLite 3.7.12.1-1
заключалось в том, чтобы создать библиотеку в режиме "Unix" вместо "Cygwin mode". В режиме Cygwin библиотека использует встроенную блокировку файлов Windows, что противоречит философии Cygwin: по возможности пакеты Cygwin вызывают функции POSIX вместо прямого доступа к API Windows, так что cygwin1.dll
может предоставить правильную семантику POSIX.
Консолидация файлов POSIX - это именно то, что вы хотите с SQLite, когда все программы, обращающиеся к SQL-серверам SQLite, строятся с помощью Cygwin, который является предположением по умолчанию в Cygwin. Но когда вы запускаете собственную программу Subversion для Windows, такую как TortoiseSVN, вместе с чистым POSIX Cygwin svn
, вы получаете конфликт. Когда расширение оболочки TortoiseSVN для Windows Explorer имеет файл .svn/wc.db
, заблокированный с обязательной блокировкой, и Cygwin svn
приходит и пытается получить консультативную блокировку на нем, он немедленно сработает. Cygwin svn
предполагает, что попытка блокировки будет либо успешной, либо заблокирована до тех пор, пока она не удастся, поэтому она неправильно интерпретирует ошибку блокировки как ошибку ввода-вывода диска.
Как мы решили эту дилемму?
В Cygwin мы всегда стараемся играть с родными программами Windows, где это возможно. Хитрость заключалась в том, чтобы найти способ сделать это, в то же время хорошо играя с программами Cygwin.
Не все согласились, что мы должны это сделать. "Cygwin SQLite является частью Cygwin, поэтому ему нужно только хорошо работать с другими программами Cygwin", - сказала одна группа. Контрпартнеры ответят: "Cygwin работает в Windows, поэтому он должен хорошо работать с другими программами Windows".
К счастью, мы придумали способ сделать обе группы счастливыми.
В рамках усилий по сбору упаковки Cygwin SQLite 3.7.17-x
я протестировал новую функцию, которая Corinna Vinschen добавлена в cygwin1.dll
версия 1.7.19. Это позволило программе запрашивать обязательную блокировку файлов через API-блокировки файлов BSD. Моя часть изменения заключалась в том, чтобы заставить Cygwin SQLite включить и отключить эту функцию в пользовательском направлении, позволяя тому же самому пакету удовлетворять потребности как в лагерях, ориентированных на Cygwin, так и в Windows.
Эта функция DLL Cygwin была дополнительно улучшена в 1.7.20, и я выпустил Cygwin SQLite 3.7.13-3
с использованием финализированной семантики блокировки. Эта версия позволила выбрать три стратегии блокировки: консультативную блокировку POSIX, предварительную блокировку BSD и обязательную блокировку BSD/Cygwin. До сих пор последняя стратегия оказалась полностью совместимой с встроенной блокировкой Windows.
Позже, когда Ян Нийтманс взял на себя обслуживание Cygwin SQLite, он еще больше укрепил этот механизм, полностью интегрировав его с SQLite VFS layer. Это позволило сделать четвертый вариант: встроенная блокировка Windows, которую Cygwin SQLite использовал перед тем, как мы начали в этом путешествии. Это в основном хеджирование против возможности того, что стратегия блокировки BSD/Windows не взаимодействует с использованием собственной программы Windows SQLite. Насколько мне известно, никто никогда не должен был использовать этот вариант, но приятно знать его там.
Альтернативное средство устранения
Если конфликт, который у вас есть, находится между командной строкой Cygwin svn
и расширением оболочки Windows Explorer TortoiseSVN, есть еще одна возможность его исправить. TortoiseSVN также поставляется с родными программами командной строки Windows Subversion. Если вы поместите их в свой PATH
перед каталогом Cygwin bin
, вы не должны запускать эту проблему вообще.