Bug 40519 - syskeeper RPM::Pre-Install-Pkgs hook fails on massive APT updates
Summary: syskeeper RPM::Pre-Install-Pkgs hook fails on massive APT updates
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: syskeeper (show other bugs)
Version: unstable
Hardware: all Linux
: P5 major
Assignee: Nikolay A. Fetisov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2021-07-17 12:21 MSK by Nikolay A. Fetisov
Modified: 2023-08-11 16:23 MSK (History)
1 user (show)

See Also:


Attachments
Fix syskeeper hook to avoid SIGPIPE on STDIN buffer overflow (450 bytes, patch)
2021-07-17 12:21 MSK, Nikolay A. Fetisov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Nikolay A. Fetisov 2021-07-17 12:21:33 MSK
Created attachment 9520 [details]
Fix syskeeper hook to avoid SIGPIPE on STDIN buffer overflow

Для syskeeper-0.11-alt1 для крупных обновлений системы (где-то от 700 пакетов), в ходе 
работы syskeeper в обработчике RPM::Pre-Install-Pkgs возникает ошибка, блокирующая работу APT:

# apt-get dist-upgrade
....
1179 будет обновлено, 1 новых установлено, 3 пакетов будет заменено, 2 пакетов будет удалено и 4 не будет обновлено.
Необходимо получить 0B/1058MB архивов.
После распаковки потребуется дополнительно 26,6MB дискового пространства.
Продолжить? [Y/n]   Y
E: Ошибка записи - write (32 Обрыв канала)
E: Ошибка выполнения скрипта if [ -x /usr/sbin/syskeeper ]; then /usr/sbin/syskeeper; fi
#


Согласно apt.conf(5), для RPM::Pre-Install-Pkgs APT передаёт в обработчик список файлов
устанавливаемых пакетов, в виде полных путей в /var/cache/apt/archives, построчно, через
запись в STDIN. Текущие версии APT в имена файлов добавляют DistTag - итог получается
достаточно длинный, порядка 80-100 байт на имя устанавливаемого пакета.

При вызове RPM::Pre-Install-Pkgs запускается /usr/sbin/syskeeper, далее APT начинает
передавать в STDIN список пакетов. syskeeper STDIN не читает, размер буфера канала,
насколько понимаю, 64k. Если список достаточно большой - буфер выбирается, и syskeeper
завершается по SIGPIPE.
Т.к. вызов RPM::Pre-Install-Pkgs при этом выдаёт ошибку - APT аварийно завершает
dist-upgrade до начала собственно обновления пакетов.

Лимит сейчас получается порядка 600-700 пакетов. Более крупные обновления невозможны.

Как вариант решения - можно пойти путём аналогичным etckeeper, запускать syskeeper
в subshell:
"xargs| (if [ -x /usr/sbin/syskeeper ]; then /usr/sbin/syskeeper; fi)";

Хотя в этом случае xargs также завершится с ошибкой, вида
xargs: echo: terminated by signal 13
, но syskeeper нормально отработает, RPM::Pre-Install-Pkgs завершится успешно,
и APT пойдёт дальше обновлять систему.


И, проблема сейчас затрагивает и M90P, и M80P. И обновления их до Sisyphus.
Comment 1 Repository Robot 2023-08-11 16:23:01 MSK
syskeeper-0.11-alt2 -> sisyphus:

 Fri Aug 11 2023 Nikolay A. Fetisov <naf@altlinux> 0.11-alt2
 - fix SIGPIPE in the RPM::Pre-Install-Pkgs hook (Closes: 40519)