[devel] I: git.alt update
Alexey Tourbin
at на altlinux.ru
Пн Ноя 22 23:11:02 UTC 2010
On Mon, Nov 22, 2010 at 07:43:34PM +0300, Dmitry V. Levin wrote:
> > А какой принцип работы параллельной сборки?
>
> girar-task-run поставляет задания в состоянии AWAITING;
>
> N=3 экземпляра gb-toplevel-build выбирают задания в состоянии AWAITING,
> приоритет имеет задание с меньшим номером;
>
> выбранное задание переводится в состояние BUILDING, и для него клонируется
> репозиторий;
>
> для каждого аккаунта, зарегистрированного в системе, может быть не более
> одного задания в состоянии BUILDING;
>
> собранные test-only задания переводятся в состояние TESTED,
> остальные собранные задания переводятся в состояние PENDING;
>
> gb-toplevel-commit выбирает задания в состоянии PENDING c номером итерации
> не менее чем максимальный номер итерации всех заданий в состоянии
> BUILDING и PENDING для данного репозитория в данный момент времени,
> приоритет имеет задание с меньшим номером;
>
> если репозиторий, для которого задание было собрано, отличается от
> репозитория, на котором оно было собрано, то задание переводится в в
> состояние AWAITING с увеличенным номером итерации;
То есть задание вступает в силу (коммитится), только если текущий
репозиторий равен клонированному репозиторию в задании? Это хорошо.
С другой стороны, смотри. Узнать, что репозиторий изменился (и что
придётся проигрывать всё задание заново) можно гораздо раньше, чем
в самом конце при попытке коммита задания.
Это также наводит на мысль, что клонировать репозиторий нет необходимости.
Достаточно иметь операцию
lock_repo_for_reading,check_the_repo_is_unchanged,otherwise_fail_and_schedule_task_for_reiteration
Далее нарезать girar-builder, чтобы некоторые куски выполнялись под этим
локом, а некоторые - без него. Наример, gb-remote-build нужно разрезать на
две части: первая часть выполнятеся под локом, она готовит чрут для сборки
(в том числе выгребает пакеты из репозитория). Вторая часть просто
собирает пакет - упрощенно говоря 'hsh-run rpmbuild ...', лок на
репозиторий для этого не нужен.
> задание переводится в состояние COMMITTING, репозиторий обновляется,
> и выполнение задания завершается.
> > Гарантируется ли строгая (логическая) сериализация заданий?
> А что это значит?
Это понятие из теории СУБД. Транзакции могут выполняться параллельно,
но с точки зрения самой транзакции она выполняется как бы эксклюзивно,
а результат параллельного выполнения должен быть такой, как если бы
транзакции выполнялись в каком-либо порядке. Иначе возникают неприятные
побочные эффекты (самый известный и простой - продать два билета на одно
место).
В girar-builder сериализация важна, потому что это единственный надёжный
способ контролировать целостность репозитория. А именно, girar-builder
работает по следующему принципу: репозиторий переводится из текущего
состояния в (предполагаемое) новое состояние: A->A'. Вычисляется некая
сложная характирестическая функция: H(A), H(A'). Далее принимается
решение, проходит контроль целостности или нет.
То есть, в конечном счете, все задания должны выстраиваться в линейную
очередь (хотя бы при коммите), то есть H(A) должно вычисляться для
текущего репозитория. А параллельно коммитить никак нельзя, потому что
тогда просто нет надёжной модели/надёжного способа контроля целостности.
> > Например, параллельно собирались два задания - glibc и rpm,
> > и закончили собираться одновременно. Как определить, сколько
> > и какие именно задания будут завершены?
>
> По алгоритму, приведенному выше.
Т.е. одно коммитится, все остальные идут на реитерацию.
Подробная информация о списке рассылки Devel