Из-за этой проблемы 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 шаге.
Created attachment 10219 [details] 0001-Removing-caches-also-removes-in-memory-repository-me.patch Данный патч вместе с packagekit из задания #294207 исправляет данную проблему.
Спасибо за патч. Проблему в целом понял. Тогда в ближайшем релизе учту и учту в своих тестах. Только я пока не сообразил, исправляет ли добавление виртуальных деструкторов (и в packagekit, и в apt) что-то в имеющемся поведении или это просто хорошая практика на будущее?
Если добавленный виртуальный деструктор в патче для apt убрать, то вылезет какое-то предупреждение про его отсутствие, и -Werror по-умолчанию превратит его в ошибку.
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; } /*}}}*/
Вполне уверен, что патч работает, так что сразу закомичу (замечания принимаю и до, и после), если ничто не помешает в сборочнице. И так потестируем более широко. task 294177 (собирается пока test-only)
(Ответ для Ivan Zakharyaschev на комментарий #4) > Создано вложение 10230 [details] [подробности] > invalidate the in-memory cache Данный патч не накладывается на apt 0.5.15lorg2-alt74. (Ответ для Ivan Zakharyaschev на комментарий #5) > Вполне уверен, что патч работает, так что сразу закомичу (замечания принимаю > и до, и после), если ничто не помешает в сборочнице. И так потестируем более > широко. > > task 294177 (собирается пока test-only) Посмотрю.
Насколько я могу судить после небольшой проверки, с apt из указанного задания проблема исчезает.
(In reply to Aleksei Nikiforov from comment #7) > Насколько я могу судить после небольшой проверки, с apt из указанного > задания проблема исчезает. Спасибо!
Будем ждать, наверное, питона. А я доработаю FileList
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.
Проверил в p10 с таском 295130 - ошибка исправлена.
Проблема остается в р9, т.к. там версия пакета ниже той, где ошибка исправлена: apt-0.5.15lorg2-alt71.3