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 :) Один мутекс еще нет, а любая система уже да.