ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexey Tourbin <at@altlinux.ru>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: Re: [devel] Метарепозиторий Сизифа
Date: Thu, 8 Nov 2007 22:03:28 +0300
Message-ID: <20071108190328.GW24160@solemn.turbinal> (raw)
In-Reply-To: <20071108174225.GA31673@basalt.office.altlinux.org>

[-- Attachment #1: Type: text/plain, Size: 8378 bytes --]

On Thu, Nov 08, 2007 at 08:42:25PM +0300, Dmitry V. Levin wrote:
> Сборка транзакции (A) происходит следующим образом:
> - создаётся репозиторий - снапшот текущего опубликованного Сизифа (Ra);
>   использование ссылок делает эту операцию дешевой;
> - на этом снапшоте выполняется сборка --with-stuff исходных пакетов
>   транзакции; если хотя бы один не собрался, то транзакция отменяется
>   (в первой реализации сборочной системы не вижу смысла оптимизировать
>   эту часть);

Здесь есть тонкость: сборка --with-stuff второго и последующего пакетов
транзакции идёт со СТАРЫМИ contents_index_bin и contents_index_all.
То есть практика сборки --with-stuff потенциально может давать
неправильныме зависимости -- сразу же после фиксации транзакции
второый и последующие пакеты при тестовой пересборке могут получить
отличающиеся зависимости.  Так что здесь есть несколько подходов:
0) забить; 0a) пока забить; 1) делать в хешере локальный
contents_index_bin/all; 2) формировать временный сизиф после каждого
пакета транзакции и вести сборку уже на нём.  Это всё равно не до конца
решает вопрос, если зависимостями между пакетами в транзакции
топологически не упорядочены (то есть напр. при сборке первого пакета в
транзакции используется старая сборка одного из последующих пакетов).

> - на основе Ra и свежесобранных пакетов формируется новый Сизиф (Ra');
> - сравниваются анметы Ra и Ra';
>   в случае появления новых анметов транзакция откладывается;
> - вычисляется множество (Sa') исходных пакетов в Ra', для сборки которых
>   требуются свежесобранные пакеты транзакции A (точнее говоря, в сборочной
>   среде которых присутствует хотя бы один из свежесобранных пакетов);
> - на Ra' выполняется тестовая сборка всех пакетов из Sa';
> - если хотя бы один пакет перестал собираться (по сравнению со статистикой
>   сборки на Ra), то транзакция откладывается;
> - (*) предпринимается попытка применить успешно собранную транзакцию к Сизифу;
>   если опубликованный на этот момент Сизиф совпадает с тем Сизифом, на
>   основе которого был создан снапшот Ra, то происходит fast forward:
>   Ra' становится Сизифом, которому присваивается очередной номер;

До сих пор всё правильно.
Дальше самое трудное.

>   в противном случае предпринимается попытка выполнить rebase:
> - создаётся репозиторий - снапшот текущего опубликованного Сизифа (Rb);
> - вычисляется множество (Nab) пакетов, которое появилось/обновилось в Rb по
>   сравнению с Ra; здесь предполагается, что один и тот же исходный пакет
>   не может попасть в более чем одну незавершённую транзакцию;
> - если в транзакции есть пакеты более старой сборки, чем одноимённые пакеты
>   в Nab, то транзакция отменяется (в первой реализации сборочной системы
>   не вижу смысла оптимизировать эту часть);

Это нужно описать более точно ("алгебраически").
Имеется такая "структура коммитов" в метарепозитарии:

	     * Rb (HEAD)
	     |
	     * ...
branch Ra' * |
            `* Ra

Я на самом деле всегда об этом думал в терминах специальной "стратегии
мёржа" метарепозитария, и эта идея казалась мне полдотвороной.  Теперь
предлагается вместо мёржа делать ребейс.  Вообще-то ребейс хуже мёржа,
но в данном случае речь идёт примерно об одной и той же алгебраической
операции.  Мы хотим "насадить" изменение Ra->Ra' "сверху" на Rb.

То есть имеются изменения Nab=Ra->Rb' и Naa'=Ra->Ra'.
Можно ли их совместить "без конфликтов"?

(Важное замечание.  По сути речь идёт КРИТЕРИИ ВОЗМОЖНОСТИ мёржа/ребейса.
Этот критерий говорит о том, что эта операция ЛИБО ВОЗМОЖНА, ЛИБО
НЕВОЗМОЖНА.  Это замечание можно переформулировать так: нельзя
ребейсить что угодно на что угодно.)

Изменение Ra->Ra' в общем виде состоит в следующем следующем:
 	удалился src.rpm пакет	liba1	NSVR1
            вследствие чего
		удалился (arch|noarch).rpm пакет liba1-x	NSVR1
		удалился (arch|noarch).rpm пакет liba1-у	NSVR1
		...
	добавился src.rpm пакет liba2	NSVR2
	    вследствие чего
		добавился (arch|noarch).rpm пакет liba2-x	NSVR2
		добавился (arch|noarch).rpm пакет liba2-x	NSVR2
		...
	...

Замещение специальным образом рассматривать не надо -- оно сводится
к удалению+добавлению.

Простейший критерий мёржа/ребейса состоит в том, что должна сохраниться
возможность 1) удаления старых пакетов, с точностью до всех версий; и
2) добавления всех новых пакетов, без точности по версии.

А именно, попытка ребейса на Rb ПОСЛЕДОВАТЕЛЬНО проверяет возможность
применения к Rb операций:
	rm src.rpm liba1 NSVR1
		rm (arch|noarch).rpm liba1-x NSVR1
		rm (arch|noarch).rpm liba1-y NSVR1
	(если попытка удаления прошла хорошо, то
	 считается, что всё реально удалилось)
	add src.rpm liba2
	  (если liba2.src.rpm какой-либо версии уже есть, то облом)
		add (arch|noarch).rpm liba2-x
		  (если либо liba2-x.arch.rpm либо liba2-y.noarch.rpm уже
		   есть, то облом)
		add (arch|noarch).rpm liba2-y

Другими словами, это как бы "сильная" проверка на возможность
"перекладывания" собранных пакетов.  Она защищает от ситуации типа
перерспила пакетов или перетасовки собранных пакетов между исходными.

Но можно смотреть немного по-другому.  Здесь нужен ещё один слой защиты
от "частичного удаления" src.rpm пакетов.  То есть должна быть
алгебраическая операция "удалить src.rpm" пакет.  src.rpm пакет может
быть удалён только полностью, то есть в виде всех своих подпакетов.
А новый src.rpm может быть добавлен тоже только полностью, в виде всех
своих подпакетов.

Тогда критерий сводится к тому, что нужно иметь возможность 1) полностью
удалить тот же самый src.rpm пакет; 2) после удаления -- полностью
добавить новый src.rpm, то есть его быть не должно (любой версии),
ни каких-либо конфликтов по подпакетам (любых версий).

> - на Rb заново собираются --with-stuff те пакеты из A, в сборочной среде
>   которых присутствуют пакеты из Nab;
> - на основе Rb и собранных пакетов A формируется новый Сизиф (Rb');
> - сравниваются анметы Rb и Rb';
>   в случае появления новых анметов транзакция откладывается;
> - вычисляется множество (Sb') исходных пакетов в Rb', для сборки
>   которых требуется хотя бы один из свежесобранных пакетов;
> - на Rb' выполняется тестовая сборка всех пакетов из Sb';
>   если хотя бы один пакет перестал собираться (по сравнению со статистикой
>   сборки на Rb), то транзакция откладывается;
> - предпринимается попытка применить успешно собранную транзакцию к Сизифу
>   по вышеописанному алгоритму, см. (*).

Это рекурсивно что ли получается?
Мне надо ещё подумать.  Точнее, порисовать.

> Из этого описания можно сделать выводы о том, что нужно для обработки
> транзакции:
> - бинарный репозиторий Сизиф для сборки пакетов;
> - быстрое формирование нового бинарного репозитория Сизифа на основе
>   предыдущего и новых пакетов (есть ли у нас необходимые средства?);

Насколько быстрое?  Думаю что достаточно быстрое имеется.

> - корректное вычисление анметов (действующий алгоритм apt-cache unmet,
>   по всей видимости, игнорирует конфликты);

По крайней мере, если новый репозитарий правильно сформирован, то
'apt-cache unmet' помогает обнаруживать бездумную/unintented смену
сонейма.

> - быстрое вычисление подмножества исходных пакетов Сизифа, для сборки
>   которых требуется пакеты из указанного подмножества бинарных пакетов
>   Сизифа (у нас сейчас нет такого алгоритма);

30 минут на машине класса mash (см. мой query-rebuild.git).
Но это может быть намного быстрее на каком-нибудь Core2Duo,
и, следовательно, более приемлемо.

> - статистика сборки исходных пакетов Сизифа должна быть частью Сизифа.

Да.  Частью метарепозитария.  То есть нужно знать когда и в каком виде
пакет последний раз собрался и кое-что ещё.

> Формулировка "транзакция откладывается" означает, что дальнейшая обработка
> транзакции невозможна без вмешательства извне.  На практике это может
> означать отмену транзакции, дополнение транзакции новыми исходными
> пакетами (фактически формирование новой транзакции на основе отложенной),
> или действия уполномоченных лиц по преодолению причин, из-за которых
> транзакция была отложена.

Чем мёрж хуже ребейса.  При мёрже в метарепозитарии явно остаётся
информация, что нечто сломалось и потом починилось.  Это ИНТЕРЕСНО.
При ребейсе эта информация исчезает, и кажется, что как-будто всё
само шло хорошо и гладко.

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

  parent reply	other threads:[~2007-11-08 19:03 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-06 21:35 Alexey Tourbin
2007-11-07  5:23   ` Alexey Tourbin
2007-11-07  5:50     ` Хихин Руслан
2007-11-07  7:01       ` Alexey Tourbin
2007-11-07 21:37         ` Kirill A. Shutemov
2007-11-07 10:16 ` Alexey I. Froloff
2007-11-07 10:38   ` Alexey Gladkov
2007-11-07 10:39 ` Alexey Gladkov
2007-11-07 10:43 ` Alexey Gladkov
2007-11-07 10:49   ` Alexey Gladkov
2007-11-08 17:42 ` Dmitry V. Levin
2007-11-08 18:38   ` Sergey Vlasov
2007-11-08 20:17     ` Dmitry V. Levin
2007-11-08 19:03   ` Alexey Tourbin [this message]
2007-11-08 19:20     ` Kirill A. Shutemov
2007-11-08 19:46       ` Alexey Tourbin
2007-11-08 19:23     ` [devel] bootstrap транзакции Alexey Tourbin
2007-11-08 21:20     ` [devel] Метарепозиторий Сизифа Dmitry V. Levin
2007-11-08 22:08       ` Alexey Tourbin
2007-11-08 22:30         ` [devel] git-репозитарий для логов сборки Alexey Tourbin
2007-11-08 22:48           ` Dmitry V. Levin
2007-11-08 23:28             ` Alexey Tourbin
2007-11-09  1:09               ` Dmitry V. Levin
2007-11-09  1:21                 ` Alexey Tourbin
2007-11-09  2:06             ` Alexey Tourbin
2007-11-08 22:38         ` [devel] Метарепозиторий Сизифа Dmitry V. Levin
2007-11-08 23:04           ` Alexey Tourbin
2007-11-09  1:06           ` Alexey Tourbin
2007-11-09  6:44             ` Kirill A. Shutemov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20071108190328.GW24160@solemn.turbinal \
    --to=at@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git