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

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

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

Клиент Mercurial уведомлен ОС о том, что файл используется другим процессом и выдает ошибку? Есть ли риск, что я могу испортить хранилище с этой настройкой?

2 ответа

Решение

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

Поддержка SMB блокируется, поэтому проблем быть не должно (TM).

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

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

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

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

Файл блокировки - это символическая ссылка в системах, которые его поддерживают, и обычный файл в других системах. Файл или символическая ссылка содержит имя хоста и идентификатор процесса (PID) процесса, который получил блокировку. Это используется для обнаружения устаревших блокировок: если процесс, который получил блокировку, больше не работает, тогда мы можем безопасно сломать блокировку.

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

$ hg clone foo bar

создает жесткие связи между foo а также bar, Это сделано для экономии места и значительного ускорения операции клонирования. Если новый коммит сделан в barMercurial будет тщательно разламывать жесткие ссылки, прежде чем записывать новые данные в файлы. Это в основном делает

$ cp abc abc.tmp
$ rm abc
$ mv abc.tmp abc

чтобы убедиться, что файл abc не передается ни с кем другим. Это делается только в том случае, если количество ссылок для abc больше 1. Если счетчик ссылок равен 1, то сначала скопировать файл будет большой тратой. Теперь проблема в том, что некоторые сетевые файловые системы лгали о количестве ссылок на Mercurial! Они сообщили 1, когда они должны сообщить 2 или более, и это обмануло Mercurial, чтобы не сломать жесткие ссылки. Mercurial 1.6.3 имеет исправление для этого случая - Mercurial теперь безоговорочно разрывает жесткие ссылки при записи на сетевой диск.

Поэтому, пожалуйста, убедитесь, что вы используете последнюю версию Mercurial для такой настройки.

Другие вопросы по тегам