On 02/11/2011 04:25 PM, seth vidal wrote:
On Fri, 2011-02-11 at 14:20 +0200, Panu Matilainen wrote:
Closing the rpmdb which has active iterators turns the iterators
into zombies that whose locks can only be freed when the process
terminates. Rpm is being a reckless mom...
---
  yum/rpmsack.py |    2 ++
  1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 0982a7c..24bb9ce 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -658,6 +658,7 @@ class RPMDBPackageSack(PackageSackBase):
                  po._has_hdr = False
                  del po.hdr
              self._cached_conflicts_data = result.values()
+            del mi

              if self.auto_close:
                  self.ts.close()
@@ -1276,6 +1277,7 @@ class RPMDBPackageSack(PackageSackBase):
                      break
              else:
                  ret.append(po)
+        del mi

          if self.auto_close:
              self.ts.close()

why do you have to specifically delete the match iterators?

Because with self.auto_close enabled, ts.close() destroys the transaction + db handle before the iterator falls out of scope. And when that happens, the iterator becomes a zombie which is hanging to locks but cannot be freed.

Quite obviously it should be rpm's responsibility (see http://rpm.org/ticket/820) but it's hardly going to get fixed for all the deployed rpm versions out there.

        - Panu -
_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to