Re: Генерация pool-based репозиториев
Victor Wagner -> debian-russian@lists.debian.org @ Mon, 4 Mar 2019 17:28:51 +0300:
> Чтобы миррор всегда был консистентным, необходимо действовать в
> следующей последовательности:
> 1. Сначала скачать все новые пакеты
> 2. Потом скопировать Packages{,.gz,.bz2} Release и Release.gpg и
> единомоментно атоммарной операцией из заменить.
> 3. Удалить более ненужные пакеты.
> А rsync --delete делает не так. Он СНАЧАЛА удаляет более ненужные
> файлы, а потом уже копирует новые.
rsync --delete-after
и вообще почитать, какие там бывают варианты у delete.
> Ну и о том, что Release содержит контрольную сумму Packages и менять
> их нужно одновременно - тоже не в курсе.
А вот этого он уже не знает, конечно.
Есть еще чуть более хитрый вариант — cp -al, rsync в копию, и потом
_почти_ атомарная пара rename либо перевешивание симлинка (тоже _почти_
атомарное). Второе лучше (см. ниже).
> Отдельное развлечение случается когда у тебя параллельно работает
> десяток jenkins-овских заданий, собирающих разные пакеты, зависящие
> друг от друга. Может запросто получиться так, что задание 1 сделало
> apt-get update, потом задание 2 выложило новую версию своего пакета
> и перергенерировало packages, а потом задание 1 захотело этот пакет
> поставить, потому что он у него Build-Depends.
В таком раскладе либо задание 2 не должно удалять старую версию пакета
(а делать это должен кто-то третий в конце всего прогона или еще по
какому-то критерию "старая версия больше никому не нужна"), либо у тебя
неконсистентность прямо в постановке задачи.
То, что задание 2 перегенерировало packages, само по себе для задания 1,
которое уже сделало apt-get update, по барабану. Важно, чтобы пакет
оставался.
Другое дело, что race condition вида "у задания 1 прямо в процессе
apt-get update могли оказаться Release и Packages разных версий
репозитория" все равно остается.
Чтобы его не было, см. выше про симлинк. Перед apt-get update делается
readlink, прочитанное имя пишется в sources.list, и уже с этим
отрезолвленным именем, где заведомо консистентный репозиторий, который
уже никогда не поменяется, можно работать.
> Прикрутить туда осмысленную систему exclusive и shared блокировок при
> условии того, что задания крутятся на куче разных машин и в репозиторий
> ходят apt-ом весьма нетривиально.
Любая система с блокировками содержит race condition :) Один мутекс еще
нет, а любая система уже да.
Reply to: