From: Alexey Tourbin <at@altlinux.ru>
To: devel@lists.altlinux.org
Subject: Re: [devel] RFC: тестирование входящих пакетов полной пересборкой сизифа
Date: Thu, 23 Aug 2007 17:23:04 +0400
Message-ID: <20070823132304.GD6155@solemn.turbinal> (raw)
In-Reply-To: <20070823101945.GA6155@solemn.turbinal>
[-- Attachment #1: Type: text/plain, Size: 8874 bytes --]
On Thu, Aug 23, 2007 at 02:19:45PM +0400, Alexey Tourbin wrote:
> On Wed, Aug 22, 2007 at 01:43:21AM +0400, Alexey Tourbin wrote:
> > "Полную пересборку сизифа" следует трактовать не буквально, а вот как:
> > пересобрать все пакеты, у которых при сборке в билдрут ставится один из
> > новых пакетов. Это означает, что, с учетом поступивших пакетов, для
> > каждого src.rpm пакета формируется список пакетов для билдрута. Если в
> > списке пакетов для билдрута оказывается новый пакет, то этот src.rpm
> > пакет подлежит пересборке.
>
> [...]
>
> > Техническая проблема на подступах к определению списка пакетов, подлежащих
> > пересборке, было в том, что нужно научиться очень быстро строить список
> > пакетов в билдруте при сборке каждого src.rpm пакета. Стандартный
> > способ (который используется в hasher, через --print-uris) занимает
> > порядка одной секунды на src.rpm пакет. Это связано с тем, что apt всё
> > время перечитывает свой кеш. В сизифе около 6000 src.rpm пакетов, значит,
> > определять, какие из них нужно пересобрать, можно около 2 часов. Это
> > даже больше, чем может занять последующая пересборка обнаруженным таким
> > образом src.rpm пакетов. У меня сейчас зреет решение, как немного
> > захачить апт и написать к нему скрипт на lua, чтобы построение списка
> > пакетов для пересборки по времени сводилось к чтению хедеров src.rpm
> > пакетов.
>
> Я придумал решение (захачил апт, чтобы он не перечитывал кеш, написал
> скрипт на lua и кое-что ещё), при котором скорость --print-uris на моей
> машине сейчас около 5 src.rpm пакетов в секунду. Получается всё равно
> достаточно много -- выяснять, какие из 6000 src.rpm пакетов нужно
> пересобирать, придётся минут 20. Боюсь, что намного быстрее уже не
> получится.
>
> Опубликую и напишу в ближайшее время.
git.alt:/people/at/packages/query-rebuild.git
Суть дела в следующем.
apt-get.cc модифицируется в двух местах.
1) Пишем обёртку для DoInstall и добавляем DoInstall в число функций,
доступных из lua скриптов:
@@ -3173,6 +3219,7 @@ bool DoScript(CommandLine &CmdL)
_config->Set("Scripts::AptGet::Script::", *I);
_lua->SetGlobal("commit_ask", 1);
+ _lua->SetGlobal("DoInstall", lua_DoInstall);
_lua->RunScripts("Scripts::AptGet::Script");
double Ask = _lua->GetGlobalNum("commit_ask");
_lua->ResetGlobals();
2) Делаем так, чтобы DoInstall не перечитывал свой кеш.
Для этого вводится статическая локальная переменная.
@@ -1967,10 +1967,22 @@ bool DoUpgrade(CommandLine &CmdL)
/* Install named packages */
bool DoInstall(CommandLine &CmdL)
{
+#if 1
+ static CacheFile *GCache = 0;
+ if (!GCache) {
+ GCache = new CacheFile;
+ if (GCache->OpenForInstall() == false)
+ return false;
+ }
+ CacheFile &Cache = *GCache;
+ if (Cache.CheckDeps(CmdL.FileSize() != 1) == false)
+ return false;
+#else
CacheFile Cache;
if (Cache.OpenForInstall() == false ||
Cache.CheckDeps(CmdL.FileSize() != 1) == false)
return false;
+#endif
// Enter the special broken fixing mode if the user specified arguments
bool BrokenFix = false;
3) Пишется вспомогательный скрипт, который очень быстро "опрашивает"
BuildRequires пакетов, примерно так же, как это делается в hasher.
Формат вывода скрипта:
<src-rpm-basename> <deps>+
Суть скрипта такая
deps=$(rpmquery -pR "$f") ||
{ echo >&2 "${0##*/}: failed to query $f"; return 1; }
deps="$(printf %s "$deps" |grep -v '^rpmlib(' |LC_ALL=C tr -d [[:blank:]])"
[ -z "$deps" ] || printf "%s %s\n" "${f##*/}" "$(printf %s "$deps" |tr -s '[:space:]' ' ')"
Я написал полностью аналогичный скрипт на перле, который работает в 100
раз быстрее шелловского.
$ time ./query-pR.pl /ALT/Sisyphus/files/SRPMS >.pR
./query-pR.pl /ALT/Sisyphus/files/SRPMS > .pR 3.53s user 1.38s system 79% cpu 6.170 total
$ head -2 .pR
7colors-0.80-alt5.src.rpm ORBit-devel XFree86-devel XFree86-libs esound-devel glib-devel gnome-libs-devel gtk+-devel imlib-devel libaudiofile-devel libdb1-devel xpm-devel
a2ps-4.13-alt3.src.rpm ImageMagick flex ghostscript-common ghostscript-utils groff-base gv gzip-utils psutils tetex-core tetex-dvips tetex-latex xorg-x11-devel
$
4) Пишется скрипт print-uris.lua который будет вызывать DoInstall и
вычислять содержимое билдрута для каждого src.rpm пакета (из предыдущего
файла .pR, который будет подключен к stdin). Суть скрипта в следущем:
print_uris("basesystem", {"basesystem"}) -- initialize cache
print_uris("rpm-build", {"rpm-build"})
Теперь в аптовском кеше сидит "установленный" basesystem+rpm-build.
На каждый src.rpm пакет lua будет форкаться (чтобы сохранить кеш).
for line in io.lines() do
...
fork_print_uris(rpm, deps)
end
В вывод print_uris добавлены строчки-маркеры BEGIN и END.
Вот как это работает.
$ hsh --init $TMPDIR/build
$ chmod -w $TMPDIR/build/aptbox/var/lib/rpm # НУЖЕН ЧМОД
$ ls ./apt-get
./apt-get # МОДИФИЦИРОВАННЫЙ
$ PATH=$PWD:$PATH $TMPDIR/build/aptbox/apt-get -qq -y script ./print-uris.lua <.pR
BEGIN basesystem
END basesystem true
BEGIN rpm-build
END rpm-build true
BEGIN 7colors-0.80-alt5.src.rpm
'file:/ALT/Sisyphus/i586/RPMS.classic/glib-1.2.10-alt12.i586.rpm' glib_1.2.10-alt12_i586.rpm 81314 6cb31aaa2875a1f0d0768d1435a4a435
'file:/ALT/Sisyphus/i586/RPMS.classic/libORBit-0.5.17-alt3.i586.rpm' libORBit_0.5.17-alt3_i586.rpm 169128 1097a7e5b1ccaa786e27271b7155be1a
'file:/ALT/Sisyphus/i586/RPMS.classic/ORBit-0.5.17-alt3.i586.rpm' ORBit_0.5.17-alt3_i586.rpm 127941 5f49b6b61338887fed13f2de967c00fe
'file:/ALT/Sisyphus/i586/RPMS.classic/libfontenc-1.0.4-alt1.i586.rpm' libfontenc_1.0.4-alt1_i586.rpm 13013 d5d031c9741e3de1e08b2dcd21dd26a5
'file:/ALT/Sisyphus/i586/RPMS.classic/libfreetype-2.3.5-alt2.i586.rpm' libfreetype_2.3.5-alt2_i586.rpm 315157 7447bc73a08199e18da1c49dad5fd21
...
END 7colors-0.80-alt5.src.rpm true
BEGIN a2ps-4.13-alt3.src.rpm
'file:/ALT/Sisyphus/i586/RPMS.classic/libfontenc-1.0.4-alt1.i586.rpm' libfontenc_1.0.4-alt1_i586.rpm 13013 d5d031c9741e3de1e08b2dcd21dd26a5
'file:/ALT/Sisyphus/i586/RPMS.classic/libfreetype-2.3.5-alt2.i586.rpm' libfreetype_2.3.5-alt2_i586.rpm 315157 7447bc73a08199e18da1c49dad5fd21
...
END a2ps-4.13-alt3.src.rpm true
BEGIN a52dec-0.7.4-alt5.src.rpm
END a52dec-0.7.4-alt5.src.rpm true
BEGIN aalib-1.4-alt2rc5.src.rpm
'file:/ALT/Sisyphus/i586/RPMS.classic/libX11-locales-1.1.3-alt3.i586.rpm' libX11-locales_3%3a1.1.3-alt3_i586.rpm 186817 19f61bc3fbf7c8248e43287d8ac653e1
'file:/ALT/Sisyphus/i586/RPMS.classic/libgpm-devel-1.20.1-alt8.i586.rpm' libgpm-devel_1.20.1-alt8_i586.rpm 11727 016186297ea138acd158f8ccd4b95347
...
END aalib-1.4-alt2rc5.src.rpm true
BEGIN abinit-4.6.5-alt1.src.rpm
...
$
То есть это обычный вывод apt-get install --print-uris, только сделанный
в цикле и дополненный маркерами
BEGIN <src-rpm-basename>
END <src-rpm-basename> <true|false>
5) Теперь этот вывод несложно обработать скриптом print-uris-filter.awk,
чтобы на выходе получить таблицу
<src-rpm-basename> <inst-rpm-basename>
Эта таблица означает, что для src.rpm пакета <src-rpm-basename>
в билдрут будет ставиться собранный rpm пакет <inst-rpm-basename>.
$ head .pR >.pR1
$ PATH=$PWD:$PATH $TMPDIR/build/aptbox/apt-get -qq -y script ./print-uris.lua <.pR1 >.uris
$ awk -f ./print-uris-filter.awk .uris |head
7colors-0.80-alt5.src.rpm glib-1.2.10-alt12.i586.rpm
7colors-0.80-alt5.src.rpm libORBit-0.5.17-alt3.i586.rpm
7colors-0.80-alt5.src.rpm ORBit-0.5.17-alt3.i586.rpm
7colors-0.80-alt5.src.rpm libfontenc-1.0.4-alt1.i586.rpm
7colors-0.80-alt5.src.rpm libfreetype-2.3.5-alt2.i586.rpm
7colors-0.80-alt5.src.rpm libXfont-1.2.8-alt2.i586.rpm
7colors-0.80-alt5.src.rpm bdftopcf-1.0.1-alt1.i586.rpm
7colors-0.80-alt5.src.rpm libdb1-1.85-alt5.i586.rpm
7colors-0.80-alt5.src.rpm db1-utils-1.85-alt5.i586.rpm
7colors-0.80-alt5.src.rpm libaudiofile-0.2.6-alt2.i586.rpm
$ awk -f ./print-uris-filter.awk .uris |sort -u -k1,1
7colors-0.80-alt5.src.rpm glib-1.2.10-alt12.i586.rpm
a2ps-4.13-alt3.src.rpm libfontenc-1.0.4-alt1.i586.rpm
aalib-1.4-alt2rc5.src.rpm libX11-locales-1.1.3-alt3.i586.rpm
abinit-4.6.5-alt1.src.rpm gcc-fortran-common-1.4.10-alt2.i586.rpm
abiword-2.4.6-alt2.src.rpm libIDL-0.8.8-alt1.i586.rpm
abook-0.5.6-alt1.src.rpm libtinfo-devel-5.6-alt3.i586.rpm
abuse_sdl-0.7.0-alt4.src.rpm ca-certificates-2007.02.06-alt1.noarch.rpm
acidrip-0.14-alt1.src.rpm ca-certificates-2007.02.06-alt1.noarch.rpm
acl-2.2.39-alt1.0.src.rpm libattr-devel-2.4.32-alt1.0.i586.rpm
$
Теперь задача почти решена. Мы имеем вновь пришедшие пакеты
<inst-rpm-basename>, и хотим узнать, какие <src-rpm-basename>
подлежат пересборке. Это тривиальный join по этой таблице.
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2007-08-23 13:23 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-21 21:43 Alexey Tourbin
2007-08-22 5:25 ` Денис Смирнов
2007-08-22 8:22 ` Хихин Руслан
2007-08-23 10:19 ` Alexey Tourbin
2007-08-23 11:10 ` Michael Shigorin
2007-08-23 11:16 ` Mykola S. Grechukh
2007-08-23 11:18 ` Mykola S. Grechukh
2007-08-23 11:52 ` [devel] [JT] " Michael Shigorin
2007-08-23 12:10 ` Mykola S. Grechukh
2007-08-23 12:11 ` Michael Shigorin
2007-08-23 12:32 ` Alexey Tourbin
2007-08-23 19:05 ` [devel] статистика Alexey Tourbin
2007-08-23 20:25 ` Alexey Tourbin
2007-08-23 20:37 ` Vadim V. Zhytnikov
2007-08-23 19:51 ` Alexey Tourbin
2007-08-23 21:03 ` Alexey Tourbin
2007-08-23 21:08 ` Хихин Руслан
2007-08-23 21:47 ` Alexey Tourbin
2007-08-23 21:59 ` Alexey Tourbin
2007-08-23 22:19 ` Alexey Tourbin
2007-08-23 12:19 ` [devel] [JT] Re: RFC: тестирование входящих пакетов полной пересборкой сизифа Alexey Tourbin
2007-08-23 13:12 ` Michael Shigorin
2007-08-24 11:15 ` Alexey Tourbin
2007-08-25 9:15 ` Alexey I. Froloff
2007-08-25 9:33 ` Alexey Tourbin
2007-08-25 10:16 ` Alexey I. Froloff
2007-08-25 11:25 ` Igor Vlasenko
2007-08-25 11:36 ` Igor Vlasenko
2007-08-25 11:48 ` Michael Shigorin
2007-08-25 11:53 ` Mykola S. Grechukh
2007-08-25 21:58 ` Igor Vlasenko
2007-08-25 22:43 ` Alexey Tourbin
2007-08-25 23:35 ` Igor Vlasenko
2007-08-26 13:38 ` Alexey I. Froloff
2007-08-25 18:33 ` Alexey Tourbin
2007-08-25 19:32 ` [devel] incominger Michael Shigorin
2007-08-25 20:13 ` [devel] [JT] Re: RFC: тестирование входящих пакетов полной пересборкой сизифа Денис Смирнов
2007-08-23 13:23 ` Alexey Tourbin [this message]
2007-08-24 12:51 ` [devel] " Alexey Tourbin
2007-08-24 21:23 ` [devel] статистика [2] Alexey Tourbin
2007-08-25 14:57 ` [devel] Критерий значимости пакета (Was: статистика) Alexey Rusakov
2007-08-25 20:10 ` Денис Смирнов
2007-08-25 20:28 ` Alexey Tourbin
2007-08-25 22:47 ` Денис Смирнов
2007-08-25 23:55 ` Alexey Tourbin
2007-08-29 20:39 ` [devel] статистика [2] Dmitry V. Levin
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=20070823132304.GD6155@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