Bug 21793

Summary: /etc/cron.{daily,weekly}/makewhatis
Product: Sisyphus Reporter: Valery Inozemtsev <shrek>
Component: manAssignee: Alexey Gladkov <legion>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: major    
Priority: P3 CC: aen, asy, dd1email, ldv, mike, sem, voins
Version: unstable   
Hardware: all   
OS: Linux   

Description Valery Inozemtsev 2009-09-30 19:59:08 MSD
совершенно не понятен тайный смысл ежедневного запуска по крону makewhatis. операция это ресурсоемкая и не быстрая. и самое место ей в постинстал пакетов с манами (к тому же оно там есть), например
$ rpmquery --scripts man-pages
Comment 1 Dmitry V. Levin 2009-09-30 22:57:36 MSD
Не blocker и даже не critical, всё же работает, только не всегда очень быстро.
Comment 2 Valery Inozemtsev 2009-09-30 23:03:05 MSD
скорость не объясняет тайного смысла этой работы
Comment 3 Alexey Gladkov 2009-09-30 23:40:37 MSD
(В ответ на комментарий №2)
> скорость не объясняет тайного смысла этой работы

Валер, я же тебе рассказывал зачем так было сделано. man-страницы есть не только в man-pages{,-ru,-uk}... они в многих пакетах, но (как ты правильно заметил) эта операция длинная, то в %post-скриптах пакетов её вызывать очень дорого. Поэтому в те далёкие времена был сделан аналог триггеров. Разница в том, что программы ставят руками и маны тоже. Поэтому cron.

Вот то что makewhatis не умеет обновлять индекс, а пересоздаёт его каждый раз снова это действительно очень плохо.
Comment 4 Dmitry V. Levin 2009-10-01 01:00:36 MSD
/etc/cron.daily/makewhatis, который запускает "makewhatis -u", выполняется достаточно быстро, поскольку он просто делает find.  Запуск "makewhatis -u" при желании можно завернуть в триггер.
Comment 5 Alexey Gladkov 2009-10-01 01:26:53 MSD
(В ответ на комментарий №4)
> /etc/cron.daily/makewhatis, который запускает "makewhatis -u", выполняется
> достаточно быстро, поскольку он просто делает find.  Запуск "makewhatis -u" при
> желании можно завернуть в триггер.

Способ соединения довольно суровый:

[ ! -s "$destdir/whatis" ] || cat "$destdir/whatis" >> "$TMPFILE"
tr -s '\n' < "$TMPFILE" | LC_COLLATE=C sort -u > "$destdir/whatis"

мне кажется проще сделать -newer $destdir/whatis и не сортировать whatis каждый день (кто такое только придумал?!), даже если он не изменился.
Comment 6 Dmitry V. Levin 2009-10-01 01:35:46 MSD
(In reply to comment #5)
> (В ответ на комментарий №4)
> > /etc/cron.daily/makewhatis, который запускает "makewhatis -u", выполняется
> > достаточно быстро, поскольку он просто делает find.  Запуск "makewhatis -u" при
> > желании можно завернуть в триггер.
> 
> Способ соединения довольно суровый:
> 
> [ ! -s "$destdir/whatis" ] || cat "$destdir/whatis" >> "$TMPFILE"
> tr -s '\n' < "$TMPFILE" | LC_COLLATE=C sort -u > "$destdir/whatis"
> 
> мне кажется проще сделать -newer $destdir/whatis и не сортировать whatis каждый
> день (кто такое только придумал?!), даже если он не изменился.

Можно сделать -cnewer, можно выкинуть tr и просто написать LC_COLLATE=C sort -u -o "$TMPFILE" "$TMPFILE" с последующим cmp.
Хотя, с другой стороны, эта часть и так быстро работает, зачем её улучшать?
Жалуются ведь на makewhatis без -u.
Comment 7 Alexey Gladkov 2009-10-01 02:14:27 MSD
(В ответ на комментарий №6)
> Можно сделать -cnewer, можно выкинуть tr и просто написать LC_COLLATE=C sort -u
> -o "$TMPFILE" "$TMPFILE" с последующим cmp.

Проще всего, если $TMPFILE пуст не делать sort вообще.

> Хотя, с другой стороны, эта часть и так быстро работает, зачем её улучшать?

Если программа не эффективна в некоторых режимах, то это не значит, что её не нужно улучшать.

> Жалуются ведь на makewhatis без -u.

Можно добавить этот ключ, можно перенести эту команду в триггер, чтобы выполнение производилось только при установке новых страниц, но я бы хотел поднять более радикальный вопрос: нужен ли whatis вообще ?

Из общения с разными разработчиками я понял, что этим (почти?) никто не пользуется. Я не против улучшать и поддерживать полезную функциональность, но никому не нужную ...
Comment 8 Sergey Y. Afonin 2009-10-01 12:25:15 MSD
> /etc/cron.daily/makewhatis, который запускает "makewhatis -u", выполняется
> достаточно быстро, поскольку он просто делает find. 

find, сам по себе, может выполняться долго. У меня этот процесс тоже не торопится. А где он, кстати, ищет ? Точно только в mandir ?
Comment 9 Alexey Gladkov 2009-10-01 13:40:46 MSD
(В ответ на комментарий №8)
> find, сам по себе, может выполняться долго. У меня этот процесс тоже не
> торопится. А где он, кстати, ищет ? Точно только в mandir ?

Да.

for mandir in $manpath; do
...
   for i in $SECTIONS; do
...
Comment 10 Michael Shigorin 2009-10-05 20:13:42 MSD
(In reply to comment #7)
> нужен ли whatis вообще ?
См. bug #21838
Comment 11 Alexey Gladkov 2009-10-05 22:19:11 MSD
(В ответ на комментарий №10)
> См. bug #21838

Этот FR не содержит ответ на мой вопрос.
Comment 12 Michael Shigorin 2009-10-05 22:33:56 MSD
По-моему, закрыть этот FR достаточно, чтоб вопрос не стоял перед тобой. :)

Говоря за себя -- очень редко, но пользуюсь.  Сейчас документацию (в т.ч. man-pages) всё равно обычно изучаю сперва через прицел поисковика.
Comment 13 Alexey Gladkov 2009-10-05 22:53:08 MSD
(В ответ на комментарий №12)
> По-моему, закрыть этот FR достаточно, чтоб вопрос не стоял перед тобой. :)

