[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: