Всегда ли параллельные толчки мерзавцев всегда безопасны, если второй толчок имеет ускоренную перемотку вперед после первого толчка? - PullRequest
11 голосов
/ 08 декабря 2011

Я хочу автоматически передавать коммиты в ловушке после получения из центрального репо в нашей локальной сети в другое центральное репо в облаке.Репозиторий в локальной сети создается с помощью git clone --mirror git@cloud:/path/to/repo или эквивалентных команд.

Поскольку фиксируемые файлы будут большими по сравнению с нашей восходящей пропускной способностью, вполне возможно, что может произойти что-то подобное:

  1. Алиса инициирует передачу в репо ЛВС.
  2. Билл вытягивает из репо ЛВС, пока работает перехват приема.
    • Репо ЛВС находится в процессе передачи в облачное репо.
    • Это также означает, что локальное репо Билла содержит коммиты, которые Алиса выдвинула.Подтверждено тестированием.
  3. Билл запускает репо в ЛВС.
    • Пуш-толчок Билла является быстрым ходом пуша Алисы, поэтому репо ЛВС его примет.

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

Меня не волнуют объекты git.Наихудший сценарий состоит в том, что оба нажатия загружают все объекты из нажатия Алисы, но это не должно иметь значения, насколько я понимаю внутренности git.

Я обеспокоен ссылками на ссылки. Предположим, что Алиса выдвинулась, используя гораздо более медленное соединение, так что пуш Билла завершается первым. Предположим, потеря пакета или что-то еще заставляет завершение перехвата ловушки из репозитория LAN в облако подталкивания Билла до того, как перехват хука отРепо по локальной сети в облако Алисы.Если и Алиса, и Билл толкают основную ветвь, а толчок Билла заканчивается первым, что будет с главным рефером в облачном репо?Я хочу, чтобы это была ГОЛОВА Билла, поскольку это более поздний толчок, но я обеспокоен тем, что это будет ГОЛОВА Алисы.

Дальнейшее уточнение:

Я понимаю, что Алиса переместилась с ее машины в ЛВС.Операция репо завершится неудачей, если передача Билла со своей машины в локальную сеть завершится в первую очередь.В этом случае ловушка пост-получения репо ЛВС не будет выполнена.Кроме того, пожалуйста, примите во внимание, что никто не будет делать принудительные нажатия, поэтому , если в репозитории локальной сети запускается ловушка после получения, все изменения ссылок выполняются быстро.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Если толчок Билла заканчивается первым, толчок Алисы завершится неудачей, потому что перед обновлением ссылок git проверяет, что ссылка для репо остается такой же, как и раньше. При таком раскладе этого не будет. Алиса в конечном итоге увидит сообщение об ошибке и должна решить проблемы. То же самое касается Билла в обратном случае. Таким образом, в своем пост-получении вы должны убедиться, что исходные и новые ссылки на репо теперь разные. Если нет, то вообще не продвигайтесь к новому репо, чтобы сохранить работу.

Я все еще вижу проблему в вашем сценарии, хотя это связано с переходом в облако. Вы можете иметь ОДНУ ЖЕ проблему с хуком, толкающим два действительных ссылки до облачного местоположения. За исключением того, что теперь вы не будете знать, нужно ли вам нажимать на репо в скрипте, если он терпит неудачу в первый раз, потому что вы не будете знать, был ли сбойный реф более старым или более новым, чем тот, который был вставлен ... особенно, если они не были простыми быстрые форварды, которые могут происходить время от времени. Если вы просто нажали кнопку, независимо от того, есть ли у этого шанс, облако будет иметь СТАРОЙ реф, пока другой хук не подтолкнет что-то еще позже. В случае с Алисой он бы слил изменения из апстрима или любого другого решения, но сценарий, вероятно, не должен обладать такой способностью принимать решения.

В хуке вы могли бы использовать магию сценариев для текущего репо, чтобы определить временные метки и тому подобное, и нажимать только при наличии ускоренной перемотки вперед, но это кажется грязным и, скорее всего, слияние необходимо в любом случае. Я думаю, что лучшее решение, чем использование перехвата после получения, - это использовать cron или запланированную задачу каждые пять минут (или сколько угодно часто), которая просто запускает git pull в основной ветке вашего удаленного зеркала. Если у вас нет доступа к этому репо, вы можете вместо этого выполнить принудительное продвижение из репозитория локальной сети с помощью задания cron. Я думаю, что это безопаснее, чем крюк и менее сложно. Это гарантирует, что ветвь в облаке резервного копирования всегда будет в правильном месте каждые несколько минут и не рискует выдвинуть старую ссылку и никогда не получит самую новую, пока не получится еще один толчок от пользователя, как это делает ловушка.

1 голос
/ 15 февраля 2015

Git 2.4+ (2 квартал 2015 года) представит атомные толчки , что должно упростить серверу управление порядком толчков.
См. Работу, выполненную Stefan Beller (stefanbeller) :

  • commit ad35eca t5543-atomic-push.sh: добавить базовые тесты для атомных толчков

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

  • commit d0e8e09 push.c: добавить --atomic аргумент

    --[no-]atomic
    

Использовать атомарную транзакцию на удаленной стороне, если она доступна.
Либо все ссылки обновлены, либо по ошибке, никакие ссылки не являютсяобновлено.
Если сервер не поддерживает атомарные push-сообщения, отправка завершится неудачей.

  • commit 4ff17f1 : send-pack.c: add --atomic аргумент командной строки

Это добавляет поддержку send-pack для согласования и использования атомарных толчков, если сервер их поддерживает.Атомные толчки активируются новым флагом командной строки --atomic.

  • commit 1b70fe5 : receive-pack.c: согласование поддержки атомного push

Это добавляет опцию атомарного протокола к allow receive-pack, чтобы сообщить клиенту, что у него есть возможность атомарного проталкивания .
Этот коммит делает функционал, представленный в предыдущих коммитах, активным дляобслуживающая сторона.
Изменения в документации отражают возможности протокола сервера.

   atomic
   ------

Если сервер отправляет возможность 'atomic', он способен принимать атомарныеpushes.
Если запрашивающий клиент запрашивает эту возможность, сервер обновит ссылки в одной атомарной транзакции.
Либо все ссылки обновлены, либо отсутствуют.

...