dist-upgrade: usage of rpm in pre-/postinstall scripts

Panu Matilainen pmatilai at laiskiainen.org
Tue Jan 27 08:34:26 UTC 2009

On Mon, 26 Jan 2009, devzero2000 wrote:

> On Sat, Jan 24, 2009 at 2:45 PM, Alexander 'Leo' Bergolth
> <leo at strike.wu-wien.ac.at> wrote:
>       Hi!
>       When upgrading to Fedora 10, the newer Berkeley-DB version
>       used in F10
>       causes the following error messages after RPM itself has been
>       upgraded:
>       -------------------- 8< --------------------
>       rpmdb: Program version 4.5 doesn't match environment version
>       0.128
>       error: db4 error(-30972) from dbenv->open:
>       DB_VERSION_MISMATCH: Database
>       environment version mismatch
>       error: cannot open Packages index using db3 -  (-30972)
>       error: cannot open Packages database in /var/lib/rpm
>       -------------------- 8< --------------------
>       This is because some environment files (__db.00*) of the
>       rpm-database
>       remain from the previous version. To work around this error,
>       rpm has a
>       posttrans scriptlet that deletes those environment files:
>       -------------------- 8< --------------------
>       posttrans scriptlet (using /bin/sh):
>       # XXX this is klunky and ugly, rpm itself should handle this
>       dbstat=/usr/bin/db45_stat
>       if [ -x "$dbstat" ]; then
>          if "$dbstat" -e -h /var/lib/rpm 2>&1 | grep -q "doesn't
>       match
>       environment version \| Invalid argument"; then
>              rm -f /var/lib/rpm/__db.*
>          fi
>       fi
>       exit 0
>       -------------------- 8< --------------------
>       However, this scriptlet is called after the rpm transaction
>       has
>       finished, so any other rpm that follows the rpm-upgrade in
>       the same
>       transaction and that calls rpm inside one of its scriptlets
>       will produce
>       the error and the corresponding script will fail.
>       When doing a dist-upgrade, even when only upgrading rpm as a
>       first step,
>       the packages needed to satisfy the dependencies will cause
>       the above
>       error. (E.g. openldap-servers contains a call to "rpm -q" in
>       order to
>       check if the ldap-database needs to be migrated.)
>       Is there any workaround for this problem?
> IMHO, should be useful to patch RPM 4.6 (././lib/backend/db3.c db_init)
> for resolving this - old - issue. For RPM 4.4.2.x.x.x the patch is
> https://bugzilla.redhat.com/show_bug.cgi?id=464752
> (not applied anyway in Not hard to do in RPM 4.6 also.
> Sorry if isn't the workround you have asked.

Blindly blasting away the environment that provides the means for safe 
concurrent access (including protects the db from being accessed with 
incompatible DB version, ie the error message above) to the rpmdb when it 
happens to prevent access is not a solution at all IMO. When the 
underlying BDB gets upgraded, you have two versions of rpm, linked against 
different, potentially incompatible versions of BDB, accessing the rpmdb 
concurrently with all protection removed. Not good.

The only thing that can safely and reliably access the rpmdb across DB 
version upgrades, glibc futex implementation changes and the like, is the 
single process performing the transaction. This also means there's 
precisely one way scriptlets could reliably access the rpmdb, and that's 
the embedded Lua interpreter. As of 4.4.2.x and 4.6.0 the embedded Lua 
interpreter doesn't have access to rpmdb but there's work going on to 
change that. But no, there's no good workaround at the moment.

 	- Panu -

More information about the Rpm-list mailing list