Bug 60847
| Summary: | apt-get -s ложно сообщает "E: Conf Broken" при замене установленного пакета через Obsoletes (Provides+Obsoletes того же имени) | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Alexander Makeenkov <amakeenk> |
| Component: | apt | Assignee: | placeholder <placeholder> |
| Status: | NEW --- | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P5 | CC: | boyarsh, glebfm, imz, ldv, placeholder |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||

Description
Alexander Makeenkov 2026-10-07 10:18:13 MSKПри попытке посмотреть план установки/обновления через симуляцию ("apt-get install -s", "apt-get dist-upgrade -s") apt помечает план сломанным с ошибкой "E: Conf Broken <пакет>", если устанавливаемый пакет заменяет установленный через одновременное Provides и Obsoletes того же имени (стандартная схема слияния подпакета в основной пакет): Provides: <старое-имя> = %EVR Obsoletes: <старое-имя> < %EVR При этом реальная (без -s) установка/dist-upgrade выполняются штатно, и "rpm -Uvh --test" пакета проходит успешно — метаданные корректны, ломается только режим симуляции apt. Шаги воспроизведения ==================== 1. Установить пакет demo-color-1:1.0-alt1: Name: demo-color Epoch: 1 Version: 1.0 Release: alt1 2. Поместить в репозиторий пакет demo-1:2.0-alt1: Name: demo Epoch: 1 Version: 2.0 Release: alt1 Provides: demo-color = 1:2.0-alt1 Obsoletes: demo-color < 1:2.0-alt1 3. Симуляция: # apt-get install -s demo Следующие пакеты будут ЗАМЕНЕНЫ: demo-color (by demo) Следующие НОВЫЕ пакеты будут установлены: demo 0 будет обновлено, 1 новых установлено, 1 пакетов будет заменено, 0 пакетов будет удалено и 0 не будет обновлено. Inst demo (1:2.0-alt1) [demo on demo-color] [] Conf demo broken Obsoletes:demo-color [] E: Conf Broken demo (код возврата 100) 4. Реальная установка — успешна: # apt-get install demo Следующие пакеты будут ЗАМЕНЕНЫ: demo-color (by demo) ... Совершаем изменения... Обновление / установка... Очистка / удаление... Завершено. (demo-color корректно удаляется, код возврата 0) 5. Для контраста: "rpm -Uvh --test demo-2.0-alt1.noarch.rpm" проходит с кодом 0. Фактический результат ===================== apt-get -s / dist-upgrade -s помечают пакет "broken" и возвращают E: Conf Broken <пакет> (rc=100), из-за чего любые инструменты и автотесты, строящие план через симуляцию, получают ложную ошибку. Ожидаемый результат =================== Симуляция строит тот же план, что и реальная установка: замена demo-color на demo без ошибок, rc=0. Живой триггер в p11 =================== Задание p11+433924 (fonts-ttf-google-noto-emoji-1:2.051-alt1) слило бывший подпакет fonts-ttf-google-noto-emoji-color в основной пакет с такой же парой Provides/Obsoletes. На любой системе p11 с установленным fonts-ttf-google-noto-emoji-color-1:2.042-alt1 (штатно входит в Workstation 11.2): # apt-get update # apt-get dist-upgrade -s ... E: Conf Broken fonts-ttf-google-noto-emoji Реальный "apt-get dist-upgrade" при этом проходит штатно. Анализ (по исходникам packages/gears/a/apt.git) =============================================== 1. Различие путей (cmdline/apt-get.cc): при -s после работы pkgProblemResolver вызывается pkgSimulate (apt-pkg/algorithms.cc), которая проигрывает операции; реальный прогон идёт через pkgRPMPackageManager, и rpm сам корректно обрабатывает obsoletes. 2. Ошибки рождаются в pkgSimulate: - algorithms.cc:111 "Fatal, conflicts violated %s" (pkgSimulate::Install) - algorithms.cc:167 "Conf Broken %s" (pkgSimulate::Configure, условие Sim[Pkg].InstBroken()==true) 3. pkgDepCache::CheckDep (apt-pkg/depcache.cc): для Dep::Obsoletes после проверки версии base-пакета стоит безусловный "return false" — provides не учитываются и, главное, не учитывается пометка цели на удаление; удовлетворённость obsoletes-зависимости фактически опирается на Now-состояние цели. 4. pkgDepCache::MarkInstallRec (apt-pkg/depcache.cc, обработка Conflicts/Obsoletes): цель помечается на удаление только если "InstallVer == конфликтующая версия"; для уже помеченной на удаление цели (InstallVer==0) происходит continue, что при повторном проходе (pkgSimulate::Install вызывает MarkInstall заново) даёт рассинхрон состояния depcache и ложный InstBroken(). Возможные направления исправления: либо учитывать Delete-флаг цели в CheckDep для Obsoletes (obsoletes-зависимость считается удовлетворённой, если цель помечена на удаление), либо синхронизировать pkgSimulate с реальным путём pkgRPMPackageManager для этого случая. Дополнительно ============= Похожее ложное срабатывание в режиме -s наблюдается и для других конфликтующих обновлений ветки: на актуальном p11 "apt-get dist-upgrade -s" дополнительно выдаёт "E: Fatal, conflicts violated xxd" (vim/xxd), хотя реальный dist-upgrade обновляет xxd штатно. Вероятно, та же категория проблемы pkgSimulate, но с версионным Conflicts; при необходимости могу прислать отдельный минимальный пример и для этого случая. Смежный баг (похожая область кода — обработка Conflicts/Obsoletes при совпадении имён с Provides, но другой сценарий: self-conflict при --reinstall и реальный, а не симулированный прогон): https://bugzilla.altlinux.org/36421 Окружение проверки ================== - Sisyphus: ALT Server 11.2sisyphus_alpha (Mendelevium), apt-0.5.15lorg2-alt103, воспроизведено на синтетических пакетах demo / demo-color (локальный репозиторий). - p11: ALT Workstation 11.2 (Prometheus), apt 0.5.15lorg2 (сборка от 26.01.2026), воспроизведено на живом примере fonts-ttf-google-noto-emoji (p11+433924).