Bug 37162 - crash with new apt
Summary: crash with new apt
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: apt (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: darktemplar@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-08-30 11:35 MSK by Sergey V Turchin
Modified: 2019-09-19 18:48 MSK (History)
10 users (show)

See Also:


Attachments
Crash info (2.01 KB, text/plain)
2019-08-30 11:35 MSK, Sergey V Turchin
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Sergey V Turchin 2019-08-30 11:35:19 MSK
Created attachment 8266 [details]
Crash info

Стал стабильно падать apt-indicator-checker.

apt-indicator-0.3.12-alt4.x86_64
apt-0.5.15lorg2-alt71.x86_64
Comment 1 Aleksei Nikiforov 2019-08-30 13:05:37 MSK
Подтверждаю. Воспроизводится хорошо, буду смотреть.
Comment 2 Aleksei Nikiforov 2019-08-30 14:44:41 MSK
Просто пересборка apt-indicator исправила проблему для меня. Вчера apt-indicator собирался с apt-0.5.15lorg2-alt70, а затем был собран ещё apt-0.5.15lorg2-alt71. Возможно, что-то отвалилось при этом. Попробуй задание #236911.
Comment 3 Aleksei Nikiforov 2019-08-30 15:06:27 MSK
Задание #236911 с пересобранным apt-indicator ушло в Сизиф.
Comment 4 Ivan Zakharyaschev 2019-09-18 13:40:34 MSK
(In reply to comment #2)
> Просто пересборка apt-indicator исправила проблему для меня. Вчера
> apt-indicator собирался с apt-0.5.15lorg2-alt70, а затем был собран ещё
> apt-0.5.15lorg2-alt71. Возможно, что-то отвалилось при этом. Попробуй задание
> #236911.

Так что по сути это проблема в сборке apt -- что мы недоглядели, что существующий ABI поменялся и нужно было менять soname.

Хотел бы лучше понять, в чём тут была причина и -- на будущее -- на что смотреть ещё, если я не понимал раньше, что это относится к случаям, когда необходимо менять soname.

Мне при том просмотре изменений в 0.5.15lorg2-alt71 показалось, что там только добавляются новые функции (так что нестрашно: зависимости с set-versions у пакетов клиентов всё равно не позволят подсунуть им неподходящий libapt).

Но теперь вижу, что в класс pkgCacheFile в cachefile.h добавилось поле (pkgSourceList *SrcList), не в конец структуры (если смотреть на порядок объявления). (По крайней мере иногда добавление поля в конец структуры не приводит к слому ABI для старых клиентов, как известно. Например, если они передают в API указатели на одиночные структуры, но не указатели на массивы этих структур или просто копии. Правда, новых клиентов, использующих это поле, всё же можно сломать, подсунув старый libapt и никто ничего не заметит.)

Могло ли именно это вызвать это падение apt-indicator?..

Там в dist-upgrade.cpp в функции update на строчке 252 и в функции dist_upgrade на строчке 267 действительно заводятся локальные переменные pkgCacheFile Cache.

Так что этот хедер и класс вполне себе публичные (кто-то из клиентов их использует), и такое изменение должно было сопровождаться сменой soname.

Правда, в crash log-е падение не совсем в этом месте:

#0  pkgSourceList::~pkgSourceList (this=0x7fffffffd8a0, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_iterator.h:796
#1  0x0000000000407fb1 in DistUpgrade::update (this=0x42f000) at dist_upgrade.cpp:190
#2  0x0000000000408e08 in DistUpgrade::start (this=0x42f000) at dist_upgrade.cpp:400

а в функции update в строчке пораньше. Правда, уже не очень хочется разбираться дальше, как это падение произошло. Возможно, действительно, из-за изменения класса pkgCacheFile; а каким образом оно повлияло и привело к падению именно здесь, затрудняюсь сказать.

В остальном (помимо этого поля) в изменениях в хедерах в alt71 нет ничего страшного, что могло бы привести к падению: добавление функций или невиртуальных митодов (что то же самое) -- они на вид структуры не должны повлиять.

* * *

Конечно, если какие-то клиенты libapt после alt71 всё же не были экстренно пересобраны, то им угрожает опасность падения. (Есть подозрения на счёт непересборки apt-repo-tools, но возможно, оно и так работает, если там не используются изменённые ABI.)
Comment 5 Anton Farygin 2019-09-18 13:45:26 MSK
цифирек не жалко, можно увеличивать soname при любом изменении ABI.
Бинарная совместимость нам тут ни с кем не нужна.
Comment 6 Ivan Zakharyaschev 2019-09-18 13:54:56 MSK
(In reply to comment #5)
> цифирек не жалко, можно увеличивать soname при любом изменении ABI.
> Бинарная совместимость нам тут ни с кем не нужна.

Вот бы ещё был упрощённый путь получения approve на чистый rebuild, более автоматический.
Comment 7 Aleksei Nikiforov 2019-09-18 13:57:44 MSK
(В ответ на комментарий №6)
> (In reply to comment #5)
> > цифирек не жалко, можно увеличивать soname при любом изменении ABI.
> > Бинарная совместимость нам тут ни с кем не нужна.
> 
> Вот бы ещё был упрощённый путь получения approve на чистый rebuild, более
> автоматический.

Проблема в том, как определить, rebuild чистый или нет. Простая пересборка пакета с новыми версиями зависимостей или сборочной инфраструктуры может дать другой результат. Простой пример: тихо перестанет находиться какая-то зависимость по неопределённой причине, и вот уже пересобранный пакет будет без некоторых фич. А пересобрался пакет без видимых при беглом просмотре проблем. Приходилось уже видеть такое.
Comment 8 Ivan Zakharyaschev 2019-09-18 13:58:44 MSK
(In reply to comment #4)

> смотреть ещё, если я не понимал раньше, что это относится к случаям, когда
> необходимо менять soname.
> 
> Мне при том просмотре изменений в 0.5.15lorg2-alt71 показалось, что там только
> добавляются новые функции (так что нестрашно: зависимости с set-versions у
> пакетов клиентов всё равно не позволят подсунуть им неподходящий libapt).
> 
> Но теперь вижу, что в класс pkgCacheFile в cachefile.h добавилось поле
> (pkgSourceList *SrcList), не в конец структуры (если смотреть на порядок
> объявления). (По крайней мере иногда добавление поля в конец структуры не
> приводит к слому ABI для старых клиентов, как известно. Например, если они
> передают в API указатели на одиночные структуры, но не указатели на массивы

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

> этих структур или просто копии. Правда, новых клиентов, использующих это поле,
> всё же можно сломать, подсунув старый libapt и никто ничего не заметит.)
Comment 9 Ivan Zakharyaschev 2019-09-18 13:59:44 MSK
(In reply to comment #7)
> (В ответ на комментарий №6)
> > (In reply to comment #5)
> > > цифирек не жалко, можно увеличивать soname при любом изменении ABI.
> > > Бинарная совместимость нам тут ни с кем не нужна.
> > 
> > Вот бы ещё был упрощённый путь получения approve на чистый rebuild, более
> > автоматический.
> 
> Проблема в том, как определить, rebuild чистый или нет. Простая пересборка
> пакета с новыми версиями зависимостей или сборочной инфраструктуры может дать
> другой результат. Простой пример: тихо перестанет находиться какая-то
> зависимость по неопределённой причине, и вот уже пересобранный пакет будет без
> некоторых фич. А пересобрался пакет без видимых при беглом просмотре проблем.
> Приходилось уже видеть такое.

Согласен, что такая проблема есть.
Comment 10 Ivan Zakharyaschev 2019-09-18 14:03:50 MSK
(In reply to comment #4)

> Конечно, если какие-то клиенты libapt после alt71 всё же не были экстренно
> пересобраны, то им угрожает опасность падения. (Есть подозрения на счёт
> непересборки apt-repo-tools, но возможно, оно и так работает, если там не
> используются изменённые ABI.)

Даже неэкстренно, пересобрать сейчас (если вдруг что-то не пересобрали) -- вполне уместно и невредно.

Потому что alt70 (soname change) и alt71 (слом ABI) были собраны в один день (во все бранчи), поэтому у людей под последним soname могла оказаться только libapt из alt71. С ней и должны правильно работать клиенты, а про поддержку правильно работы с alt70 можно забыть.
Comment 11 Anton Farygin 2019-09-18 14:05:59 MSK
(В ответ на комментарий №7)
> (В ответ на комментарий №6)
> > (In reply to comment #5)
> > > цифирек не жалко, можно увеличивать soname при любом изменении ABI.
> > > Бинарная совместимость нам тут ни с кем не нужна.
> > 
> > Вот бы ещё был упрощённый путь получения approve на чистый rebuild, более
> > автоматический.
> 
> Проблема в том, как определить, rebuild чистый или нет. Простая пересборка
> пакета с новыми версиями зависимостей или сборочной инфраструктуры может дать
> другой результат. Простой пример: тихо перестанет находиться какая-то
> зависимость по неопределённой причине, и вот уже пересобранный пакет будет без
> некоторых фич. А пересобрался пакет без видимых при беглом просмотре проблем.
> Приходилось уже видеть такое.

ну у нас же сизиф, всем очевидно что тут переодически может что-то взрываться. Такое надо проверять тестированием и желательно автоматическим.
Comment 12 Dmitry V. Levin 2019-09-18 14:07:46 MSK
Для этого пакета у меня есть идея перманентного фикса, расскажу по возвращении.
Comment 13 Ivan Zakharyaschev 2019-09-19 18:46:53 MSK
Проверил по индексу репозиториев, какие пакеты не пересобирались после apt (скриптом http://git.altlinux.org/people/imz/public/postgirar.git?p=postgirar.git;a=commit;h=429e4cf33587898ce0bce91b4dd5c62eab18c2ee ).

Только apt-repo-tools в sisyphus. Отправил пересобраться (на всякий случай). Задание 237834; прошу одобрить (Глеба, в первую очередь).
Comment 14 Ivan Zakharyaschev 2019-09-19 18:48:10 MSK
(In reply to comment #13)
> Проверил по индексу репозиториев, какие пакеты не пересобирались после apt
> (скриптом
> http://git.altlinux.org/people/imz/public/postgirar.git?p=postgirar.git;a=commit;h=429e4cf33587898ce0bce91b4dd5c62eab18c2ee
> ).

$ ./postgirar-built-earlier sisyphus apt apt-indicator apt-repo-tools aptitude packagekit perl-AptPkg synaptic
apt-repo-tools
$ ./postgirar-built-earlier p9 apt apt-indicator apt-repo-tools aptitude packagekit perl-AptPkg synaptic
$ 

> Только apt-repo-tools в sisyphus. Отправил пересобраться (на всякий случай).
> Задание 237834; прошу одобрить (Глеба, в первую очередь).