Summary: | rpmbuild: некорректная реализация %_deps_optimization: | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | viy <viy> |
Component: | rpm-build | Assignee: | placeholder <placeholder> |
Status: | NEW --- | QA Contact: | qa-sisyphus |
Severity: | normal | ||
Priority: | P3 | CC: | arseny, glebfm, imz, ldv, placeholder, vt |
Version: | unstable | ||
Hardware: | all | ||
OS: | Linux |
Description
viy
2018-02-22 15:50:05 MSK
(In reply to comment #0) > пример: src rpm с 6000 подпакетов, > http://autoextra.altlinux.org/pub/ALTLinux/rpmbuild-badmem/OUT.1/texlive-2016-alt0.24_39.20160520.src.rpm > %_deps_optimization выключена, собирается за час, из них запись rpm 3 мин. > > Если для этого пакета в спеке включить %_deps_optimization, то > %_deps_optimization выполняется более 3 суток > (дольше терпения не хватило ждать). > > Как я понимаю, проблема связана с rpm API. > Код %_deps_optimization имеет вид > > for i по подпакетам: > for j по подпакетам: > [...] > изменитьRPMHeader(i) > > а внутри изменитьRPMHeader() происходит какое-то тяжелое действие, > (позможно, пересжатие бинарного rpm)? > поэтому код выполняется так долго, как 6000*6000 сохранений rpm = > = 6000*(6000 сохранений=3мин) = 10 суток. > > исправленный код должен выглядеть, например, как-то так: > > for i по подпакетам: > for j по подпакетам: > [...] > изменитьRPMHeader(i, только header в памяти) > > for i по подпакетам: > сохранитьRPMHeader(i) Сейчас алгоритм, грубо говоря, выглядит так: for i по подпакетам: for Di по зависимостям подпакета i: подумать(i, Di) for j по подпакетам: for Dj по зависимостям подпакета j: подумать(i, Di, i, Dj) изменитьRPMHeaderвПамяти(i) for i по подпакетам: сохранитьRPMHeader(i) гм. тогда я ошибся, поблема в чем-то другом. Тогда, если скрытых проблем нет, то это не баг, а фича - имплементация алгоритма с полиномиальной зависимостью времени исполнения от числа подпакетов. Для большинства пакетов работает, а для крайних случаев есть ручка, чтобы выключить. Если будет когда-нибудь стажер, можно дать ему задачу - написать для rpm 4.13 линейный по времени алгоритм. можно ставить в RESOLVED-WORKSFORME. |