Summary: | libapt кэширует информацию о подключенных репозиториях без API для её удаления или обновления | ||||||||
---|---|---|---|---|---|---|---|---|---|
Product: | Branch p9 | Reporter: | Aleksei Nikiforov <darktemplaralt> | ||||||
Component: | apt | Assignee: | Ivan Zakharyaschev <imz> | ||||||
Status: | REOPENED --- | QA Contact: | qa-p9 <qa-p9> | ||||||
Severity: | normal | ||||||||
Priority: | P5 | CC: | amakeenk, belayaav, boyarsh, glebfm, imz, ldv, placeholder, rider, zerg | ||||||
Version: | не указана | ||||||||
Hardware: | all | ||||||||
OS: | Linux | ||||||||
Bug Depends on: | |||||||||
Bug Blocks: | 41651 | ||||||||
Attachments: |
|
Description
Aleksei Nikiforov
2022-01-27 15:42:13 MSK
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 |