условия гонки, если два клиента git svn rebase и git push на один и тот же git repo? - PullRequest
1 голос
/ 07 октября 2010

Является ли svn-rebase-and-push от нескольких клиентов в одном и том же Git-репо уязвимым для условий гонки, если оба клиента пытаются одновременно выполнить svn-rebase и push?

Вот дополнительная информация: я настраиваю размещенное на GitHub зеркало проекта SVN.Чтобы выполнить зеркалирование, я буду запускать эту задачу cron каждые несколько минут (для этой статьи ):

git svn rebase
git.exe push origin master

В целях резервирования мне бы хотелось, чтобы другой сервер работал с таким жеcron работа.Но сломается ли это перед лицом таких условий гонки?

  • Оба сервера перезагружаются практически одновременно.Один из них git push внесет изменения, а другой попытается отправить те же самые изменения.
  • Один сервер перезагружается, затем происходит повторная проверка SVN, затем другой сервер перезагружается и быстро запускает новую проверку, затем первый,более медленный сервер пытается отодвинуть одну регистрацию позади.

Желательно, если более поздняя операция просто возвращает no-op (также известный как «Все актуально»).Это также нормально, если конфликтующее нажатие завершается неудачно, при условии, что его задание cron запускается снова с неконфликтующим tmie, тогда оно будет работать нормально.

Что не в порядке, если локальное хранилище на любом серверепопасть в неудачное состояние, где требуется ручное вмешательство.Если такой сбой возможен, как я должен изменить приведенные выше команды для их самовосстановления?

1 Ответ

2 голосов
/ 07 октября 2010

Я не думаю, что вы столкнетесь с какими-то конкретными проблемами при этом.Загрузка по умолчанию в Git-репозиторий запрещает не «быстрые» толчки, поэтому, если возникнет какой-либо конфликт, этот толчок временно потерпит неудачу.(Следующая, если в это время нет конфликта, будет успешной.)

Эти ситуации легко проверить вручную, запустив такие последовательности:

Instance A            Instance B
----------            ----------
git svn rebase
                      git svn rebase
                      git push
git push
...