Я от проблем не бегу. Если есть проблема с производительностью, то её нужно решать.

> Говоря за себя -- очень редко, но пользуюсь.  Сейчас документацию (в т.ч.
> man-pages) всё равно обычно изучаю сперва через прицел поисковика.

Это подтверждает моё мнение о том, что эта ущербная база бесполезна.
Я бы вообще выкинул whatis куда подальше в том виде в котором это есть сейчас.

Для тех у кого нет интернета, но кому хочется поискать по тексту манов, я могу сделать скрипт, позволяющий делать рекурсивный поиск по текстам man-страниц. Это не сложно.
Comment 14 Michael Shigorin 2009-10-06 01:47:24 MSD
Даже лучше есть -- индексаторы.
Comment 15 Alexey Gladkov 2009-10-06 01:53:58 MSD
(В ответ на комментарий №14)
> Даже лучше есть -- индексаторы.

Именно. И они хранят данные более эффективно.
Comment 16 Michael Shigorin 2011-03-26 11:07:04 MSK
Лёш, давай хоть cronjob заремарим?.. а то пока обсуждаем, народ продолжает мучиться: http://lists.altlinux.org/pipermail/antique/2011-March/000972.html

BTW могу обкатать предложения в 5.1, если в сизифе всё так сложно.
Comment 17 Alexey Gladkov 2011-03-26 18:07:16 MSK
Неожиданная мысль: может вместо распиливания сделать управлялку в /etc/sysconfig ?
Comment 18 Michael Shigorin 2011-03-26 20:03:11 MSK
Я бы лучше отпилил -- не надо, не добавляешь в дистрибутив (или rpm -e) и всё.
Но если по каким-либо соображениям это претит -- то хоть ручку, просто к ней придётся громоздить ещё хук/installer-feature.
Comment 19 Mikhail Efremov 2011-12-22 21:35:43 MSK
Я немного переделал makewhatis и научил его удалять записи из базы.
Также добавил файлтриггер и распилил man на man-base и man-whatis.
apt-get install --reinstall man-pages занимает у меня примерно 3-4 минуты.
Это довольно много, но все равно это лучше, чем постоянное пересоздание базы каждый день (у меня это занимает 8-9 минут). К тому же пакеты с таким большим количеством манов обновляются редко, в обычных пакетах их все-таки немного.
Ну и база будет актуальна сразу после установки пакета, а не наследующий день, что тоже приятно. А кому это не надо - снесут man-whatis вместе с триггером.
При установке же этого пакета запустится создание базы, что не быстро. Но это один раз, обновления быстрее.
Предлагаю собрать это и закрыть, наконец, эту багу и #21838.
Правда, еще придется выкинуть makewhatis из %post тех пакетов man-pages-*, где это еще не сделано. Но это тривиально.

http://git.altlinux.org/people/sem/packages/man.git?p=man.git;a=shortlog;h=refs/heads/makewhatis-reworked
Comment 20 Mikhail Efremov 2011-12-22 21:46:07 MSK
> Это довольно много, но все равно это лучше, чем постоянное пересоздание базы
> каждый день (у меня это занимает 8-9 минут).

А, ну да, там же -u в daily, это довольно быстро. Так что не каждый день, а каждую неделю. Но не суть, все равно лучше файлтриггер, чем по крону, зато база будет актуальной.
Comment 21 Mikhail Efremov 2011-12-26 17:37:08 MSK
> apt-get install --reinstall man-pages занимает у меня примерно 3-4 минуты.

После оптимизации, предложенной ldv@, время сократилось до полутора минут. Быстрее сделать уже проблематично.
Comment 22 Michael Shigorin 2011-12-26 18:44:34 MSK
Думаю, приемлемо.
Comment 23 Mikhail Efremov 2012-06-19 18:58:38 MSK
ping
Comment 24 AEN 2012-06-20 01:33:28 MSK
2legion@: Алексей, что думаете о предложении sem@ ?
Comment 25 Repository Robot 2012-06-20 02:50:35 MSK
man-1.6f-alt13 -> sisyphus:

* Wed Jun 20 2012 Alexey Gladkov <legion@altlinux> 1.6f-alt13
- Replace makewhatis with ALT-specific script and move whatis in
  subpackage (ALT#21793) (thx Mikhail Efremov).
Comment 26 AEN 2012-06-20 02:53:40 MSK
Коллеги, спасибо!
Comment 27 Michael Shigorin 2012-06-20 12:22:09 MSK
Ур-ра! :)