On 2024-11-04 13:15, Laurent Bigonville wrote:
> With the unshare backend(?) it seems that rebuilding a package without
> changing the version is causing test to fail becuase it consider the
> same version as a downgrade.
> 
> For example:
> 
> apt-get source libselinux
> cd libselinux-3.7
> autopkgtest -U -- unshare
> 
> The tests fail with something like:
> 
> The following NEW packages will be installed:
>   libpcre2-16-0 libpcre2-32-0 libpcre2-dev libpcre2-posix3 libpkgconf3 
> libselinux1-dev libsepol-dev libsepol2 pkg-config pkgconf pkgconf-bin
> The following packages will be DOWNGRADED:
>   libselinux1
> 0 upgraded, 11 newly installed, 1 downgraded, 0 to remove and 0 not upgraded.
> E: Packages were downgraded and -y was used without --allow-downgrades.
> E: Failed to process build dependencies
> build                FAIL badpkg

Very interesting bug that brought me deep into some apt internals.
This is not virt-server specific.

When the problem you describe happens we have a version table like this:

libselinux1:
  Installed: 3.7-3
  Candidate: 3.7-3
  Version table:
 *** 3.7-3 500
        500 http://deb.debian.org/debian trixie/main amd64 Packages
        100 /var/lib/dpkg/status
     3.7-3 1002
       1002 file:/tmp/autopkgtest.MYagqq/binaries  Packages

When built binaries are made available to the testbed, autopkgtest does
a `apt-get install --reinstall` for those that are already installed, to
enforce usage of the locally built ones. For some reason this is seen as
a downgrade (despite the identical version), but this is fine, as this
operation is done with APT::Get::force-yes=true (see adt_binaries.py).

*However*, if you check the policy table at this point, it will
identical to the previous one. APT has no way to determine the real
source of an installed package: it only knows about _versions_ of
installed packages. [Note how /var/lib/dpkg/status, which contains info
on the installed packages, has no SHA256 for packages.]

Not knowing better, APT assumes that that an installed package comes
from the *first* APT source that provides that version. In our case, it
assumes that libselinux1 3.7-3 comes from deb.debian.org; this is
visible because the "status" source and deb.debian.org are together in
the version table.

This means: APT still thinks the Priority: 1002 package is different
from the installed one, and that we should install (downgrade to) it
when installing the test deps. The test deps are not installed with
APT::Get::force-yes=true, and we get to the failure you encountered.

Is this a (recent) regression? I don't think so. APT behavior on
comparing packages changed in version 2.7.3 to fix #931175, but that
happened in August 2023.

Now, on how to fix this. I can think of two possibilities:

1. We install the test deps with APT::Get::force-yes=true. What would
happen is that we get multiple "downgrades" of the package, every time
we try to reinstall/upgrade it.

2. We move /etc/apt/sources.list *last* in the list of sources, e.g. to
/etc/apt/sources.list/zz-sources.list. This is more correct, but should
be done carefully. You can play with with workaround by passing:

    --setup-commands="mv /etc/apt/sources.list
/etc/apt/sources.list.d/zz-sources.list"

And we need a test case for this, as it's way too easy to regress.

Open question: why APT considers reinstalling the same version a downgrade?

Thanks Julian (Cc:) for explaining me most of APT things above.

--
Paride

Reply via email to