Ртутный одновременный доступ
У нас есть хранилище Mercurial (стабильная ветвь) на подключенном сетевом диске (Windows).
Я хочу знать, что произойдет, если несколько пользователей попытаются нажать одновременно. Или если кто-то тянет, в то время как другой находится в середине толчка.
Клиент Mercurial уведомлен ОС о том, что файл используется другим процессом и выдает ошибку? Есть ли риск, что я могу испортить хранилище с этой настройкой?
2 ответа
Mercurial использует файлы блокировки для защиты хранилища от одновременных изменений. Только один пользователь может захватить блокировку и изменить репо одновременно, другие пользователи получают сообщение "Ожидание блокировки на репозиторий".
Поддержка SMB блокируется, поэтому проблем быть не должно (TM).
Mercurial предназначен для одновременного доступа. Вы можете иметь
- один
hg push
операция (операция записи) и - множественный
hg pull
а такжеhg clone
операции (операции чтения)
одновременно. Другими словами, читатели не должны ждать друг друга, и они также не должны ждать единственного автора. Писатели должны ждать других писателей.
Как отмечают pehrs, это делается с помощью замков. Однако это не делается путем блокировки самих файлов с помощью блокировок файловой системы. Вместо этого создается файл блокировки.
Файл блокировки - это символическая ссылка в системах, которые его поддерживают, и обычный файл в других системах. Файл или символическая ссылка содержит имя хоста и идентификатор процесса (PID) процесса, который получил блокировку. Это используется для обнаружения устаревших блокировок: если процесс, который получил блокировку, больше не работает, тогда мы можем безопасно сломать блокировку.
Вышеуказанное гарантирует, что только один процесс записывает данные в данный репозиторий одновременно. Однако существует больше опасностей при использовании сетевых файловых систем. Одна потенциальная проблема заключается в том, что
$ hg clone foo bar
создает жесткие связи между foo
а также bar
, Это сделано для экономии места и значительного ускорения операции клонирования. Если новый коммит сделан в bar
Mercurial будет тщательно разламывать жесткие ссылки, прежде чем записывать новые данные в файлы. Это в основном делает
$ cp abc abc.tmp
$ rm abc
$ mv abc.tmp abc
чтобы убедиться, что файл abc
не передается ни с кем другим. Это делается только в том случае, если количество ссылок для abc
больше 1. Если счетчик ссылок равен 1, то сначала скопировать файл будет большой тратой. Теперь проблема в том, что некоторые сетевые файловые системы лгали о количестве ссылок на Mercurial! Они сообщили 1, когда они должны сообщить 2 или более, и это обмануло Mercurial, чтобы не сломать жесткие ссылки. Mercurial 1.6.3 имеет исправление для этого случая - Mercurial теперь безоговорочно разрывает жесткие ссылки при записи на сетевой диск.
Поэтому, пожалуйста, убедитесь, что вы используете последнюю версию Mercurial для такой настройки.