Назад | Перейти на главную страницу

Mercurial одновременный доступ

У нас есть репозиторий Mercurial (стабильная ветка) на подключенном сетевом диске (Windows).

Я хочу знать, что произойдет, если более одного пользователя попытаются нажать одновременно. Или если кто-то тянет, а другой наполовину толкает.

Уведомляется ли клиент Mercurial от ОС о том, что файл используется другим процессом и отключается? Есть ли риск того, что я могу повредить репозиторий при такой настройке?

Mercurial предназначен для обработки одновременного доступа. Вы можете иметь

  • один hg push операция (операция записи) и
  • множественный hg pull и hg clone операции (операции чтения)

одновременно. Другими словами, читателям не нужно ждать друг друга, и им также не нужно ждать одного писателя. Писатели должны ждать других писателей.

Как отмечают специалисты, это делается с помощью замки. Однако это не выполняется путем блокировки самих файлов с помощью блокировок файловой системы. Вместо этого создается файл блокировки.

Файл блокировки является символической ссылкой в ​​системах, которые его поддерживают, и обычным файлом в других системах. Файл или символическая ссылка содержит имя хоста и идентификатор процесса (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 для такой настройки.

Mercurial использует файлы блокировки для защиты репозитория от одновременных изменений. Только один пользователь может захватить блокировку и изменить репозиторий за раз, другие пользователи получат сообщение «ожидает блокировки репозитория».

Поддержка SMB блокировок, так что проблем быть не должно (TM).