[devel] Requires optimization/pruning

Alexey Tourbin at на altlinux.ru
Ср Мар 9 11:24:13 UTC 2011


On Wed, Mar 09, 2011 at 01:20:41PM +0200, Michael Shigorin wrote:
> On Sat, Feb 05, 2011 at 08:41:03AM +0300, Alexey Tourbin wrote:
> > Насчет оптимизации зависимостей между подпакетами.  Мне совсем недавно
> > пришло в голову, что зависимости можно оптимизировать ещё сильнее:
> > а именно, оптимизировать можно не только зависимости, удовлетворённые
> > через Provides, но и зависимости, удовлетворенные через Requires! Ж-)
> > 
> > Пусть например пакет rpm требует две зависимости
> > librpm = 4.0.4-alt16
> > libc.so.6()(64bit)
> > а пакет librpm в свою очередь требует среди прочих зависимость
> > libc.so.6()(64bit)
> > 
> > Тогда из пакета rpm можно удалить зависимость на libc.so.6()(64bit).
> > То есть некоторые зависимости подпакетов иногда "отоваривать", как говорит
> > лидер нации, через базовый подпакет.  Что в принципе имеет смысл.
> > 
> > Но там сложнее сделать, поскольку две Requires зависимости нельзя
> > сравнивать напрямую.  И это не будет хорошо работать с set-версиями,
> > потому что обычно будут разные/несравнимые подможества.  А оптимизация
> > зависимостей делается прежде всего, чтобы снизить нагрузку на
> > pkglist/pkgcache и apt, которая подскочила из-за set-версий.
> 
> Может, всё-таки обрезать в pkglist, а не в самих пакетах?
> 
> Тогда пакеты будут нести достаточную индивидуальную информацию,
> а pkglist-ы -- отражать достаточную совокупную на момент генерации.
> (мысль высказана led@ и мне кажется разумной)

Если рассматривать подпакеты как индивидуальные сущности, то обрезать
зависимости не следовало бы.  С другой стороны, пакеты с жесткой
зависимостью на на свои базовые подпакеты уже не являются "достаточно
индвивидуальным" сущностями - они строго привязаны к базовым подпакетам.

В общем с моей точки зрения тут лучше не философствовать насчёт сущностей,
а рассуждать с точки зрения сохранения гарантий.  Получим ли мы всегда
то же самое, если мы применим оптимизацию?  Да, эмпирически при установке
и обновлении пакетов мы всегда получаем то же самое.  Значит, оптимизация
корректна.

А то можно договориться до того, что, например, в gcc нельзя инлайнировать
функции.  Потому что функции несут индвивидуальную информацию.

А выгоды от оптимизации довольно-таки ощутимы.

$ rpm -qR gcc4.5-c++
gcc4.5 = 4.5.1-alt8
libstdc++4.5-devel = 4.5.1-alt8
rpmlib(PayloadIsLzma)
$

> Если вырезать из самих пакетов -- очень большой шанс напороться
> на ещё более неприятные грабли с разрывом цепочки, чем уже
> предсказанные и происшедшие с BuildRequires (см. тж. buildreq -u):
> http://lists.altlinux.org/pipermail/devel/2007-March/137289.html

Если пакет A строго требует пакеты B и C, а пакет B строго требует пакет C,
то удаление из пакета A зависимости на пакет С логически ничего не меняет:
а именно, сохраняется гарантия, что при установке или обновлении пакета A
будет установлен пакет C, как если бы он был напрямую указан в
зависимостях пакета A.

Другими словами, rpm работает правильно, а грабли в других местах -
это грабли в других местах.


Подробная информация о списке рассылки Devel