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

Submitted by Laurentiu Palcu on March 27, 2014, 4:18 p.m.

Details

Message ID 2180ba438e8cd8179adddb576516cec516261f2f.1395933640.git.laurentiu.palcu@intel.com
State New
Headers show

Commit Message

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(-)

Patch hide | download patch | download mbox

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))

Comments

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))
>