Inside iter_owners, only cache a maximum of 25 dblink instances, in order
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Nov 2009 22:56:58 +0000 (22:56 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Nov 2009 22:56:58 +0000 (22:56 -0000)
to avoid potentially running out of memory.

svn path=/main/trunk/; revision=14815

pym/portage/dbapi/vartree.py

index 137e22f269325eaf451795481c9c5aa7fd01fd68..0be5632c1250618d8aaa82b4a0ad81c15cc87051 100644 (file)
@@ -48,6 +48,7 @@ from portage import _unicode_encode
 from portage.cache.mappings import slot_dict_class
 
 import codecs
+from collections import deque
 import re, shutil, stat, errno, copy, subprocess
 import logging
 import os as _os
@@ -1618,12 +1619,17 @@ class vardbapi(dbapi):
                        base_names = self._vardb._aux_cache["owners"]["base_names"]
 
                        dblink_cache = {}
+                       dblink_fifo = deque()
 
                        def dblink(cpv):
                                x = dblink_cache.get(cpv)
                                if x is None:
+                                       if len(dblink_fifo) >= 25:
+                                               # Ensure that we don't run out of memory.
+                                               del dblink_cache[dblink_fifo.popleft().mycpv]
                                        x = self._vardb._dblink(cpv)
                                        dblink_cache[cpv] = x
+                                       dblink_fifo.append(x)
                                return x
 
                        for path in path_iter: