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

Должен ли вызов SVNSYNC блокироваться или нет в ловушке после фиксации?

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

Я настроил зеркалирование своего репозитория, и он работает нормально, но недавно у меня возникла проблема.

Целевой репозиторий каким-то образом остался с невыпущенной блокировкой - из того, что я читал, это может быть вызвано прерыванием операции svnsync, и я подозреваю, что это может быть потому, что в моем обработчике после фиксации я выполняю svnsync в режиме блокировки, а не нажимаю его в фоновый режим через &.

Я делаю это для того, чтобы пользователь мог быть уверен, что если фиксация завершена, то теперь она есть во всех репозиториях, но, может быть, это создает риск того, что они нажмут «Отмена» и остановят привязку фиксации?

Я не могу найти четких рекомендаций или предложений о том, что лучше или какова лучшая практика, или даже если нажатие кнопки отмены может привести к прерыванию хука фиксации сообщения и выполненной из него синхронизации - в большинстве мест я вижу людей, использующих & для удара синхронизации в фоновом режиме - предотвращает ли это повреждение блокировки в случае, если пользователь нажимает кнопку «Отмена» для своей фиксации во время синхронизации? Как убедиться, что оба репозитория действительно синхронизированы, или сообщить о проблемах? Для этого нужен отдельный механизм уведомлений?

Обновить:

Из двух вышеперечисленных вариантов я решил выбрать третий;)

Я вызываю svnsync в фоновом режиме, но в то же время заставляю крючок ждать его завершения:

svnsync ... &
wait $!

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

Update2: это не устранило проблему - по-видимому, когда ловушка убита, она также убивает дочерние процессы :(

Есть ли у кого-нибудь советы, как с этим справиться? Мне бы очень хотелось, чтобы мои пользователи знали и верили, что когда они видят, что фиксация завершена, это означает, что все сайты синхронизированы.

Обновление 3: Время идет, и проблемы появляются - в течение ~ 2 лет мой подход работал довольно хорошо - я отключил синхронизацию без блокировки и не стал ее ждать - и на прошлой неделе наше зеркало взорвалось, вероятно, из-за двух разных коммитов, выполненных пользователи за одну и ту же секунду (оба преуспели в мастере :)) - в результате svnsync не смог правильно скопировать свойства ревизии, но также создал несколько странных ревизий (он в основном скопировал одну фиксацию и создал отдельную ревизию из нее и приписал ее пользователю svnsync). А потом пожаловался, что «кто-то» вносит изменения прямо в зеркальный репозиторий. Не имея возможности удалить коммиты в SVN, мне пришлось перейти с 0 на HEAD-2, что для мощного репозитория объемом 162 ГБ заняло немало времени. Теперь - после пары дней восстановления - я немного изменил синхронизацию, как это предлагается ниже.

  1. В ловушке фиксации я просто касаюсь файла триггера.
  2. Каждую минуту в задании cron я проверяю наличие этого файла - если он существует, я получаю «блокировку синхронизации» и выполняю фиксацию.

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

Я бы подумал о том, чтобы перенести это из ловушки после фиксации в задачу incrond, которая будет использовать inotify для отслеживания изменений в репозитории, а затем запускать задачу svnsync.

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