Patchwork [1/1] package_manager.py: delete RPM db locks after calling rpmresolve

login
register
mail settings
Submitter Laurentiu Palcu
Date March 27, 2014, 4:18 p.m.
Message ID <2180ba438e8cd8179adddb576516cec516261f2f.1395933640.git.laurentiu.palcu@intel.com>
Download mbox | patch
Permalink /patch/69411/
State New
Headers show

Comments

Laurentiu Palcu - March 27, 2014, 4:18 p.m.
If the locks are not removed, the output of the next rpm command
executed will contain the following string:

rpmdb: BDB1540 configured environment flags incompatible with
existing environment

And this will create various parsing issues.

[YOCTO #6049]

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
---
 meta/lib/oe/package_manager.py |   12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)
Mark Hatle - March 27, 2014, 4:34 p.m.
On 3/27/14, 11:18 AM, Laurentiu Palcu wrote:
> If the locks are not removed, the output of the next rpm command
> executed will contain the following string:
>
> rpmdb: BDB1540 configured environment flags incompatible with
> existing environment

This usually means that RPM was not called with the same environment, or 
different version of RPM (or BerkleyDB) were used in the call.

We need to verify that the rpmresolve was using the proper (oe-built) version of 
RPM, librpm, python-rpm and not the host's version.

Assuming this is true, then I believe the change is safe.  Otherwise, we need to 
fix rpmresolve to use the correct set of libraries.

--Mark

> And this will create various parsing issues.
>
> [YOCTO #6049]
>
> Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
> ---
>   meta/lib/oe/package_manager.py |   12 +++++++++---
>   1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
> index 764ab72..0f22e46 100644
> --- a/meta/lib/oe/package_manager.py
> +++ b/meta/lib/oe/package_manager.py
> @@ -242,6 +242,12 @@ class RpmPkgsList(PkgsList):
>           self.ml_prefix_list, self.ml_os_list = \
>               RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var)
>
> +    def _unlock_rpm_db(self):
> +        # Remove rpm db lock files
> +        rpm_db_locks = glob.glob('%s/var/lib/rpm/__db.*' % self.rootfs_dir)
> +        for f in rpm_db_locks:
> +            bb.utils.remove(f, True)
> +
>       '''
>       Translate the RPM/Smart format names to the OE multilib format names
>       '''
> @@ -281,6 +287,8 @@ class RpmPkgsList(PkgsList):
>
>           try:
>               output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip()
> +
> +            self._unlock_rpm_db()
>           except subprocess.CalledProcessError as e:
>               bb.fatal("Cannot get the package dependencies. Command '%s' "
>                        "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output))
> @@ -299,9 +307,7 @@ class RpmPkgsList(PkgsList):
>               # bb.note(cmd)
>               tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
>
> -            rpm_db_locks = glob.glob('%s/var/lib/rpm/__db.*' % self.rootfs_dir)
> -            for f in rpm_db_locks:
> -                bb.utils.remove(f, True)
> +            self._unlock_rpm_db()
>           except subprocess.CalledProcessError as e:
>               bb.fatal("Cannot get the installed packages list. Command '%s' "
>                        "returned %d:\n%s" % (cmd, e.returncode, e.output))
>

Patch

diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index 764ab72..0f22e46 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -242,6 +242,12 @@  class RpmPkgsList(PkgsList):
         self.ml_prefix_list, self.ml_os_list = \
             RpmIndexer(d, rootfs_dir).get_ml_prefix_and_os_list(arch_var, os_var)
 
+    def _unlock_rpm_db(self):
+        # Remove rpm db lock files
+        rpm_db_locks = glob.glob('%s/var/lib/rpm/__db.*' % self.rootfs_dir)
+        for f in rpm_db_locks:
+            bb.utils.remove(f, True)
+
     '''
     Translate the RPM/Smart format names to the OE multilib format names
     '''
@@ -281,6 +287,8 @@  class RpmPkgsList(PkgsList):
 
         try:
             output = subprocess.check_output(cmd, stderr=subprocess.STDOUT).strip()
+
+            self._unlock_rpm_db()
         except subprocess.CalledProcessError as e:
             bb.fatal("Cannot get the package dependencies. Command '%s' "
                      "returned %d:\n%s" % (' '.join(cmd), e.returncode, e.output))
@@ -299,9 +307,7 @@  class RpmPkgsList(PkgsList):
             # bb.note(cmd)
             tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
 
-            rpm_db_locks = glob.glob('%s/var/lib/rpm/__db.*' % self.rootfs_dir)
-            for f in rpm_db_locks:
-                bb.utils.remove(f, True)
+            self._unlock_rpm_db()
         except subprocess.CalledProcessError as e:
             bb.fatal("Cannot get the installed packages list. Command '%s' "
                      "returned %d:\n%s" % (cmd, e.returncode, e.output))