#1121158 apt: 3.1.x no longer upgrades MariaDB Recommends on upgrade

Package:
apt
Source:
apt
Description:
commandline package manager
Submitter:
Date:
2025-11-27 05:37:02 UTC
Severity:
normal
#1121158#5
Date:
2025-11-21 23:46:43 UTC
From:
To:
Hi,

This is a follow-up / underlying issue for Bug#1121151 against
mariadb-server ("Salsa CI 'default-mysql-server and Bookworm upgrade'
job fails due to provider plugin ABI mismatch").

While debugging that CI failure, we found that apt's resolver behaviour
changed between 3.1.8 and 3.1.10/3.1.12 in a way that leaves already
installed Recommends at old versions in a real upgrade path, which then
breaks MariaDB.

Scenario:

 - Base system: Debian 12 (bookworm)
 - First install:

    apt-get update
    apt-get install -y default-mysql-server

   I think this installs mariadb-server 1:10.11.14-0+deb12u2 and the
   Recommends mariadb-plugin-provider-* (bzip2, lz4, lzma, lzo, snappy)

 - Then I enable sid and a local repo with MariaDB 11.8.3 and upgrade
apt:

    echo 'deb http://deb.debian.org/debian sid main' >
/etc/apt/sources.list
    apt-get update
    apt-get install -y apt      # on the current system this installs
apt 3.1.12

 - Finally I try to upgrade MariaDB:

    apt-get install -y default-mysql-server

Previously, when running the same steps with apt 3.1.8, this last
command upgraded both mariadb-server and all mariadb-plugin-provider-*
Recommends to 11.8.3 from the local repo and MariaDB started fine.

Now, with apt 3.1.12, the same command upgrades mariadb-server to 11.8.3
but leaves all mariadb-plugin-provider-* at the old 10.11.14 versions
from bookworm. The system ends up with:

  - server:    11.8.3
  - providers: 10.11.14

and MariaDB fails to start with DAEMON plugin API errors, for instance:

  ERROR: mariadbd: Can't open shared library 'provider_bzip2.so'
  (errno: 8, API version for DAEMON plugin provider_bzip2 not supported
by this version of the server)

This regression is visible in CI:

 - Old passing job (before apt change): upgrades providers too:
https://salsa.debian.org/mariadb-team/mariadb-server/-/jobs/8421127

 - New failing job with apt 3.1.12: only the server is upgraded:
https://salsa.debian.org/mariadb-team/mariadb-server/-/jobs/8590614

Summary of regression:

Previously (3.1.8), "apt-get install default-mysql-server" would also
upgrade the already-installed mariadb-plugin-provider-* Recommends when
newer versions were available, so server and plugins stayed in sync.

Now (3.1.10-3.1.12), the solver considers those Recommends already
satisfied and leaves them at the old version, which in this real upgrade
path produces a broken MariaDB installation.

This seems related to enabling the new solver3 by default in 3.1.10 and
its handling of already satisfied Recommends, but the practical issue is
that a stable apt update changed resolver behaviour and broke a real
bookworm -> sid upgrade scenario that used to work.

Thanks,

Aquila Macedo

#1121158#10
Date:
2025-11-22 01:17:10 UTC
From:
To:
Hi!

Thanks for spotting this. This actually means that due to changes in
how the apt resolver works, upgrades from Bookworm to Forky are broken
for anyone running MariaDB.

I wonder what the specific change in the resolver was that caused
this, and if it was intentional or not, and if this should be fixed by
adjusting the resolver or redoing the 'default-mysql-server' or
'mariadb-server' dependencies.

#1121158#15
Date:
2025-11-22 08:24:00 UTC
From:
To:
[...]

This is a bug in the packaging which does not express those dependencies
either as versioned dependencies or breaks in either direction (which
one to pick is tricky, plugins breaking the server is _technically_
wrong as the server upgrade is breaking it, but it probably has fewer
chances of removing the server as the server breaking a plugin).

Not really. What you'll find is that the old solver has a special case
to *try* to upgrade all binary packages in a source packages together.

This has been infeasible in the new solver until last month, but may
be feasible now that we have eager Recommends. It may ultimately fail
validation against Canonical's internal solver regression test suite
(which is internal because it runs on private data reported by real
world users).

At no point did we guarantee upgrading all packages, but it is useful to
paper over bugs like this so they hit fewer users.

On the flip side even with the old solver (and once this is reinstated),
CI likely should set APT::Get::Upgrade-By-Source-Package to false to
ensure that the packaging is actually correct.

This is a misconception, APT uses the odd/even version scheme,
3.1.10 is the 11th development release of the 3.2 series (and
3.9.0 is the first development release of the 4.0 series).

While we hold each (pre-)release to the same requirements in terms
of functional stability, odd releases are allowed to make breaking
changes relative to a previous release.

That is, changes are released to development series when they are
ready, and not queued up in say experimental for a big eventual drop.

The exception are the .9 series every 5 years which break the API
and ABI; A.9.C lands in experimental first until the A{P,B}I are
finalized.

#1121158#20
Date:
2025-11-22 12:07:28 UTC
From:
To:
Am Fri, Nov 21, 2025 at 05:17:10PM -0800, schrieb Otto Kekäläinen:
Let me correct the (repeated) misconception here:
An upgrade from bookworm -> sid/forky is performed by apt/bookworm,
not by apt/forky, in the general case. More importantly, a call like
"apt install foo" is NOT representative of an upgrade.

In an upgrade (think apt full-upgrade) all installed packages are marked
for installation (which boils down to an upgrade of each package).
In an explicit install request only that package is marked for install.
Everything else happens only as needed. And as Julian explained, given
missing breaks, nothing is needed.

Now some people make these explicit install requests to selectively
upgrade ~ individual packages ~, but its not the norm. I would go as far
as saying it usually is a user error (think: "Oh my god, a CVE for foo!
Lets upgrade foo!" but foo uses the not upgraded CVE-buggy libfoo).
And as Julian mentioned the old resolver had (not always, just since
2.5.2, see NEWS) errata to make that work more consistently by assuming
the user meant to upgrade selectively the entire source package.

(A bug for restoring this exists already, but the number eludes me ATM)


Best regards

David Kalnischkies

#1121158#25
Date:
2025-11-22 20:05:25 UTC
From:
To:
Hi!

We have extensive CI that tests this upgrade (see previous messages
and links to CI) which simulates users who have installed something in
Debian Bookworm that depends on default-mysql-server. These CI tests
have been passing for years and started failing now due to a new
apt/resolver.

If this is the result of a new version of apt/bookworm or apt/forky I
don't know for sure, I guess that is something to debug as part of
this bug report.

This is a simplified case to reproduce the issue. The full CI code
runs`apt-get full-upgrade` to exactly simulate the case a end-user
would have, see CI code at
https://salsa.debian.org/mariadb-team/mariadb-server/-/blob/debian/latest/debian/salsa-ci.yml,
or read the CI logs linked to earlier, they show each command followed
by its output.

If may of course be that the CI has been running `apt-get
full-upgrade` wrongly for years and years, or that the package
depends/breaks relationships have been wrong for years and only now
surfaced as the resolver was "fixed" to no longer satisfy "wrong"
relationships, but I wouldn't jump to that conclusion just yet.

Also, even in the case that the resolver is now "correct", if there
are a large number of packages that depend on the old behaviour, the
new correct might still not be the optimal solution.

Assuming the apt changes were recent, let's see if other package
maintainers report similar issues that updates with virtual/indirect
packages no longer pull in what they used to.

#1121158#30
Date:
2025-11-23 12:24:52 UTC
From:
To:
Am Sat, Nov 22, 2025 at 12:05:25PM -0800, schrieb Otto Kekäläinen:

So, have you read what you want others to look at or … ?

If you had, you would have noticed that the CI test that failed uses
'apt install', also apparent by the "fix"¹ that was deployed for that
test to make it green, because green is good.
See e.g. https://salsa.debian.org/mariadb-team/mariadb-server/-/jobs/8622649#L1881

Never mind that many of the tests are testing entirely unsupported
setups – as skipping releases is not supported in Debian. But as long
as they are green, never mind what they actually test, I suppose.

¹ I at least would not expect users to write this monstrosity of an
  install command, but if you are set on not fixing your dependencies
  as suggested by Julian… oh well.

As mentioned, the old resolver implemented that behaviour since *drumroll
please* bookworm. So your test worked "for years and  years" just because
it was added right after apts default resolver tried to help users by
papering over insufficient dependencies.

This behaviour can be disabled in the old resolver (some users do) and
the old is far from the only solver used in the wild, e.g. aspcud for
experimental builds and by adventures users, aptitude, … which all do
not have this behaviour (as it has the obvious downside of pulling too
much into the upgrade set if the maintainer wrote sufficient deps).

Julian already said that he wants to add this user-protection feature
to the new resolver as well. But even if he does, any number of packages
that rely on it remain RC-buggy for declaring insufficient dependencies
and users that not use apt (and its default config) will continue to run
into problems with these packages.

APT behaviour is not a popularity contest. Never mind that by the time
this popularity contest would find traction is as explained earlier in
the forky to duke upgrade – so way too late if you don't want to
displease the stable release managers of forky and the release team
trying to release duke at that time around duke hard freeze.

Your problem is also not about "virtual packages" (see Debian policy
what that is) nor "indirect packages" (whatever that may be). Your
packages do not pull in what they need, period. That didn't change.
What changed is that apt was graciously papering over your bug by
assuming you meant to pull those into the upgrade set, too.

It currently doesn't anymore, maybe it does again by the time forky is
released. Until then users of non-defaults might even consider that an
apt feature as it directly helps them by having users with the defaults
run into the same problem they encounter.

As Julian already said, it might make sense to disable this behaviour in
tests if it is reintroduced.


Best regards

David Kalnischkies