Bug 41816 - libapt кэширует информацию о подключенных репозиториях без API для её удаления или обновления
Summary: libapt кэширует информацию о подключенных репозиториях без API для её удалени...
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: libapt (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Ivan Zakharyaschev
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 41651
  Show dependency tree
 
Reported: 2022-01-27 15:42 MSK by Aleksei Nikiforov
Modified: 2022-02-11 15:00 MSK (History)
8 users (show)

See Also:


Attachments
0001-Removing-caches-also-removes-in-memory-repository-me.patch (2.33 KB, patch)
2022-01-27 15:44 MSK, Aleksei Nikiforov
no flags Details | Diff
invalidate the in-memory cache (8.05 KB, patch)
2022-01-31 14:38 MSK, Ivan Zakharyaschev
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Aleksei Nikiforov 2022-01-27 15:42:13 MSK
Из-за этой проблемы packagekit при определённых условиях не может найти обновления.

Воспроизведение проблемы:

Необходим доступ к репозиторию локально или по NFS. Возможно, через rsync или http тоже можно воспроизвести при условии использования proxy.

1) Убедиться что plasma5-discover не запущен.
2) Убедиться что packagekitd не запущен, а если он запущен - выключить с помощью pkcon quit.
3) Установить для apt исплючительно следующие источники. Вывод apt-repo:

rpm [alt] file:/mnt/current x86_64 classic debuginfo
rpm [alt] file:/mnt/current noarch classic
rpm [alt] file:/mnt/current x86_64-i586 classic

4) Допустим, репозиторий с архивом примонтирован в /mnt/archive. Подключить репозиторий из архива за определённую дату меньше текущей:

ln -sv /mnt/archive/sisyphus/date/2022/01/24 /mnt/current

5) Обновить систему до указанного состояния:

apt-get update
apt-get dist-upgrade

6) Убедиться через apt-get что новых обновлений нет.
7) Запустить packagekit и проверить обновления, убедиться что их нет.

pkcon refresh
pkcon update

8) Переключить репозиторий на другую дату. Важно при этом не менять /etc/apt/sources.list или файлы в /etc/apt/sources.list.d

rm -fv /mnt/current
ln -sv /mnt/archive/sisyphus/date/2022/01/26 /mnt/current

9) Обновить репозиторий и пакеты через packagekit. На данном этапе возникает ошибка: обновления должны быть, но packagekit их не находит.

pkcon refresh
pkcon update

10) Убедиться что apt обновления находит. Сами обновления ставить не обязательно.

apt-get update
apt-get dist-upgrade

Если apt обновления не находит, значит либо система была обновлена до состояния более нового, чем первый снимок репозитория из архива, использованный на шаге 4, либо в снимке репозитория из шага 8 нет обновлений для пакетов в установленной системе и следует выбрать другие даты из архива.

Ожидаемый результат:
Наличие обновлений на 9 шаге.
Comment 1 Aleksei Nikiforov 2022-01-27 15:44:00 MSK
Created attachment 10219 [details]
0001-Removing-caches-also-removes-in-memory-repository-me.patch

Данный патч вместе с packagekit из задания #294207 исправляет данную проблему.
Comment 2 Ivan Zakharyaschev 2022-01-28 15:43:11 MSK
Спасибо за патч. Проблему в целом понял. Тогда в ближайшем релизе учту и учту в своих тестах.

Только я пока не сообразил, исправляет ли добавление виртуальных деструкторов (и в packagekit, и в apt) что-то в имеющемся поведении или это просто хорошая практика на будущее?
Comment 3 Aleksei Nikiforov 2022-01-28 15:50:00 MSK
Если добавленный виртуальный деструктор в патче для apt убрать, то вылезет какое-то предупреждение про его отсутствие, и -Werror по-умолчанию превратит его в ошибку.
Comment 4 Ivan Zakharyaschev 2022-01-31 14:38:26 MSK
Created attachment 10230 [details]
invalidate the in-memory cache

Вот такой патч должен работать, как надо. Проверил в apt-shell. Переупорядочивания действий в PackageKit не требуется (с ним).
Да и по смыслу они скорее не нужны. В Debian тоже Close() в cacheFile уничтожает поле SrcList. И в оригинальном коде PackageKit, рассчитанном на Debian, это в тот же момент и произошло бы: после скачивания новых индексов, но до построения кеша в файлах. (По скрытой ленивой зависимости внутри реализации cacheFile и у нас, и у Debian SrcList будет пересоздан при вызове BuildCaches() и т.п. в объекте cacheFile.)

Вот этот код из Debian, тоже уничтожающий SrcList:

									/*}}}*/
// CacheFile::Close - close the cache files				/*{{{*/
// ---------------------------------------------------------------------
/* */
void pkgCacheFile::Close()
{
   if (ExternOwner == false)
   {
      delete DCache;
      delete Cache;
      delete Map;
   }
   else
      ExternOwner = false;
   delete Policy;
   delete SrcList;
   if (d->WithLock == true)
   {
      _system->UnLock(true);
      d->WithLock = false;
   }

   Map = NULL;
   DCache = NULL;
   Policy = NULL;
   Cache = NULL;
   SrcList = NULL;
}
									/*}}}*/
Comment 5 Ivan Zakharyaschev 2022-01-31 14:40:34 MSK
Вполне уверен, что патч работает, так что сразу закомичу (замечания принимаю и до, и после), если ничто не помешает в сборочнице. И так потестируем более широко.

task 294177 (собирается пока test-only)
Comment 6 Aleksei Nikiforov 2022-01-31 14:46:25 MSK
(Ответ для Ivan Zakharyaschev на комментарий #4)
> Создано вложение 10230 [details] [подробности]
> invalidate the in-memory cache

Данный патч не накладывается на apt 0.5.15lorg2-alt74.

(Ответ для Ivan Zakharyaschev на комментарий #5)
> Вполне уверен, что патч работает, так что сразу закомичу (замечания принимаю
> и до, и после), если ничто не помешает в сборочнице. И так потестируем более
> широко.
> 
> task 294177 (собирается пока test-only)

Посмотрю.
Comment 7 Aleksei Nikiforov 2022-01-31 14:57:33 MSK
Насколько я могу судить после небольшой проверки, с apt из указанного задания проблема исчезает.
Comment 8 Ivan Zakharyaschev 2022-01-31 15:06:56 MSK
(In reply to Aleksei Nikiforov from comment #7)
> Насколько я могу судить после небольшой проверки, с apt из указанного
> задания проблема исчезает.

Спасибо!
Comment 9 Ivan Zakharyaschev 2022-01-31 15:09:21 MSK
Будем ждать, наверное, питона. А я доработаю FileList
Comment 10 Repository Robot 2022-02-10 03:43:18 MSK
apt-0.5.15lorg2-alt75 -> sisyphus:

 Thu Jan 27 2022 Ivan Zakharyaschev <imz@altlinux> 0.5.15lorg2-alt75
 - Invalidate the in-memory cache of repositories when doing "update" or
   ListUpdate() to be able to detect updates without exiting the process,
   e.g., PackageKit or apt-shell (ALT#41816).
 - Added apt-under-pkdirect-checkinstall subpackage
   and added a test for FileList() API via packagekit.
Comment 11 Alexander Makeenkov 2022-02-11 15:00:29 MSK
Проверил в p10 с таском 295130 - ошибка исправлена.